余白の書きなぐり

aueweのブログ

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 は変なことになる