2016-11-10 8 views
0

この並列化された戻り値は、並列化されていない戻り値と一致しません。OpenMPを使用したC++でのループの並列化

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のためにそれが必要な表示されません。さらに、2つのforループを崩壊させることができます。 編集:各xf、yfは、i、jの式で一意であるとは限りません。したがって、連続したものを保つか、(xf、yf)に競合条件がある場合は、最大(i、j)を維持するようにチェックすることができます。 サポートされているバージョンが非常に古いので、OpenMPはVisual Studioで動作するかどうかはわかりません(2.0は最新の4.5です)。

+0

これを実行している解決策はまだ動作していません – giorgioW

+0

@giorgioW「動作していません」という意味はどうですか?結果は間違っていますか?時間は短縮されませんか? –

+2

@khinguinễn私はあなたの答えが正しいとは思わない。 2つの異なる '(i、j)'ペアが同じ '(yf、xf)'ペアを生成する状況を想像してください。次に、非並行バージョンでは、 '(yf、xf)'ペアが最後に生成されたときに 'matrixColor2'マトリックスが保持されます。パラレルバージョンでは、この行列の中でスレッドがお互いにぶつかるので、結果は不定です。 OPに:私はこのプログラムをそのまま並行して適用できるとは思わない。それは本質的に連続的な操作です。 – NoseKnowsAll

関連する問題