2011-08-29 46 views
3

我在我的程序中有一個循環,它將填充像素(GL_POINTS)的3D立方體,所以爲了加快處理速度,我想我可以使用OpenMP並將它分離爲多核處理器。OpenGL with OpenMP always segfault

的問題是,我使用的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有關,也許該函數不是線程安全的?我可以做些什麼來糾正代碼?

+0

是什麼讓你相信這會起作用? – genpfault

回答

5

不要混淆單個OpenGL上下文和多線程,或者通過關鍵部分來防止OpenGL的每次使用(這不會在性能方面爲您購買任何東西)。你可能會做的是使用頂點數組/緩衝區(反正它會更快),並在使用多個線程填充它們的數據,然後在單線程中繪製它們。

如果一個線程在繪製頂點之前設置當前顏色並取消調度,會發生什麼?但是肯定會發生的是,在某些操作過程中,驅動程序被中斷,其內部數據完全混亂。

OpenGL絕對不是線程安全的。

+0

您必須始終只在應用的主線程中發出OpenGL調用。 – karx11erx

+0

OpenGL是線程安全的,一次只能在一個線程中激活上下文。需要注意的是,雖然共享列表的多個上下文可以同時在自己的線程中處於活動狀態,但是如果共享目標幀緩衝區,則會導致性能下降以及各種問題。 – datenwolf

+0

基督徒,你能給我舉一些例子或者一些地方給我研究頂點數組嗎?我對openGL真的很陌生,所以我並不知道你在說什麼。 –