Mi laboratorio de investigación agregó recientemente un servidor que tiene una tarjeta gráfica NVIDIA robusta, que nos gustaría usar para hacer cálculos científicos. Como no es una estación de trabajo, tendremos que ejecutar nuestros trabajos de forma remota, a través de una conexión ssh. La mayoría de nuestras aplicaciones requieren renderizar opengl en un búfer fuera de la pantalla, luego hacer análisis de imagen en el resultado en CUDA.
Mi investigación inicial sugiere que el reenvío de X11 es una mala idea, porque la representación de opengl ocurrirá en la máquina del cliente (o más bien en el servidor X11, ¡qué convención de nomenclatura confusa!) Y sufrirá cuellos de botella en la red al enviar nuestras texturas masivas. Nunca necesitaremos mostrar la salida, por lo que parece que el reenvío X11 no debería ser necesario, pero Opengl necesita que $ DISPLAY se configure como algo válido o nuestras aplicaciones no se ejecutarán. Estoy seguro de que existen granjas de render que hacen esto, pero ¿cómo se logra? Creo que este es probablemente un simple problema de configuración de X11, pero no estoy familiarizado con él para saber por dónde empezar.
Estamos ejecutando el servidor Ubuntu 10.04, sin gdm, gnome, etc. instalado. Sin embargo, el paquete xserver-xorg está instalado.
fuente
Respuestas:
Ha pasado un tiempo desde que hice esta pregunta, así que pensé en mencionar la solución que finalmente utilizamos.
Secuestro de la pantalla X local
Al final, acabo de ejecutar los programas de opengl remotos en la pantalla X local del servidor. La máquina ejecutaba la edición del servidor Ubuntu y no ejecutaba un servidor x por defecto, así que tuve que configurar un servidor x para que se ejecute al inicio (acabo de instalar el paquete ubuntu-escritorio de Ubuntu, matando a un mosquito con un martillo), y luego Me di acceso a la pantalla X usando estos comandos como root: "export DISPLAY =: 0.0; xhost + local:". Entonces podría ingresar a la máquina, llamar a "export DISPLAY =: 0.0" y luego ejecutar mis programas opengl de manera normal. Cualquiera que esté sentado en la máquina remota vería una ventana emergente y vería mi programa en ejecución, pero no tenemos un monitor conectado, así que esto no fue un problema.
Es importante utilizar alguna forma de representación fuera de pantalla, porque leer píxeles directamente desde el búfer de color en pantalla podría generar datos basura si la ventana queda oculta por otra ventana. Como no puede ver la pantalla X, es difícil saber si esto ha sucedido. El renderizado fuera de pantalla (por ejemplo, objetos Framebuffer (fbo) o pbuffers) no tiene este problema.
Secuestrar el Xscreen local del servidor no es una solución ideal, así que aquí hay algunas alternativas que encontré en el camino:
Framebuffers virtuales
Xvfb es una opción, pero no funcionó para mí, porque OpenGL no se estaba beneficiando de la aceleración de hardware, y los objetos framebuffer no eran compatibles, lo cual es necesario para la interoperabilidad de CUDA con OpenGL. Sin embargo, esta podría ser una opción viable donde el secuestro de la pantalla local no es aceptable, o donde el usuario no puede obtener privilegios de xhost.
VirtualGL
Desde el sitio web de VirtualGL:
Esto es exactamente lo que quiero, y parece muy prometedor, pero no tuve tiempo para lidiar con una nueva dependencia de la biblioteca, por lo que no la he probado. Supongo que esta es la solución ideal una vez que pueda compilarlo, instalarlo y configurarlo. Esto es lo que usan VirtualBox y algunos servidores VNC para soportar 3D acelerado por hardware.
fuente
puede ejecutar un búfer de trama virtual vfb en la máquina, es como un simulador X11. Solíamos ejecutar aplicaciones que TENÍAN que abrir una ventana X que nunca vimos y simplemente instalamos vfb y exportamos $ DISPLAY a eso, algo así como la pantalla en el cli HTH
fuente