0

動的 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;
   }
4

1 に答える 1