2016-08-06 5 views
1

コード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]; } } */ 
} 

さらなる情報が必要な場合は、私は感謝します。

答えて

1

編集と更新:CODE1ため 直接norm_delEに割り当てられているが、norm_delEの寸法は[no_of_sources] * [行] * [colsの]になるように変更する必要がありますgrad_computeのgnorm、その結果を使用する必要はありません。 CODE2ため

複数のスレッドが、同時に、DELEアレイに書き込むため、各スレッドは、一部のローのみ を更新するために限定されるべきであるので、我々は

をCODE2ため2 CODE1するループいずれかのOMPおよび他の作成

また、grad_compute shouleによって取得されたメモリは、free_memoryなどの関数によって解放されますが、メモリ管理ではstd :: vectorまたはunique_ptrを使用することをお勧めします。

#pragma omp parallel num_threads(8) 
{ 
    //code 1 
    #pragma omp for 
    for (int k = 0; k < no_of_sources; k++) 
    { 
     norm_delEk[k] = grad_compute(/*parameters*/); 
    } 
    //code 2 

    #pragma omp for 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < cols; j++) 
     { 
      for (int k = 0; k < no_of_sources; k++) 
      { 
       delE[i][j] += norm_delE[k][i][j]; 
      } 
     } 
    } 
} 
//memory that acquired should be released 
free_memory(norm_delE); 
+0

私が提案したコードを改善しようとしました。しかし、私はまだ結果にあいまいさがあります。正常な動作のためのちょうど正常。私はそれを並列に実装するとすぐに、いくつかの奇妙な結果を示します。視覚的な解釈については、https://drive.google.com/file/d/0B66p6XimmUkaanZXVHhHdzF3M00/view?usp=sharingをご覧ください。 –

+0

@Sagar Singhの回答が更新されました – rahnema1

+0

結果は同じです –

関連する問題