Projektet virtio-nvgpu utvecklar en virtio-enhet som möjliggör åtkomst till NVIDIA-grafikprocessorer från gästsystem som körs under KVM-hypervisorn med minimal prestandapåverkan. Den består av en kärnmodul laddad i gästsystemet och en virtio-enhet som körs på värden. Kärnmodulkoden är skriven i C och licensierad under GPLv2, medan virtio-enhetskoden är skriven i Rust och licensierad under Apache 2.0-licensen.
Enligt utvecklarna överstiger prestandaförlusten vid åtkomst till GPU:n inte 2 %. Hög prestanda uppnås genom att omdirigera ioctl-anrop till den inbyggda NVIDIA-drivrutinen och arbeta på NVIDIA-drivrutinens ABI-nivå, utan att översätta förfrågningar på API-nivå. På gästsidan används inbyggda bibliotek och NVIDIA-drivrutiner på hög nivå som körs i användarutrymmet.
En kärnmodul laddas i gästsystemet. Den tillhandahåller enhetsfilerna /dev/nvidia-tl, /dev/nvidia0…N och /dev/nvidia-uvm och dirigerar ioctl()- och mmap()-anrop genom en virtqueue till en hanterare i värdmiljön, som skickar dem vidare till NVIDIA-värddrivrutinen. För att undvika kontextväxlingar mellan värdsystemet och den virtuella maskinen mappas (mmappas) kommandobuffertar till delat minne som är tillgängligt för värdmiljön och GPU:n.
Till skillnad från exklusiv GPU-åtkomstgenomströmning (VFIO-genomströmning) ger virtio-nvgpu-projektet delad åtkomst till en GPU från flera virtuell maskin, och till skillnad från virtio-gpu (Venus, VirGL), fungerar den via ABI-genomströmning till NVIDIA-drivrutinen, snarare än på Vulkan- och OpenGL-grafik-API-översättningsnivå. Nackdelarna med virtio-nvgpu inkluderar avsaknaden av fullständig IOMMU-baserad isolering (gästsystem fungerar via NVIDIA-värddrivrutinen och är begränsade till att filtrera ioctl-anrop) och dess beroende av NVIDIA-drivrutinens ABI (ABI ändras med varje version, vilket kräver anpassning av virtio-nvgpu).
virtio-nvgpu:s funktioner är tillräckliga för rendering, videokodning och databehandling med hjälp av Vulkan-, OpenGL-, NVENC- och CUDA-API:erna. Den primära tillämpningen som nämns är skapandet av molnbaserade speltjänster eller virtuella skrivbord där ett spel eller en grafikapplikation körs i virtuell maskin, som utför rendering, hårdvarukodning av resultatet med NVENC och överföring av utdata till fjärranvändaren i form av en komprimerad videoström.
Källa: opennet.ru
