Contexte et principe
Le projet virtio-nvgpu propose un dispositif virtio capable de transmettre les appels d’ioctl du pilote noyau NVIDIA entre un invité Linux KVM et l’hôte, au niveau de l’ABI du pilote. Cette approche évite toute traduction au niveau de l’API, ce qui permet à l’invité d’exécuter les pilotes utilisateurs NVIDIA d’origine, y compris Vulkan et NVENC, sans modification.
Architecture et mécanisme de transfert
Le module noyau de l’invité (driver/, licence GPL‑2.0) crée les périphériques /dev/nvidia* et redirige les ioctl ainsi que les mmap via une virtqueue. Le côté hôte (device/, licence Apache‑2.0) expose les mêmes symboles du pilote NVIDIA et partage la mémoire mappée directement avec l’invité. Ainsi, le pilote utilisateur de l’invité soumet des commandes à la même zone mémoire que le pilote hôte, éliminant tout coût de copie supplémentaire.
registers /dev/nvidia* , forwards ioctl and mmap over the virtqueue.Benchmarks et performances
Les mesures ont été réalisées sur une RTX 3060 avec le pilote version 595.99.02. Un chargeur Vulkan headless identique a été exécuté en natif et dans l’invité. Le temps moyen d’une trame dans l’invité était de 39 ms, soit -0.4 % par rapport au métal, la différence restant dans le bruit de mesure. Le coût d’un réveil du GPU était d’environ 0.02 ms, et l’overhead d’une trame très courte (<2 ms) atteignait +40 % mais restait négligeable pour les charges typiques de jeux (>2 ms par trame).
En termes d’utilisation CPU, sur 12 s d’exécution à ~100 fps, l’hôte natif a consommé 0.40 s CPU contre 0.37 s pour l’invité, démontrant que le passage du rendu ne génère pas de surcharge notable. Sur 813 691 trames, le backend a traité 13 792 messages, soit un crossing moyen toutes les 59 trames, principalement lors de la configuration du dispositif.
Le scaling multi‑invité a été testé avec quatre VM simultanées sur la même RTX 3060. Chaque VM affichait 25.8‑26.5 fps, soit un total de 103.7 fps, quasiment identique à la performance d’une seule VM (102.9 fps). La répartition du temps de trame était uniforme à quatre décimales, indiquant une partage équitable des ressources GPU.
Limites et perspectives
Les tests actuels ne dépassent pas quatre invités ni des charges supérieures à vkcube en 720p. Aucun benchmark n’a été réalisé avec huit invités ou avec des charges plus lourdes (ex. rendu 4K). Le support CUDA est limité à l’énumération ; la transmission d’opérations CUDA n’a pas été validée. Les profils ABI fournis couvrent les versions 535.129.03, 580.178.04 et 595.71.05 ; les pilotes antérieurs sont rejetés. Un A2000 avec le pilote 615.71.09 a pu rendre, mais aucune donnée de performance n’est disponible. Le « jailer », la gestion de versions de pilotes multiples et l’enveloppe multi‑locataire restent à implémenter.