Projekat virtio-nvgpu razvija virtio uređaj koji omogućava pristup NVIDIA GPU iz gostujućih sistema pokrenutih pod hipervizorom KVM, uz minimalne gubitke performansi. Uključuje modul jezgra koji se učitava u gostujućem sistemu i virtio uređaj koji se izvršava na strani host okruženja. Kod modula jezgra je napisan na C jeziku i distribuira se pod GPLv2 licencom, dok je kod virtio uređaja napisan na Rust jeziku i distribuira se pod Apache 2.0 licencom.
Prema procenama programera, gubitak performansi pri pristupu GPU ne prelazi 2%. Visoka brzina rada se postiže preusmeravanjem ioctl poziva ka nativnom NVIDIA drajveru i radom na nivou NVIDIA drajverskog ABI, bez prevođenja zahteva na API nivou. Na strani gostujućeg sistema se koriste standardne biblioteke i visoko nivo drajveri NVIDIA koji rade u korisničkom prostoru.
U gostujućem sistemu se učitava modul jezgra koji obezbeđuje uređajske fajlove /dev/nvidiactl, /dev/nvidia0…N, /dev/nvidia-uvm i prosleđuje pozive ioctl() i mmap() kroz virtqueue ka handler-u na strani host okruženja, koji ih prosleđuje nativnom NVIDIA drajveru. Da bi se izbeglo prebacivanje konteksta između host sistema i virtuelne mašine, komande se odražavaju (mmap) u zajedničku memoriju dostupnu host okruženju i GPU-u.
Za razliku od ekskluzivnog prosleđivanja pristupa GPU-u (VFIO Passthrough), projekat virtio-nvgpu omogućava zajednički pristup jednom GPU-u iz više sistema. virtualnih naprav, a za razliku od virtio-gpu (Venus, VirGL), funkcionira prenošenjem ABI ka NVIDIA drajveru, a ne na nivou prevođenja grafičkih API-ja Vulkan i OpenGL. Nedostaci virtio-nvgpu su nedostatak potpune izolacije zasnovane na IOMMU (gostujući sistemi rade kroz nativni NVIDIA drajver i ograničeni su samo filtriranjem ioctl poziva) i vezanost za NVIDIA drajverski ABI (ABI se menja u svakoj verziji i zahteva prilagođavanje virtio-nvgpu).
Mogućnosti virtio-nvgpu su dovoljne za renderovanje, kodiranje videa i izračunavanja korišćenjem API-ja Vulkan, OpenGL, NVENC i CUDA. Kao glavna oblast primene navodi se kreiranje oblačnih gejmerskih usluga ili virtuelnih radnih mesta, u kojima se igra ili grafička aplikacija pokreće u virtualni napravi, v kateri se izvaja upodabljanje, strojno kodiranje rezultata s pomočjo NVENC in prenos izhoda oddaljenemu uporabniku v obliki stisnjenega video toka.
Izvor: opennet.ru
