gpt4 book ai didi

multithreading - 带有 OpenMP 的 OpenGL 总是出现段错误

转载 作者:行者123 更新时间:2023-12-01 11:55:59 24 4
gpt4 key购买 nike

我的程序中有一个循环,它将用像素 (GL_POINTS) 填充 3D 立方体,所以为了加快速度,我想我可以使用 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 上,也许该函数不是线程安全的?我可以做点什么来更正代码吗?

最佳答案

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

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

OpenGL 绝对不是线程安全的。

关于multithreading - 带有 OpenMP 的 OpenGL 总是出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com