OpenGL с OpenMP всегда segfault - PullRequest
3 голосов
/ 29 августа 2011

В моей программе есть цикл, который будет заполнять 3D-куб пикселями (GL_POINTS), поэтому, чтобы немного ускорить процесс, я решил использовать OpenMP и отделить его для цикла в моем многоядерном процессоре.

Проблема в том, что всякий раз, когда я использую OpenMP в цикле программы segfaults, вот код цикла:

glBegin(GL_POINTS);
#pragma omp parallel for
for (int a = 0; a < m_width * m_height; a++)
{
    uint8_t r, g, b;
    r = m_data[a * m_channels];
    g = m_data[a * m_channels + 1];
    b = m_data[a * m_channels + 2];

    glColor3ub(r, g, b);
    glVertex3f(r / 255.0 - 0.5, g / 255.0 - 0.5, b / 255.0 - 0.5);
}
glEnd();

Как видите, код просто получает некоторую информацию из массива m_dataи затем вызовите glColor3ub и glVertex3f вместе с ним, если я запускаю этот код без #pragma, код работает отлично.

GDB показывает мне, что программа вызывает ошибки при достижении glColor3ub, давая понять, что проблема в чем-тос openGL, может быть, функция не является потокобезопасной?Можно ли что-то сделать, чтобы исправить код?

1 Ответ

5 голосов
/ 29 августа 2011

Не связывайтесь с одним контекстом OpenGL и многопоточностью, и не следите за каждым использованием OpenGL критической секцией (которая ничего не даст вам в плане производительности).Вероятно, вы можете использовать массивы / буферы вершин (которые в любом случае будут быстрее) и заполнить их данными, используя несколько потоков, прежде чем рисовать их в одном потоке.

Что должно произойти, если один поток устанавливает текущий цвет истановится внеплановым, прежде чем он рисует вершину?Но что определенно произойдет, так это то, что драйвер прерывается в середине какой-то операции, а его внутренние данные полностью испорчены.

OpenGL определенно не безопасен для потоков.

...