我的目标是使用abcd输入打印abbcccdddd。这是我第一次使用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值是正确的,但程序会引发分段错误
答案 0 :(得分:0)
根本原因是total
和disps
都应该根据您的示例中的根级别排名(等级0
。)
它们当前是“分布式的”,因此未在根级别上初始化,这会导致未定义的行为,例如崩溃。