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

Проект 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 к обработчику на стороне хост-окружения, который передаёт их хостовому драйверу NVIDIA. Для избавления от переключений контекста между хостовой системой и виртуальной машиной буферы команд отражаются (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 и передача вывода удалённому пользователю в форме сжатого видеопотока.

Источник: http://www.opennet.ru/opennews/art.shtml?num=66344