Projekt virtio-nvgpu razvija virtio uređaj koji omogućuje pristup NVIDIA GPU-ima s gostujućih sustava koji rade pod KVM hipervizorom uz minimalan utjecaj na performanse. Sastoji se od kernel modula učitanog u gostujući sustav i virtio uređaja koji radi na hostu. Kod kernel modula napisan je u C-u i licenciran pod GPLv2 licencom, dok je kod virtio uređaja napisan u Rustu i licenciran pod Apache 2.0 licencom.
Prema programerima, gubitak performansi pri pristupu GPU-u ne prelazi 2%. Visoke performanse postižu se preusmjeravanjem ioctl poziva na izvorni NVIDIA upravljački program i radom na ABI razini NVIDIA upravljačkog programa, bez prevođenja zahtjeva na API razini. Na strani gosta koriste se izvorne biblioteke i NVIDIA upravljački programi visoke razine koji se izvode u korisničkom prostoru.
U gostujući sustav učitava se kernel modul. On pruža datoteke uređaja /dev/nvidiactl, /dev/nvidia0…N i /dev/nvidia-uvm te usmjerava pozive ioctl() i mmap() kroz virtqueue do rukovatelja na host okruženju, koji ih prosljeđuje NVIDIA host upravljačkom programu. Kako bi se izbjegle promjene konteksta između host sustava i virtualnog stroja, međuspremnici naredbi mapiraju se (mmapped) u dijeljenu memoriju kojoj mogu pristupiti host okruženje i GPU.
Za razliku od ekskluzivnog prolaza pristupa GPU-u (VFIO prolaz), projekt virtio-nvgpu omogućuje dijeljeni pristup jednom GPU-u iz nekoliko virtualni strojevi, i za razliku od virtio-gpu (Venus, VirGL), radi putem ABI prolaza do NVIDIA upravljačkog programa, a ne na razini prijevoda Vulkan i OpenGL grafičkog API-ja. Nedostaci virtio-nvgpu uključuju nedostatak potpune izolacije temeljene na IOMMU-u (gostujući sustavi rade putem NVIDIA upravljačkog programa glavnog računala i ograničeni su na filtriranje ioctl poziva) i oslanjanje na ABI NVIDIA upravljačkog programa (ABI se mijenja sa svakom verzijom, što zahtijeva prilagodbu virtio-nvgpu).
Mogućnosti virtio-nvgpu su dovoljne za renderiranje, kodiranje videa i računanje pomoću Vulkan, OpenGL, NVENC i CUDA API-ja. Primarna navedena primjena je stvaranje usluga igranja u oblaku ili virtualnih desktopa gdje se igra ili grafička aplikacija pokreće u virtualni stroj, koji izvodi renderiranje, hardversko kodiranje rezultata pomoću NVENC-a i prijenos izlaza udaljenom korisniku u obliku komprimiranog video streama.
Izvor: opennet.ru
