2014-03-24 36 views
-1
#pragma omp parallel for schedule(static) default(none) 
for(int row = 0; row < m_height; row++) 
{ 
    for(int col = 0; col < m_width; col++) 
    { 
     int RySqr, RxSqr; 

     SettingSigmaN(eta, m_RxInitial + col, m_RyInitial + row , RxSqr, RySqr); 

     FunctionUsing(RySqr,RxSqr); 
    } 
} 

void CImagePro::SettingSigmaN(int Eta, int x, int y, int &RxSqr, int &RySqr, int &returnValue) 
{ 
    int rSqr = GetRadius(x,y,RxSqr,RySqr); 
    returnValue = GetNumberFromTable(rsqr); 
} 


int CImagePro::GetRadius(int x, int y, int &RxSqr, int &RySqr) 
{ 
    if (x == m_RxInitial) 
    {  
     RxSqr = m_RxSqrInitial; 
     if (y == m_RyInitial) 
     { 
      RySqr = m_RySqrInitial; 
     } 
     else if (abs(y) % 2 == abs(m_RyInitial) % 2) 
     { 
      RySqr = RySqr + (y<<2) + 4; //(y+2)^2 
     } 
    } 
    else 
    { 
     RxSqr = RxSqr + (x << 1) + 1; //(x+1)^2 
    } 
    return clamp(((RxSqr+RySqr)>>RAD_RES_REDUCTION),0,(1<<(RAD_RES-RAD_RES_REDUCTION))-1); 
} 

好吧,這裏是我的代碼,我的問題是在GetRadius函數。 因爲我有很多線程,每個線程都從x,y的不同位置開始。但是我不明白GetRadius()裏面的錯誤在哪裏。openmp bug與徑向計算

我想也許是RySqr計算。你能提出一種調試方法嗎?或者你能看到我的問題?

UPDATE:

這已經修復了大部分的我的代碼: 我還是真的不明白,爲什麼有不同的線程之間跳躍。

int CImagePro::GetRadius(int x, int y, int &RxSqr, int &RySqr) 
    { 
    if (x == m_RxInitial) 
    {  
     RxSqr = m_RxSqrInitial; 
    } 
    else 
    { 
     RxSqr = x * x; 
    } 

    if (y == m_RyInitial) 
    { 
     RySqr = m_RySqrInitial; 
    } 
    else if (abs(y) % 2 == abs(m_RyInitial) % 2) 
    { 
     RySqr = y * y; 
    } 
    return clamp(((RxSqr + RySqr) >> RAD_RES_REDUCTION), 0, (1 << (RAD_RES - RAD_RES_REDUCTION)) - 1); 
} 

回答

1

我真的不知道,如果這事編譯?您指定default(none),但始終使用您班級的數據成員。它們都是靜態的嗎?

你可以做的是i)將default(none)離開,這意味着default(shared),ii)通過顯式共享值來共享訪問值,或iii)初始化您在並行區域內使用的變量,以便每個線程有它自己的私人副本,例如m_RxInitial,稱爲p_RxInitial等。第一個選項幾乎可以保證讓你陷入困境。

下面舉例說明方案二):

1)請你需要傳遞一個包含輔助類的一切,你這可能是

struct ShareData{ 
    int s_RxInitial 
    /* ... */ 
} 

2)在成員函數包含並行部分,前並行循環限定

ShareData SD; 
SD.s_RxInitial = m_RxInitial; 
/* ... */ 

3)把它給並行區

#pragma omp parallel for schedule(static), default(none), shared(SD) 

4)在函數調用中使用SD數據成員。

我希望這已經夠清楚了。如果有人提供更優雅的解決方案,我將不勝感激。

如果你想要選項iii)的私有變量,你可以說firstprivate(SD)而不是shared(SD)。這將使每個線程初始化(到原始值)SD的私人副本。它可能會或可能不會通過避免串行訪問來提供某些性能優勢。前幾天我有類似的問題,沒有什麼區別。

-2

你不能保證這些線程執行的順序,如果你需要保證,如果你做了或根本就沒有並行,因爲這是一個關鍵的部分語句,要麼做。

http://bisqwit.iki.fi/story/howto/openmp/

+0

乾脆不要並行化呢?真?這不是一個可以接受的答案。 – Gilad