Многопроцессорная безголовая обработка OpenGL на экземплярах графического процессора EC2

Моя основная проблема заключается в том, что мне нужно одновременно запускать несколько исполняемых файлов 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, если на то пошло)? Может ли кто-нибудь указать мне на программное обеспечение с открытым исходным кодом, которое делает это?

person user2543994    schedule 02.07.2013    source источник


Ответы (1)


.. 1 год спустя ..

Я обнаружил, что во многих случаях графический процессор не включается на безголовых машинах. попробуйте сначала vnc и посмотрите, поможет ли это.

person ggez44    schedule 12.06.2014