MPI中的Jacobi放松

时间:2016-06-22 13:47:29

标签: c parallel-processing mpi

我在1小时前创建了一个问题,但问得不好,所以我重新创建了一个。

我在C中得到了Jacobi放松的代码:

while ( error > tol && iter < iter_max ) {
    error = 0.0;

    for( int j = 1; j < n-1; j++)
    {   
        for( int i = 1; i < m-1; i++ )
        {   
            Anew[j][i] = 0.25 * ( A[j][i+1] + A[j][i-1]
                                + A[j-1][i] + A[j+1][i]);
            error = fmax( error, fabs(Anew[j][i] - A[j][i]));
        }
    }

    for( int j = 1; j < n-1; j++)
    {   
        for( int i = 1; i < m-1; i++ )
        {   
            A[j][i] = Anew[j][i];
        }
    }

    if(iter % 100 == 0) printf("%5d, %0.6f\n", iter, error);

    iter++;
}

我用以下方式运行:

  • 4096x4096的数组
  • iter_max = 1000
  • 错误= 1.0e-6
  • 16核

我已将此代码与OpenACC并行化。现在,我想使用MPI来了解它是如何工作的。但是,对于我做的第一个实现,我没有很好的结果(新数组没有很好的构造)。如何将此代码段与MPI并行化?

1 个答案:

答案 0 :(得分:0)

这是我为类似案例编写的代码,您可以将其用作指南。

void calImage(float **image, float **newImage, float **edge, \
          int rows, int cols) {
  int i, j;

  for (i = 2; i < rows; i++) {
    for (j = 2; j < cols; j++) {
      newImage[i][j] = 0.25f * (image[i-1][j] \
                        + image[i+1][j] \
                        + image[i][j-1] \
                        + image[i][j+1] \
                        - edge[i][j]);
    }
  }
}

calImage()函数正在进行光晕交换操作时不依赖的计算。

// some string with variable spaces and variable number of title words
var words = '1    26.05.16  THE   REINFORCEMENT  REVISED    MM  SB   AE  GM';

// match for:
// possible spaces at the start
// a 1
// variable spaces
// a xx.xx.xx date
// variable spaces
// any number of words that are not the initials, separated by variable spaces
// variable spaces
// four initials, separated by variable spaces
// possible spaces at the end
var matches = words.match(/^\s*1\s+\d\d\.\d\d\.\d\d\s+((?:\w+\s+)+\w+)\s+([A-Z]{2})\s+([A-Z]{2})\s+([A-Z]{2})\s+([A-Z]{2})\s*$/);
console.log(matches);

// replace variable spaces in title with single spaces
console.log(matches[1]);
matches[1] = matches[1].replace(/\s+/g, ' ');
console.log(matches[1]);