OpenMPで多重forループを並列化して配列に格納する方法
注意点
forループを並列化して配列に値を代入したい。
forループが一重の時は簡単だけど、
多重forループの場合には 内側から #pragma omp parralel for
しないとバグる。
以下の正解とまちがいを見れば、よくわかる。
正解
// 内外共に #pragma omp する int a[4][3], i, j; #pragma omp parallel for for(i = 0; i < 4; i++) { #pragma omp parallel for for(j = 0; j < 3; j++) { a[i][j] = i*j; } } // 配列 a に i*j が正しく格納される
// 内側だけ #pragma omp する int a[4][3], i, j; for(i = 0; i < 4; i++) { #pragma omp parallel for for(j = 0; j < 3; j++) { a[i][j] = i*j; } } // 配列 a に i*j が正しく格納される
まちがい
// 外側だけ #pragma omp する int a[4][3], i, j; #pragma omp parallel for for(i = 0; i < 4; i++) { // 内ループはpragmaなし for(j = 0; j < 3; j++) { a[i][j] = i*j; } } // 配列 a は変なことになる