Mein Forschungslabor hat kürzlich einen Server mit einer leistungsstarken NVIDIA-Grafikkarte hinzugefügt, mit der wir wissenschaftliche Berechnungen durchführen möchten. Da es sich nicht um eine Workstation handelt, müssen wir unsere Jobs über eine SSH-Verbindung remote ausführen. Die meisten unserer Anwendungen erfordern OpenGL-Rendering in einem Offscreen-Puffer und anschließend eine Bildanalyse des Ergebnisses in CUDA.
Meine erste Untersuchung ergab, dass die X11-Weiterleitung eine schlechte Idee ist, da das OpenGL-Rendering auf dem Client-Computer (oder besser gesagt auf dem X11-Server - was für eine verwirrende Namenskonvention!) Stattfindet und beim Senden unserer massiven Texturen unter Netzwerktengpässen leidet. Wir werden die Ausgabe niemals anzeigen müssen, daher scheint es, dass eine X11-Weiterleitung nicht erforderlich sein sollte, aber Opengl benötigt das $ DISPLAY, um auf etwas Gültiges gesetzt zu werden, oder unsere Anwendungen werden nicht ausgeführt. Ich bin sicher, dass es Renderfarmen gibt, die dies tun, aber wie wird dies erreicht? Ich denke, dies ist wahrscheinlich ein einfaches X11-Konfigurationsproblem, aber ich bin damit nicht vertraut, um zu wissen, wo ich anfangen soll.
Wir verwenden Ubuntu Server 10.04, ohne dass GDM, Gnome usw. installiert sind. Das xserver-xorg-Paket ist jedoch installiert.
quelle
Antworten:
Es ist schon eine Weile her, dass ich diese Frage gestellt habe, also dachte ich, ich würde die Lösung erwähnen, die wir letztendlich verwendet haben.
Entführung des lokalen X-Bildschirms
Am Ende habe ich nur die Remote-OpenGL-Programme auf dem lokalen X-Bildschirm des Servers ausgeführt. Auf dem Computer wurde die Ubuntu-Server-Edition ausgeführt, und es wurde standardmäßig kein xserver ausgeführt. Daher musste ich beim Start einen xserver einrichten (ich habe gerade Ubuntus Ubuntu-Desktop-Paket installiert und eine Mücke mit einem Vorschlaghammer getötet) gab mir Zugriff auf den X-Bildschirm mit diesen Befehlen als root: "export DISPLAY =: 0.0; xhost + local:". Dann könnte ich ssh in die Maschine, "export DISPLAY =: 0.0" aufrufen und dann meine opengl-Programme wie gewohnt ausführen. Jeder, der am Remote-Computer sitzt, sieht ein Fenster und sieht, wie mein Programm ausgeführt wird. Wir haben jedoch keinen Monitor angeschlossen, sodass dies kein Problem darstellt.
Es ist wichtig, eine Form des Offscreen-Renderns zu verwenden, da das Lesen von Pixeln direkt aus dem Bildschirmfarbpuffer zu Mülldaten führen kann, wenn das Fenster durch ein anderes Fenster verdeckt wird. Da Sie den X-Bildschirm nicht sehen können, ist es schwierig zu wissen, ob dies geschehen ist. Offscreen-Rendering (z. B. Framebuffer-Objekte (fbo) oder pbuffer) hat dieses Problem nicht.
Die Entführung des lokalen Xscreen des Servers ist keine ideale Lösung. Hier sind einige Alternativen, die ich auf dem Weg gefunden habe:
Virtuelle Framebuffer
Xvfb ist eine Option, aber es hat bei mir nicht funktioniert, da OpenGL nicht von der Hardwarebeschleunigung profitierte und Framebuffer-Objekte nicht unterstützt wurden, die für die CUDA-Interoperabilität mit OpenGL erforderlich sind. Dies kann jedoch eine praktikable Option sein, wenn die Entführung des lokalen Bildschirms nicht akzeptabel ist oder wenn Benutzer keine xhost-Berechtigungen erhalten können.
VirtualGL
Von der VirtualGL-Website:
Dies ist genau das, was ich will, und es sieht sehr vielversprechend aus, aber ich hatte keine Zeit, mich mit einer neuen Bibliotheksabhängigkeit zu befassen, also habe ich sie nicht getestet. Ich vermute, dass dies die ideale Lösung ist, sobald ich sie kompilieren, installieren und konfigurieren kann. Dies ist, was VirtualBox und einige VNC-Server verwenden, um hardwarebeschleunigtes 3D zu unterstützen.
quelle
Sie können einen virtuellen vfb-Frame-Puffer auf dem Computer ausführen, der einem Dummy X11 ähnelt. Früher haben wir Apps ausgeführt, die ein Xwindow öffnen mussten, das wir uns nie angesehen haben, und nur vfb installiert und $ DISPLAY darauf exportiert - ein bisschen wie ein Bildschirm auf dem cli HTH
quelle