2016-11-10 121 views
0

這種並行返回的解決方案與它應該返回的解決方案不匹配,就像非並行化的解決方案一樣。在C++中使用OpenMP並行循環

double angle=(PI/180)*atoi(extra); 
    unsigned int xf; 
    unsigned int yf; 
    int j;  
    #pragma omp parallel for private (j,xf,yf)   
    for(int i=0;i<width;i++){ 
     for(j=0;j<height;j++){ 
      xf=(unsigned int)ceil(((cos(angle)*(j-(((double)height)/2.0)))-(sin(angle)*(i-(((double)width)/2.0))))+(((double)height)/2.0)); 
      yf=(unsigned int)ceil(((sin(angle)*(j-(((double)height)/2.0)))+(cos(angle)*(i-(((double)width)/2.0))))+(((double)width)/2.0)); 
      if(xf<(unsigned int)height && xf>=0 && yf>=0 && yf<(unsigned int)width){ 
        matrixRed2[yf][xf]=matrixRed[i][j]; 
        matrixGreen2[yf][xf]=matrixGreen[i][j]; 
        matrixBlue2[yf][xf]=matrixBlue[i][j]; 
      } 
     } 
    } 
+1

我不確定我是否完全遵循了你的代碼,但是當線程計算它們時,'yf'和'xf'的值將不一定會有所不同。 –

回答

0

我不認爲有必要讓j在循環之外,因爲它只是在賦值給數組之前包含臨時值(它們與元素無關)。而且,兩個for循環可以摺疊。 編輯:每個xf,yf都不能保證與來自i,j的公式是唯一的。所以保持順序的,或者你可以嘗試檢查以保持最大(i,j)如果(xf,yf)中存在競爭條件。 我不確定OpenMP是否可以在Visual Studio上工作,因爲受支持的版本很舊(2.0與此同時最新版本是4.5)。

+0

這樣做的解決方案仍然不起作用 – giorgioW

+0

@giorgioW你是什麼意思「不工作」?結果不正確?時間不會減少? –

+2

@khôinguyễn我不認爲你的回答是正確的。想象一下兩個不同的'(i,j)'對產生相同的'(yf,xf)'對的情況。然後在非平行版本中,'matrixColor2'矩陣將保存最後一次生成'(yf,xf)'對。在並行版本中,你將在這個矩陣中有線程相互跺腳,所以結果是不確定的。對於OP:我不相信這個程序可以按原樣並行調整。它本質上是一個順序操作。 – NoseKnowsAll