我正在尝试使用C中的MPI将一个数组从一个进程(排名)发送到“循环”中的另一个进程。我可以使用单个整数使其正常工作,但当我尝试发送该数组时,却遇到了分段错误。
{
int rank;
int numRanks;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numRanks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
int arraysize = 100;
int *array;
if (rank == 0) {
array = malloc(sizeof(int)*arrasize);
for (int i = 0; i < arraysize; i++) {
array[i] = 1;
}
double starttime = MPI_Wtime();
MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
MPI_Recv(&array, arraysize, MPI_INT, numRanks-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
double endtime = MPI_Wtime();
printf("Rank %d got array from Rank %d in %lf", rank, numRanks-1, endtime-starttime);
} else if (rank == (numRanks-1)) {
MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Rank %d got array from Rank %d", rank, rank-1);
MPI_Send(&array, arraysize, MPI_INT, 0, 0, MPI_COMM_WORLD);
} else {
MPI_Recv(&array, arraysize, MPI_INT, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Rank %d got array from Rank %d", rank, rank-1);
MPI_Send(&array, arraysize, MPI_INT, (rank+1), 0, MPI_COMM_WORLD);
}
free(array);
MPI_Finalize();
return 0;
}
下面是错误消息(为了简单起见,我现在只使用三个等级):
Rank 1 got array from Rank 0
[winston:42137] *** Process received signal ***
[winston:42137] Signal: Segmentation fault (11)
[winston:42137] Signal code: Address not mapped (1)
[winston:42137] Failing at address: 0x7add28
然后,对于尝试发送和接收数组的每个秩,也会有更多相同的情况
任何人所能提供的任何帮助都将非常感谢!
发布于 2019-05-31 07:33:05
您的array
没有指向除第0个进程以外的每个进程(列)中的有效内存地址。当你试图在一个随机的(即无效的)地址中写一些东西时,这会使你的程序崩溃,当你调用MPI_Recv(&array, arraysize...
的时候。
(感谢Gilles Gouaillardet在评论中指出),你应该将array
(而不是&array
)传递给MPI函数,因为它本身就是指向一个地址的指针,这个地址被分配给你来存储一些int
。
因此,解决方案将是:
对于process.
MPI_Send(array
.),
MPI_Recv(array
MPI_Recv(&array
(和MPI_Send(&array
)上运行array = malloc(sizeof(int)*arrasize);
https://stackoverflow.com/questions/56386700
复制相似问题