2011-10-12 7 views
9

forループを並列化するために、既存のコードベースにOpenMPを追加しました。私は、おそらく競合状態によって引き起こされる、矛盾に気づいた結果の出力ファイルでOpenMPの並列セクションでポインタをプライベートにしていますか?

#pragma omp parallel for 
for (int i = 0; i < n; i++){ 
    [....] 
    Model *lm; 
    lm->myfunc(); 
    lm->anotherfunc(); 
    [....] 
} 

:いくつかの変数はポインタを含め、parallel for地域の範囲内に作成されます。私は最終的にomp criticalを使って競合状態を解決しました。私の質問は残っています:lmは各スレッドにプライベートですか、それとも共有されていますか?

答えて

10

はい、OpenMP領域内で宣言されたすべての変数はプライベートです。これにはポインタが含まれます。

各スレッドには独自のポインタのコピーがあります。

それはあなたがこのようなものを行うことができます:答えのための

int threads = 8; 
int size_per_thread = 10000000; 

int *ptr = new int[size_per_thread * threads]; 

#pragma omp parallel num_threads(threads) 
    { 
     int id = omp_get_thread_num(); 
     int *my_ptr = ptr + size_per_thread * id; 

     // Do work on "my_ptr". 
    } 
+0

感謝。スペックを読むことから、それはそうであるように見えましたが、それは少し不明でした。 – argoneus

関連する問題