3

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];}}}
4

1 に答える 1

6

競合状態が発生していないと仮定すると、ループの融合を試すことができます。融合により、並列化するチャンクが大きくなり、偽共有の影響を減らし、負荷をより適切に分散するのに役立ちます。

このようなトリプルループの場合

for(int i2=0; i2<x; i2++) {
    for(int j2=0; j2<y; j2++) {
        for(int k2=0; k2<z; k2++) {
            //
        }
    }
}

このように融合できます

#pragma omp parallel for
for(int n=0; n<(x*y*z); n++) {
    int i2 = n/(y*z);
    int j2 = (n%(y*z))/z;
    int k2 = (n%(y*z))%z;
    //
}

あなたの場合、あなたはこのようにすることができます

int i, j, k, n;
int x = newNx%2 ? newNx/2+1 : newNx/2;
int y = newNy;
int z = newNz;

#pragma omp parallel for private(i, j, k)
for(n=0; n<(x*y*z); n++) {
    i = 2*(n/(y*z)) + 1;
    j = (n%(y*z))/z + 1;
    k = (n%(y*z))%z + 1;
    // rest of code
}

これによりコードの高速化に成功した場合、コードが高速化され、同時にさらに難読化されたことを実感できます。

于 2013-09-12T11:52:27.090 に答える