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);
        }
    }
}