OpenMP与OpenMP总是段错误

时间:2011-08-29 17:20:13

标签: multithreading opengl loops for-loop openmp

我的程序中有一个循环,用于填充带有像素的3D立方体(GL_POINTS),所以为了加快速度,我想我可以使用OpenMP并在我的多核处理器中分离这个for循环。

问题是,无论何时我在循环中使用OpenMP程序段错误,这里是循环的代码:

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 个答案:

答案 0 :(得分:5)

不要乱用一个OpenGL上下文和多线程,或者保护一个关键部分的每次使用OpenGL(这不会给你带来性能上的任何好处)。您可以做的是使用顶点数组/缓冲区(无论如何都会更快)并使用多个线程填充它们的数据,然后再在单个线程中绘制它。

如果一个线程设置当前颜色并在绘制顶点之前取消预定,会发生什么?但肯定会发生的是,驱动程序在某些操作过程中被中断,其内部数据完全混乱。

OpenGL绝对不是线程安全的。

相关问题