OpenMPでの同じ要素へのアクセス
OpenMPの並列計算で行列の同じ要素にアクセスするときに同時に書き換えるとデータが壊れる可能性がある。 atomicを使うとどれかのスレッドでアクセスしている際にその作業が終わるまで待つようになる。
何度も同じ要素にアクセする際には計算時間が遅くなるかもしてないので、 `MPI`で並列するか行列のサイズをTHREAD_NUM倍して並列化が終わった後にまとめるようにする手が考えられる。
書き方
同時にアクセスする危険性のあるところにatomic
をつけてあげる。
#pragma omp parallel for for(i=0; i<N; i++){ printf("%d\n", i); #pragma omp atomic array[0][0]++; }
補足
ファイルポインタなどへの同時アクセスを防ぐにはatomic
は使えない。
critical
を使う必要がある。
例えば、たまにiを記録する時には
#pragma omp parallel for for(int i=0; i<N; i++){ if(i%10==0){ #pragma omp critical { fprintf(fp, "%d\n", i); } } }