我的核心问题是我需要在一个 EC2 GPU 实例上同时运行多个 OpenGL 可执行文件;尝试执行此操作时,我正在观察不确定的段错误。相同的程序在我的 Macbook Pro 上运行良好(并发)。
该应用程序的工作原理如下:
- python 脚本启动多个工作程序可执行文件(即来自线程池的并发
subprocess.call()
调用multiprocessing.pool.ThreadPool
)。python 脚本提供一个 JSON 文件作为 worker 输入,worker 将 JSON 写入文件。 - 每个 worker 都是一个 C++ 程序,它使用片段着色器和渲染到纹理管道在 OpenGL 中进行一些无头图像渲染。我尝试过同时使用 Glut 和 GLX 渲染上下文。
我相信 python 脚本和 C++ 工作者都没有重大错误,因为整个应用程序在以下情况下运行良好:
- 在 EC2 GPU 实例上运行单个工作器
- 在我的 Macbook (OSX 10.7.4) 上运行一名或多名工作人员
我观察到的具体错误是,在执行几分钟后,一个或多个工作人员将在 OpenGL 调用(例如glTexSubImage2D
,等)中出现段错误。glDrawElements
有时我会在 GLX 上下文设置阶段看到失败(例如glXCreateNewContext
或glXChooseFBConfig
)。如果我启动更多的工人(即更高的并发性),我会更快地看到错误。如果我启动较少的工人,则可能需要 15-30 分钟才能发生崩溃。
我相信我遇到了某种 OpenGL 上下文或驱动程序问题。我尝试使用 GLUT 和 GLX 设置我的上下文,但似乎都没有帮助。
我创建 EC2 实例的过程非常接近此处给出的说明:http: //hpc.nomad-labs.com/archives/139。我安装的具体包是:
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libegl1-mesa libglu1-mesa-dev mesa-utils mesa-utils-extra llvm-dev imagemagick libboost-all-dev python2.6 python-imaging python-matplotlib python-numpy python-scipy firefox clang python-setuptools python-scipy libatlas-dev ccache libpng12-dev libmagick++-dev glew-utils xvfb x11-utils qiv xinit
在 OSX 和 Linux 上,C++ 工作者链接:GL GLU glut pthread m X11
.
我生成了我的 xorg.conf 使用:
$ nvidia-xconfig -a --use-display-device=None --virtual=1280x1024
在运行我的程序之前,我运行:
$ startx &; export DISPLAY=:0
我尝试了一些非 nvidia 驱动程序,但它们似乎也没有帮助。
我还查阅了有关使用 OpenGL 进行并行处理的常见问题解答:http: //www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html 该指南建议 Ubuntu 上的多线程 GLX 不起作用(我已经亲自确认了这一点.. :) 但似乎多进程 GLX 应该是可行且稳定的。
有没有人有任何想法
- 为什么 OpenGL/GLX 调用可能会失败?我确实看到了驱动程序问题吗?似乎 Mac GPU 驱动程序具有某种“神奇功能”来帮助并发使用 OpenGL。是否有任何具有相同功能的 Ubuntu/Linux 驱动程序?
- 是否有在 EC2 GPU 实例(或任何无头 Ubuntu/Linux 机器上)同时运行多个 OpenGL 可执行文件的最佳实践?谁能指出我这样做的开源软件?