Моя основная проблема заключается в том, что мне нужно одновременно запускать несколько исполняемых файлов OpenGL на экземпляре графического процессора EC2; Я наблюдаю недетерминированные ошибки при попытке сделать это. Та же программа отлично работает (с параллелизмом) на моем Macbook Pro.
Приложение работает следующим образом:
- python запускает несколько рабочих исполняемых файлов (т. е. одновременные вызовы
subprocess.call()
из пула потоковmultiprocessing.pool.ThreadPool
). Сценарий python предоставляет файл JSON в качестве входных данных рабочего процесса, а рабочий процесс записывает JSON в файл. - Каждая рабочая роль — это программа на C++, выполняющая некоторый рендеринг изображений в OpenGL с использованием фрагментных шейдеров и конвейера рендеринга в текстуру. Я пробовал использовать контексты рендеринга Glut и GLX.
Я уверен, что ни скрипт Python, ни рабочие C++ не имеют серьезных ошибок, потому что все приложение работает нормально, когда:
- запуск одного работника на экземпляре графического процессора EC2
- запуск одного или нескольких рабочих процессов на моем Macbook (OSX 10.7.4)
Конкретная ошибка, которую я наблюдаю, заключается в том, что один или несколько рабочих процессов будут segfault внутри вызова 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, но они тоже не помогают.
Я также ознакомился с FAQ по параллельной обработке с OpenGL: http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html Руководство предполагает, что многопоточный GLX в Ubuntu не работает (и я лично подтвердил это.. :), но кажется, что многопроцессорный GLX должен быть выполнимым и стабильным.
Есть ли у кого-нибудь идеи относительно
- почему вызовы OpenGL/GLX могут не работать? Действительно ли я вижу проблему с драйвером? Похоже, что драйверы графического процессора Mac имеют какую-то «магическую функцию», помогающую одновременному использованию OpenGL. Существуют ли какие-либо драйверы Ubuntu/Linux с такой же функцией?
- Существуют ли рекомендации по одновременному запуску нескольких исполняемых файлов OpenGL на экземпляре графического процессора EC2 (или на любом безголовом компьютере с Ubuntu/Linux, если на то пошло)? Может ли кто-нибудь указать мне на программное обеспечение с открытым исходным кодом, которое делает это?