Mon laboratoire de recherche a récemment ajouté un serveur doté d'une carte graphique NVIDIA robuste, que nous aimerions utiliser pour effectuer des calculs scientifiques. Comme il ne s'agit pas d'un poste de travail, nous devrons exécuter nos travaux à distance, via une connexion ssh. La plupart de nos applications nécessitent un rendu opengl sur un tampon hors écran, puis une analyse d'image sur le résultat dans CUDA.
Mon enquête initiale suggère que le transfert X11 est une mauvaise idée, car le rendu opengl se produira sur la machine cliente (ou plutôt le serveur X11 - quelle convention de dénomination déroutante!) Et souffrira de goulots d'étranglement du réseau lors de l'envoi de nos textures massives. Nous n'aurons jamais besoin d'afficher la sortie, il semble donc que le transfert X11 ne devrait pas être nécessaire, mais Opengl a besoin que $ DISPLAY soit défini sur quelque chose de valide ou nos applications ne fonctionneront pas. Je suis sûr que des fermes de rendu existent pour cela, mais comment cela se fait-il? Je pense que c'est probablement un simple problème de configuration X11, mais je ne le connais pas trop pour savoir par où commencer.
Nous exécutons le serveur Ubuntu 10.04, sans gdm, gnome, etc. installé. Cependant, le package xserver-xorg est installé.
la source
Réponses:
Cela fait un moment que je n'ai pas posé cette question, j'ai donc pensé mentionner la solution que nous avons finalement utilisée.
Détournement de l'écran X local
Au final, je viens d'exécuter les programmes opengl à distance sur l'écran X local du serveur. La machine exécutait l'édition du serveur Ubuntu et il n'exécutait pas de serveur x par défaut, j'ai donc dû configurer un serveur x pour qu'il s'exécute au démarrage (je viens d'installer le paquet ubuntu-desktop d'Ubuntu, tuant un moustique avec un marteau), puis me donne accès à l'écran X en utilisant ces commandes en tant que root: "export DISPLAY =: 0.0; xhost + local:". Ensuite, je pouvais ssh dans la machine, appeler "export DISPLAY =: 0.0" et ensuite exécuter mes programmes opengl comme d'habitude. Toute personne assise sur la machine distante verrait une fenêtre pop-up et regarder mon programme en cours d'exécution, mais nous n'avons pas de moniteur connecté, donc ce n'était pas un problème.
Il est important d'utiliser une forme de rendu hors écran, car la lecture des pixels directement à partir du tampon de couleurs à l'écran peut entraîner des données inutiles si la fenêtre est masquée par une autre fenêtre. Comme vous ne pouvez pas voir l'écran X, il est difficile de savoir si cela s'est produit. Le rendu hors écran (par exemple les objets Framebuffer (fbo) ou pbuffers) n'a pas ce problème.
Le détournement de l'écran X local du serveur n'est pas une solution idéale, alors voici quelques alternatives que j'ai trouvées en cours de route:
Framebuffers virtuels
Xvfb est une option, mais cela n'a pas fonctionné pour moi, car OpenGL ne bénéficiait pas de l'accélération matérielle et les objets framebuffer n'étaient pas pris en charge, ce qui est nécessaire pour l'interopérabilité de CUDA avec OpenGL. Néanmoins, cela pourrait être une option réalisable où le détournement de l'écran local n'est pas acceptable, ou où l'utilisateur ne peut pas obtenir les privilèges xhost.
VirtualGL
Depuis le site Web VirtualGL:
C'est exactement ce que je veux, et cela semble très prometteur, mais je n'ai pas eu le temps de gérer une nouvelle dépendance de bibliothèque, donc je ne l'ai pas testée. Je suppose que c'est la solution idéale une fois que je peux la compiler, l'installer et la configurer. C'est ce que VirtualBox et certains serveurs VNC utilisent pour prendre en charge la 3D accélérée par matériel.
la source
vous pouvez exécuter un tampon de trame virtuelle vfb sur la machine, c'est comme un X11 factice. Nous avions l'habitude d'exécuter des applications qui devaient ouvrir une Xwindow que nous n'avions jamais regardée et juste installé vfb et exporter $ DISPLAY vers cela - un peu comme l'écran sur le cli HTH
la source