virtio-nvgpu - модуль для предоставления доступа к GPU NVIDIA из виртуальных машин KVM - QubStore

virtio-nvgpu — модуль для предоставления доступа к GPU NVIDIA из виртуальных машин KVM

Проект virtio-nvgpu создаёт virtio-устройство для доступа к GPU NVIDIA из гостевых систем под KVM с потерей производительности не выше 2%.

В основе решения лежат два компонента. Первый — модуль ядра, который загружается внутри гостевой машины. Второй — само virtio-устройство, работающее на стороне хоста. Модуль написан на Си и распространяется под GPLv2, а хостовая часть — на Rust под лицензией Apache 2.0.

Такой прирост скорости объясняется тем, что запросы не транслируются на уровне API. Вместо этого ioctl-вызовы перенаправляются напрямую к оригинальному драйверу NVIDIA, а работа идёт на уровне ABI этого драйвера. В гостевой системе при этом используются штатные библиотеки и высокоуровневые драйверы NVIDIA из пользовательского пространства. Модуль ядра создаёт файлы устройств /dev/nvidiactl, /dev/nvidia0…N и /dev/nvidia-uvm, а обращения ioctl() и mmap() уходят через virtqueue к обработчику на хосте, который передаёт их дальше драйверу NVIDIA. Чтобы избежать лишних переключений контекста между хостом и виртуальной машиной, буферы команд отражаются (mmap) в общую память, к которой имеют доступ и хост-окружение, и сам GPU.

От эксклюзивного проброса через VFIO Passthrough проект отличается тем, что даёт нескольким виртуальным машинам работать с одной видеокартой одновременно. А от virtio-gpu (Venus, VirGL) — тем, что пробрасывает ABI к драйверу NVIDIA, а не транслирует графические API вроде Vulkan и OpenGL.

Есть и слабые места. Полноценной изоляции на базе IOMMU нет: гостевые системы ходят через хостовый драйвер NVIDIA и защищены лишь фильтрацией ioctl-вызовов. Вдобавок решение завязано на ABI драйверов NVIDIA, а тот меняется с каждым релизом и требует адаптации virtio-nvgpu. Возможностей хватает для рендеринга, кодирования видео и вычислений через Vulkan, OpenGL, NVENC и CUDA. Главная сфера применения — облачные игровые сервисы и виртуальные рабочие места: игра или графическое приложение запускается в виртуальной машине, там же рендерится, результат аппаратно кодируется через NVENC и уходит удалённому пользователю в виде сжатого видеопотока.

Ссылка на основную публикацию