我的研究实验室最近添加了一台具有强大NVIDIA显卡的服务器,我们希望用它来做科学计算。 由于它不是一个工作站,我们必须通过SSH连接远程运行我们的作业。 我们的大部分应用程序都需要对屏幕外缓冲区进行opengl渲染,然后对CUDA中的结果进行图像分析。
我最初的调查表明,X11转发是一个坏主意,因为opengl渲染将发生在客户机(或者更确切地说X11服务器 – 这是一个令人困惑的命名约定!),并将发送我们的海量纹理时遇到networking瓶颈。 我们将永远不需要显示输出,所以看起来像X11转发应该没有必要,但Opengl需要$ DISPLAY设置为有效的东西或我们的应用程序将不会运行。 我确信渲染农场是这样做的,但它是如何完成的? 我认为这可能是一个简单的X11configuration问题,但我太不熟悉它知道从哪里开始。
我们正在运行Ubuntu服务器10.04,没有安装gdm,gnome等。 但是,安装了xserver-xorg软件包。
我问这个问题已经有一段时间了,所以我想我会提到我们最终使用的解决scheme。
劫持本地X屏幕
最后,我只是在服务器的本地X屏幕上运行远程的opengl程序。 这台机器运行的是Ubuntu服务器版本,并没有运行默认的xserver,所以我不得不build立一个xserver在启动时运行(我刚安装了Ubuntu的ubuntu-desktop包,用大锤杀死蚊子),然后使用这些命令以root用户身份访问X屏幕:“export DISPLAY =:0.0; xhost + local:”。 然后我可以ssh进入机器,调用“export DISPLAY =:0.0”,然后正常运行我的opengl程序。 任何人坐在远程机器上都会看到一个窗口popup,看着我的程序正在运行,但是我们没有连接显示器,所以这不是问题。
使用某种forms的离屏渲染很重要,因为如果窗口被另一个窗口遮挡,直接从屏幕颜色缓冲区读取像素可能会导致垃圾数据。 既然你看不到X屏幕,很难知道这是否发生。 离屏渲染(例如Framebuffer对象(fbo)或者pbuffers)没有这个问题。
劫持服务器的本地Xscreen不是一个理想的解决scheme,所以这里有一些我一路上find的select:
虚拟帧缓冲器
Xvfb是一个选项,但是它并不适用于我,因为OpenGL并没有从硬件加速中受益,也不支持framebuffer对象,这对于CUDA与OpenGL的互操作性是必需的。 尽pipe如此,劫持本地屏幕是不可接受的,或者用户无法获得xhost权限的情况下,这可能是一个可行的select。
VirtualGL
从VirtualGL网站:
VirtualGL是一个开放源代码软件包,它使任何Unix或Linux远程显示软件都能够运行OpenGL应用程序,并具有全面的3D硬件加速function。
这正是我想要的,看起来非常有希望,但是我没有时间处理新的库依赖,所以我没有testing它。 我的猜测是,一旦我能够编译,安装和configuration,这是理想的解决scheme。 这就是VirtualBox和一些VNC服务器用来支持硬件加速的3D。
你可以在机器上运行一个vfb虚拟帧缓冲区,就像一个虚拟的X11。 我们曾经运行的应用程序,打开一个我们从来没有看过的Xwindow,只是安装vfb和$ DISPLAY出口 – 有点像屏幕上的cli HTH