Parallel processing MPI_分散完成时间
我正在使用MPI进行并行LU分解,在这里我从原始矩阵发送一堆连续的行,并在稍后的计算后检索它们。分散和聚集工作正常,但我搞砸了,卡住了。我知道这是一个愚蠢的错误,但我看不出我搞砸了什么。这是代码,只要分散,收集和验证是否有效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
#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谢谢,但这不是错误。它在收集步骤中。我正在打印分散的元素。它工作正常。但是如果取消对收集步骤的注释,程序将永远运行。