MPIc++实现Jacobi迭代的并行计算,不知道有没有缺陷,请各位大佬指正

原帖子如下

链接: link
帖子中用Fortran编写了一个程序,我自己写了一个没有用帖子中的MPI_SENDRECV,因为对Fortran语言没有了解,所以没有完全看源代码,自己写的可能编程风格比较乱,请见谅。

代码如下

// A code block
var foo = 'bar';
// An highlighted block
#include "mpi.h"
#include <stdio.h>
double f(double);
double f(double x)
{
    return (4.0/(1.0+x*x));
}
int main(int argc,char *argv[])
{   
	//这里之前用自动生成的总是有规律,导致迭代生成的数据和自动生成的一样,所以就随便敲了点数据
    double array[16][16] ={{1,5,6,79,5,41,3,6,56,41,52,4,9,87,8,1},
                          {6,5,56,5,6,56,4,1,3,54,8,6,1,5,54,23},
                          {1,1,5,45,1,645,456,56,5,654,546,65,4,5654,65,4},
                          {145,41,415,45,45,45,45,32,32,32,13,32,32,32,2,1},
                          {1,12,45,5,45,5,5,45,45,45,5,456,6,6,4,45},
                          {45,456,6,56,65,65,45,6,456,4,64,564,56,456,654,6},
                          {546,64,56,465,456,4,54,56,4,5641,5,456,4,65,5,456},
                          {21,12,3,123,123,1,31,1,3,3,1,5,36,1,1,3},
                          {1,123,1,1,32,15,46,6,6,4,54,6,45,4,6,6},
                          {1,1,5,56,132,1,54,56,2,3,5,48,78,46,46,7},
                          {8,78,97,8,78,9,7,78,45,5,45,4,564,4,65,6},
                          {4,5,4,54,54,56,6,5,56,4,56,65,4,65,45,4},
                          {2,3,1,56,6,54,6,454,56,56,456,54,6,664,1,1},
                          {1,2,12,12,123,1,1,2,1231,2,3,1,321,2,1,32},
                          {1,3,12,12,1,1,3,12,1,1,2,3,3,56,5,6},
                          {21,1,2,12,1,1,1,21,23,12,1,21,23,1,1,51}};
    int myid, numprocs;
    int n, i;
    double mypi, pi;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    for(int step=0;step<10;step++){
    double b[4][16];//主要用二维数据进行传送
    for(int i=myid*4;i<(myid+1)*4;i++)
      for(int j=1;j<15;j++)
      {
      if(myid==0){
         if(i!=0)
         { b[i][j]=0.25*(array[i-1][j]+array[i+1][j]+array[i][j-1]+array[i][j+1]);}}
      else{
        if(i!=15){
          b[i%4][j]=0.25*(array[i-1][j]+array[i+1][j]+array[i][j-1]+array[i][j+1]);}}
        }
    if(myid==0){
      for(int i=1;i<4;i++)
    {
      for(int j=1;j<15;j++){
        array[i][j]=b[i][j];
        }
    }
      for(int i=1;i<4;i++){
        MPI_Recv(b,4*16,MPI_DOUBLE,i,99,MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        for(int j=0;j<4;j++){
          for(int k=1;k<15;k++){
          if(i==3&&j==3){
            break;
          }
            array[i*4+j][k]=b[j][k];
          }
        }
      }
      printf("第%d次迭代结果:\n",step+1);
      for(int i=0;i<16;i++)
    {
      for(int j=0;j<16;j++){
        printf("%.1f ",array[i][j]);}
      printf("\n");
    }
    }else{
      MPI_Send(b,4*16,MPI_DOUBLE,0,99,MPI_COMM_WORLD);
    }}
    MPI_Finalize();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值