Parallel processing MPI_分散完成时间

Parallel processing MPI_分散完成时间,parallel-processing,cluster-computing,mpi,openmpi,Parallel Processing,Cluster Computing,Mpi,Openmpi,我正在使用MPI进行并行LU分解,在这里我从原始矩阵发送一堆连续的行,并在稍后的计算后检索它们。分散和聚集工作正常,但我搞砸了,卡住了。我知道这是一个愚蠢的错误,但我看不出我搞砸了什么。这是代码,只要分散,收集和验证是否有效 #include<stdio.h> #include<stdlib.h> #include "mpi.h" int extractN(char *c);/*Helper to extract command line argument*/ int

我正在使用MPI进行并行LU分解,在这里我从原始矩阵发送一堆连续的行,并在稍后的计算后检索它们。分散和聚集工作正常,但我搞砸了,卡住了。我知道这是一个愚蠢的错误,但我看不出我搞砸了什么。这是代码,只要分散,收集和验证是否有效

#include<stdio.h>
#include<stdlib.h>
#include "mpi.h"

int extractN(char *c);/*Helper to extract command line argument*/
int malloc2Ddouble(double ***array,int n, int m);/*Helper to allocate contiguous block of memory*/

int main(argc,argv)
     int argc;
     char *argv[];
{

  int my_id;
  int my_max;
  int my_min;
  int rows;
  char hostname[32];
  int len=32;
  int n;
  int procs;
  double **a;
  double **b;
  double **c;
  int i,j,k;
  int ret;


  n=extractN(argv[1]);

  /*Intialize MPI Environment*/
  ret=MPI_Init(&argc,&argv);
  if(ret!=MPI_SUCCESS){
    printf("Error in intializing MPI environment\n");
    MPI_Abort(MPI_COMM_WORLD,ret);
    exit(0);
  }
  MPI_Comm_size(MPI_COMM_WORLD,&procs);
  MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
  MPI_Get_processor_name(hostname,&len);

  rows=n/procs;

  my_min=(my_id*rows);
  my_max=my_min+(rows-1);
  if(my_id==0){
    ret=malloc2Ddouble(&a,n,n);
    if(ret!=0){
      printf("Error in allocating contiguous block of memory for matrix a\n");
      MPI_Abort(MPI_COMM_WORLD,ret);
      exit(0);
    }
    ret=malloc2Ddouble(&c,n,n);
    if(ret!=0){
    printf("Error in allocating contiguous block of memory for c\n");
    MPI_Abort(MPI_COMM_WORLD,ret);
    exit(0);
    }
    //  for(i=0;i<n;i++)a[i]=(double *)malloc(sizeof(double)*n);
    srand(1);
    for(i=0;i<n;i++){
      for(j=0;j<n;j++){
        a[i][j]=((rand()%10)+1);
      }
    }
  }//end of master thread.

  // b=(double **)malloc(sizeof(double *)*rows);// this doesn't work
  // for(i=0;i<rows;i++)b[i]=(double *)malloc(sizeof(double)*n);
  ret=malloc2Ddouble(&b,n,rows);
  if(ret!=0){
    printf("Error in allocating contiguous block of memory to array b \n");
    MPI_Abort(MPI_COMM_WORLD,ret);
    exit(0);
  }


  ret=MPI_Barrier(MPI_COMM_WORLD);
  if(ret!=MPI_SUCCESS){
    printf("Error in barrier point one  \n");
    MPI_Abort(MPI_COMM_WORLD,ret);
    exit(0);
  }

  ret=MPI_Scatter(&(a[0][0]),(n*rows),MPI_DOUBLE, &(b[0][0]),(n*rows),MPI_DOUBLE,0,MPI_COMM_WORLD); 
  /*Scatter the blocks to slave threads*/

  MPI_Barrier(MPI_COMM_WORLD);
  MPI_Gather(&(b[0][0]),(n*rows),MPI_DOUBLE,&(c[0][0]),(n*rows),MPI_DOUBLE,0,MPI_COMM_WORLD);
  MPI_Barrier(MPI_COMM_WORLD);


  if(my_id==0){
    for(i=0;i<n;i++){
     for(j=0;j<n;j++){
       printf("%lf ",c[i][j]);
      }
    printf("\n");
    }
   }

  MPI_Finalize();
  return 0;
}

/*Helper function*/
int extractN(char *c){
  int temp=0;
  while((*c)!='\0'){
    temp=temp*10 + ((*c)-48);
    c=c++;
  }
  return temp;

}

int malloc2Ddouble(double ***array,int n, int m){
  int i;
  double *p=(double *)malloc(sizeof(double)*n*m);
  if(p==NULL)return -1;

  (*array)=(double **)malloc(sizeof(double *)*n);

  if((*array)==NULL) return -1;

  for(i=0;i<n;i++){
    (*array)[i]=&(p[i*m]);
   }
  return 0;
}
#包括
#包括
#包括“mpi.h”
int extractN(char*c)/*用于提取命令行参数的助手*/
int malloc2Ddouble(双***数组,int n,int m)/*帮助器分配连续的内存块*/
int main(argc、argv)
int-argc;
char*argv[];
{
输入我的id;
int my_max;
int my_min;
int行;
字符主机名[32];
int len=32;
int n;
int程序;
双**a;
双**b;
双**c;
int i,j,k;
int ret;
n=提取n(argv[1]);
/*初始化MPI环境*/
ret=MPI_Init(&argc,&argv);
如果(ret!=MPI_成功){
printf(“初始化MPI环境时出错\n”);
MPI_中止(MPI_通信世界,ret);
出口(0);
}
MPI通信大小(MPI通信世界和过程);
MPI通信等级(MPI通信世界和我的id);
MPI\u获取\u处理器\u名称(主机名和len);
行=n/procs;
my_min=(my_id*行);
my_max=my_min+(第1行);
if(my_id==0){
ret=malloc2Ddouble(&a,n,n);
如果(ret!=0){
printf(“为矩阵a分配连续内存块时出错”);
MPI_中止(MPI_通信世界,ret);
出口(0);
}
ret=malloc2Ddouble(&c,n,n);
如果(ret!=0){
printf(“为c\n分配连续内存块时出错”);
MPI_中止(MPI_通信世界,ret);
出口(0);
}

//对于(i=0;这可能是一个原因:传递到
MPI\u Get\u processor\u name
的处理器名称缓冲区应该至少能够容纳
MPI\u MAX\u processor\u name
个字符。您只提供一个可以容纳32个字符的缓冲区,如果主机名更长,它将覆盖其他局部变量的值(哪一个取决于编译器如何布置堆栈框架)。另外,
resultlen
参数是仅输出的-将其设置为32不会限制MPI将写入字符串缓冲区的数据量。@HristoIliev谢谢,但这不是错误。它在收集步骤中。我正在打印分散的元素。它工作正常。但是如果取消对收集步骤的注释,程序将永远运行。