Game of Lifeをシミュレートする単純なプログラムを並列化するためにOpenMPを使用しようとしています。OpenMP:エラー: 'w.13'が並列を囲んで指定されていません
私は、以下の機能を持っている:私は、Windows 10上のbash上で、gcc-4.8 gameoflife.c -o gameoflife -std=gnu99 -O3 -fopenmp
でそれをコンパイルしています
#define for_x for (int x = 0; x < w; x++)
#define for_y for (int y = 0; y < h; y++)
#define for_xy for_x for_y
、および:
void evolve_parallel(void *u, int w, int h)
{
unsigned (*univ)[w] = u;
unsigned new[h][w];
#pragma omp parallel for firstprivate(univ, new, w, h), collapse(2), default(none)
for_y for_x {
int n = 0;
for (int y1 = y - 1; y1 <= y + 1; y1++)
for (int x1 = x - 1; x1 <= x + 1; x1++)
if (univ[(y1 + h) % h][(x1 + w) % w])
n++;
if (univ[y][x]) n--;
new[y][x] = (n == 3 || (n == 2 && univ[y][x]));
}
for_y for_x univ[y][x] = new[y][x];
}
は、(ファイルの先頭)私のマクロがあります私はdefault(none)
を削除する場合は、
gameoflife.c: In function ‘evolve_parallel’:
gameoflife.c:131:13: error: ‘w.13’ not specified in enclosing parallel
if (univ[(y1 + h) % h][(x1 + w) % w])
^
gameoflife.c:126:10: error: enclosing parallel
#pragma omp parallel for firstprivate(univ, new, w, h), collapse(2), default(none)
^
:gccのは私に次のエラーを与えますコードをコンパイルしますが、私はコードを変更し続けるとコンパイラーは私がいくつかの変数をprivateまたはfirstprivateとして宣言するのを忘れた場合に警告を発します。
明らかに、私はw.13
という変数を持っていません。これは私が使用している外部変数ではありません。私のコードがコンパイルされていない理由を誰かが知っていますか?
最初は共有されていましたが、コンパイラのエラーを見たとき、私はfirstprivateを試してみて、共有に戻すのを忘れました。私はそれを元に戻します。 パフォーマンスの問題について - 私はnewが 'new [y] [x]'としてアクセスされるので、ループの順番はOKだと思うので、最初のループはy以上、xは2以上です。 最後に、これは私のコードではなく、私はそれを並列化しているので、マクロは私が最初に得たものです。 –