Проект virtio-nvgpu развива виртуално устройство, което позволява достъп до GPU NVIDIA от гостуващи системи, работещи под управление на хипервизора KVM, с минимални загуби на производителност. Системата включва модул на ядро, който се зарежда в гостуващата система, и virtio-устройство, работещо на страната на хост-околната среда. Кодът на модула на ядрото е написан на C и се разпространява под лицензия 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 и предаване на изхода на отдалечен потребител под формата на компресиран видеопоток.
Източник: opennet.ru
