Projektet virtio-nvgpu udvikler et virtio-enhed, der muliggør adgang til NVIDIA GPU'er fra gæstesystemer, der kører under KVM hypervisoren, med minimal tab af ydeevne. Det inkluderer en kernelmodul, der indlæses i gæstesystemet, og en virtio-enhed, der kører på værtsmiljøet. Koden til kernelmodulet er skrevet i C og distribueres under GPLv2-licensen, mens koden til virtio-enheden er skrevet i Rust og distribueres under Apache 2.0-licensen.
Udviklernes vurdering er, at tabet af ydeevne ved adgang til GPU ikke overstiger 2 %. Den høje hastighed opnås ved at omdirigere ioctl-opkald til den native NVIDIA-driver og arbejde på niveauet for NVIDIA-driverens ABI, uden at anmodninger oversættes på API-niveau. På gæstesystemets side anvendes de standardbiblioteker og højniveaudrivere fra NVIDIA, der kører i brugerens rum.
I gæstesystemet indlæses et kernelmodul, der giver enhedsfilerne /dev/nvidiactl, /dev/nvidia0…N, /dev/nvidia-uvm og sender ioctl() og mmap() anmodninger gennem virtqueue til en behandler på værtsmiljøet, der sender dem til den værstefører NVIDIA-driver. For at undgå kontekstskift mellem værtsystemet og den virtuelle maskine spejles kommandopufferne (mmap) i den delte hukommelse, der er tilgængelig for værtsmiljøet og GPU'en.
I modsætning til eksklusiv GPU throughput (VFIO Passthrough) leverer projektet virtio-nvgpu delt adgang til en enkelt GPU fra flere gæstesystemer, virtual machinesog i modsætning til virtio-gpu (Venus, VirGL) virker det via ABI throughput til NVIDIA-driveren og ikke på niveauet for oversættelse af grafiske API'er som Vulkan og OpenGL. Ulemperne ved virtio-nvgpu inkluderer manglen på fuld isolering baseret på IOMMU (gæstesystemer arbejder gennem NVIDIA-hostdriveren og er kun begrænset til filtrering af ioctl-opkald) og bindingen til NVIDIA-drivere ABI (ABI ændres i hver version og kræver tilpasning af virtio-nvgpu).
Kapaciteterne i virtio-nvgpu er tilstrækkelige til rendering, videokodning og beregninger ved hjælp af API'erne Vulkan, OpenGL, NVENC og CUDA. Den primære anvendelse nævnes som at skabe cloud-baserede spiltjenester eller virtuelle arbejdspladser, hvor et spil eller grafisk applikation kører i virtuelle maskiner, hvor rendering, hardwarekodning af resultatet via NVENC og overførsel af output til fjernbrugeren i form af en komprimeret videostream finder sted.
Kilde: opennet.ru
