動的 3D 配列を含むクラスがあります。クラスのオブジェクトは、1 次元配列に入力する計算を行う関数を呼び出し、最後にオブジェクトの 3 次元配列に 1 次元配列データを入力します。1 次元配列のサイズは 3 次元配列と同じです。
計算を高速化するために Openmp を使用しています。シングルスレッドの実行では正しい結果が得られますが、複数のスレッドに移動するとすぐに奇妙な結果が得られます。
サンプルコードを以下に示します。問題の解決にご協力ください。
class A (
void func(float *buf);
void populateRes(*t);
private:
float ***res;
};
A a[n];
int nthrd = omp_get_num_threads();
float *buf;
while (cnt < nz)
{
#pragma omp parallel shared(cnt) private(buf, tid, omp_i)
{
if(cnt == 0 )
buf = new float[x*y*z];
#pragma omp for
for(omp_i=0; omp_i<n; omp_i++)
{
a[omp_i].func(buf);
a[omp_i].populateRes(buf);
}
}
cnt++;
if(cnt >= nz)
delete []buf;
}