OpenMP 並列化を使用して、この for ループを高速化しようとしています。これにより、作業が複数のスレッドに分割されるはずだという印象を受けました。ただし、おそらくオーバーヘッドが大きすぎて、速度が向上しません。
このループは何度も発生するため、ループの各インスタンスを並列化する必要があります。ループの反復回数 newNx は、3 回から 256 回まで可能です。ただし、条件付きで newNx > 100 (最大ループのみ) のみを並列化すると、依然として大幅に遅くなります。
これが予想よりも遅くなる原因はここにありますか? また、ベクトル A、v、b は非常に大きいことにも言及する必要がありますが、アクセスは O(1) だと思います。
#pragma omp parallel for private(j,k),shared(A,v,b)
for(i=1;i<=newNx;i+=2) {
for(j=1;j<=newNy;j++) {
for(k=1;k<=newNz;k+=1) {
nynz=newNy*newNz;
v[(i-1)*nynz+(j-1)*newNz+k] =
-(v[(i-1)*nynz+(j-1)*newNz+k+1 - 2*(k/newNz)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kup+offA] +
v[(i-1)*nynz+(j-1)*newNz+ k-1+2*(1/k)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kdo+offA] +
v[(i-1)*nynz+(j - 2*(j/newNy))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jup+offA] +
v[(i-1)*nynz+(j-2 + 2*(1/j))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jdo+offA] +
v[(i - 2*(i/newNx))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + iup+offA] +
v[(i-2 + 2*(1/i))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ido+offA] -
b[(i-1)*nynz + (j-1)*newNz + k])
/A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ifi+offA];}}}