コード2の問題点は、既存の並列領域(これは非常に明白です)のためにdelEを更新できないことです。しかし、コード1はマークまでではなく、あいまいな結果を示しています。コード1またはコード2のいずれかを並列に実行するための正しいソリューションを提供できる人がいれば、私は義務づけられます。C++でopenmpを使用して2dポインタを更新する
ここでgrad_computeは、並列ループごとに格納または追加するために必要な2dポインタを返します。 norm_delEとdelEはそれぞれ3dと2dポインタとして宣言されています。
#pragma omp parallel for num_threads(8)
for (int k = 0; k < no_of_sources; k++)
{
double** gnorm = grad_compute(/*parameters*/);
// code 1
/* for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++)
{
norm_delE[i][j][k] = gnorm[i][j]; } } */
// code 2
/* for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++)
{ delE[i][j] += gnorm[i][j]; } } */
}
さらなる情報が必要な場合は、私は感謝します。
私が提案したコードを改善しようとしました。しかし、私はまだ結果にあいまいさがあります。正常な動作のためのちょうど正常。私はそれを並列に実装するとすぐに、いくつかの奇妙な結果を示します。視覚的な解釈については、https://drive.google.com/file/d/0B66p6XimmUkaanZXVHhHdzF3M00/view?usp=sharingをご覧ください。 –
@Sagar Singhの回答が更新されました – rahnema1
結果は同じです –