MPI_Gatherv 抛出分段错误
MPI_Gatherv throws up segmentation fault
我的目标是使用 abcd 输入打印 abbccccdddd。第一次使用Gatherv
int main(int argc, char *argv[])
{
MPI_Init(&argc,&argv);
int rank,size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
int n[100];
MPI_Status status;
int x,i=0,m;
int total[4];
char str[100],str1[100],a1[100],a[100];
if(rank==0){
scanf("%s",str);
}
MPI_Scatter(str,1,MPI_CHAR,a,1,MPI_CHAR,0,MPI_COMM_WORLD);
x=rank;
while(i<=rank){
a1[i]=a[0];
i++;
}
int disps[4];
int y=rank;
disps[rank]=0;
while(y!=0){
disps[rank]+=y;
y--;
}
total[rank]=rank+1;
printf("%s\n",a1 );
char k[100];
printf("%d %d\n",total[rank],disps[rank] );
MPI_Gatherv(a1,rank+1,MPI_CHAR,k,total,disps,MPI_CHAR,0,MPI_COMM_WORLD);
if(rank==0){
printf("Total %s\n",k);
}
MPI_Finalize();
/* code */
return 0;
}
在 运行 代码之后,total 和 disps 的 printf 值是正确的,但是程序抛出一个分段错误
根本原因是 total
和 disps
都应该在根等级上组装(在您的示例中等级 0
)。
它们目前是 "distributed",因此未在根等级上初始化,这会导致未定义的行为,例如崩溃。
我的目标是使用 abcd 输入打印 abbccccdddd。第一次使用Gatherv
int main(int argc, char *argv[])
{
MPI_Init(&argc,&argv);
int rank,size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
int n[100];
MPI_Status status;
int x,i=0,m;
int total[4];
char str[100],str1[100],a1[100],a[100];
if(rank==0){
scanf("%s",str);
}
MPI_Scatter(str,1,MPI_CHAR,a,1,MPI_CHAR,0,MPI_COMM_WORLD);
x=rank;
while(i<=rank){
a1[i]=a[0];
i++;
}
int disps[4];
int y=rank;
disps[rank]=0;
while(y!=0){
disps[rank]+=y;
y--;
}
total[rank]=rank+1;
printf("%s\n",a1 );
char k[100];
printf("%d %d\n",total[rank],disps[rank] );
MPI_Gatherv(a1,rank+1,MPI_CHAR,k,total,disps,MPI_CHAR,0,MPI_COMM_WORLD);
if(rank==0){
printf("Total %s\n",k);
}
MPI_Finalize();
/* code */
return 0;
}
在 运行 代码之后,total 和 disps 的 printf 值是正确的,但是程序抛出一个分段错误
根本原因是 total
和 disps
都应该在根等级上组装(在您的示例中等级 0
)。
它们目前是 "distributed",因此未在根等级上初始化,这会导致未定义的行为,例如崩溃。