Проект virtio-nvgpu розвиває virtio-пристрій, що дозволяє отримати доступ до GPU NVIDIA із гостьових систем, запущених під керуванням гіпервізора KVM, з мінімальною втратою продуктивності. До складу входить модуль ядра, що завантажується в гостьовій системі та virtio-пристрій, що виконується на стороні хост-оточення. Код модуля ядра написаний мовою Сі і розповсюджується під ліцензією GPLv2, а код virtio-пристрою написаний на Rust і розповсюджується під ліцензією Apache 2.0.
За оцінкою розробників, втрата продуктивності при доступі до GPU не перевищує 2%. Висока швидкість роботи досягається завдяки перенаправленню ioctl-дзвінків до рідного драйвера NVIDIA та роботи на рівні ABI драйвера NVIDIA, без трансляції запитів на рівні API. На стороні гостьової системи застосовуються штатні бібліотеки та високорівневі драйвери NVIDIA, що працюють у просторі користувача.
У гостьовій системі завантажується модуль ядра, який надає файли пристроїв /dev/nvidiactl, /dev/nvidia0…N, /dev/nvidia-uvm і прокидає звернення ioctl() і mmap() через virtqueue до оброблювача на стороні хост-оточення, який передає їх. Для позбавлення від перемикань контексту між хостовою системою та віртуальною машиною буфери команд відображаються (mmap) у загальну пам'ять, доступну хост-оточенню та GPU.
На відміну від ексклюзивного прокидання доступу до GPU (VFIO Passthrough) проект virtio-nvgpu забезпечує спільний доступ до одного GPU з декількох віртуальних машин, а на відміну від virtio-gpu (Venus, VirGL) працює через прокидання ABI до драйвера NVIDIA, а не на рівні трансляції графічних API Vulkan та OpenGL. Мінусами virtio-nvgpu є відсутність повноцінної ізоляції на базі IOMMU (гостяні системи працюють через хостовий драйвер NVIDIA та обмежуються лише фільтрацією ioctl-викликів) та прив'язка до ABI драйверів NVIDIA (ABI змінюється у кожній версії та вимагає адаптації virtio-nvgpu).
Можливостей virtio-nvgpu достатньо для рендерингу, кодування відео та обчислень за допомогою API Vulkan, OpenGL, NVENC та CUDA. Як основна сфера застосування згадується створення хмарних ігрових сервісів або віртуальних робочих місць, в яких гра або графічний додаток запускається в віртуальній машині, В якій здійснюється рендеринг, апаратне кодування результату за допомогою NVENC і передача виведення видаленому користувачеві у формі стисненого відеопотоку.
Джерело: opennet.ru
