virtio-nvgpu es un proyecto experimental de código abierto que proporciona a una máquina virtual (VM) Linux un acceso inusualmente directo a una unidad de procesamiento gráfico (GPU) NVIDIA en el anfitrión. En vez de traducir cada comando de Vulkan u OpenGL, reenvía entre la VM y el anfitrión las solicitudes dirigidas al controlador de kernel de NVIDIA. Esto permite que el invitado ejecute los controladores de NVIDIA en modo de usuario, incluidas las mismas bibliotecas de Vulkan y NVENC utilizadas fuera de la VM.

Gráfico del proyecto virtio-nvgpu para el acceso casi nativo a GPU NVIDIA en máquinas virtuales KVM
La imagen del proyecto virtio-nvgpu identifica el dispositivo experimental para compartir GPU NVIDIA con VM Linux.github.com

El primer párrafo presenta virtio-nvgpu y su función de reenviar solicitudes del controlador de kernel de NVIDIA entre un invitado Linux y su anfitrión.

El diseño está orientado a la transmisión sin interfaz gráfica: un compositor dentro de la VM renderiza y codifica vídeo en la GPU, y después envía al cliente remoto únicamente el flujo de vídeo comprimido. En la prueba de referencia del proyecto en una RTX 3060, los fotogramas que tardaban al menos unos 2 milisegundos se situaron dentro de un 2 % del rendimiento nativo; una prueba de 12 segundos utilizó 0,37 segundos de CPU en el invitado, frente a 0,40 segundos en el anfitrión. El autor también ejecutó simultáneamente cuatro invitados con vkcube a 720p, cada uno codificando H.264 a 60 Hz, y la tasa combinada fue cercana a la de un solo invitado.

El mecanismo importa más que esas cifras por sí solas. El controlador del invitado transmite solicitudes de control mediante una virtqueue, mientras que las asignaciones de memoria permiten que el controlador de NVIDIA en modo de usuario envíe trabajo de renderizado sin cruzar el límite de la VM por cada llamada de dibujo. El dispositivo del lado del anfitrión traduce los parámetros de las solicitudes del controlador y asigna los identificadores del invitado a archivos de dispositivo del anfitrión. Esto difiere de la traducción a nivel de API, que debe serializar y reproducir muchas llamadas gráficas, y de dedicar una GPU completa a una sola VM.

La evidencia es limitada y proviene del propio README del proyecto. Cubre una única carga sintética, principalmente una RTX 3060 con el controlador 595.99.02; una RTX A2000 renderizó, pero no se evaluó en la prueba de referencia. El autor afirma que CUDA más allá de la enumeración no se ha probado, que no se han probado más de cuatro invitados y que se desconoce el comportamiento con ocho invitados. El ayudante aislado por invitado que tendría acceso real al dispositivo es solo una nota de diseño, por lo que el backend actual se ejecuta dentro del proceso del monitor de la máquina virtual.

La compatibilidad con controladores es otra limitación. La interfaz binaria de aplicaciones (ABI) del controlador de kernel de NVIDIA, es decir, el contrato binario utilizado por las solicitudes del controlador, cambia entre versiones. Por ello, virtio-nvgpu incluye perfiles explícitos para rangos seleccionados de controladores y rechaza cualquier versión anterior a 535.129.03, en vez de intentar adivinar una disposición desconocida de solicitudes. La promesa práctica es un uso eficiente de la GPU compartida para la transmisión, pero el README no demuestra aislamiento apto para producción, compatibilidad amplia con aplicaciones ni rendimiento más allá de sus pruebas limitadas.