c - 试图通过 MPI 中的几个等级循环发送一个数组,但出现段错误。谁能告诉我为什么?
问题描述
我正在尝试使用 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
然后对于尝试发送和接收数组的每个等级的更多相同
任何人都可以提供任何帮助将不胜感激!
解决方案
您array
没有指向除第 0 个以外的每个进程(等级)中的有效内存地址。这将使您的程序在尝试在随机(即无效)地址中写入内容时崩溃,即当您调用MPI_Recv(&array, arraysize...
.
(感谢 Gilles Gouaillardet 在评论中指出)并且您应该将array
(不&array
)传递给 MPI 函数,因为它本身是指向分配给您以存储一些 int
.
因此,解决方案将是:
array = malloc(sizeof(int)*arrasize);
在每个进程上运行。MPI_Recv(&array
将(andMPI_Send(&array
)更改为MPI_Recv(array
(andMPI_Send(array
.
推荐阅读
- javascript - 初次成功付款后,条带计费订阅不收取“后续费用”
- python - 我的文件中有错误,但在控制台中它可以工作
- xen - 奇怪的“尝试访问超出设备末端”,在哪里看?
- express - GET 请求在邮递员中不起作用,但 POST 请求有效
- python - 取消展平数据框中的行
- c++ - 我需要将字符串(例如 A5)转换为一个字符串(A)和一个整数(5)
- flutter - 如何使用 Flutter 将列项包装在带有标题的卡片中
- python - Python 的 matplotlib 颜色图使用什么颜色模型?
- autosar - WDGM中的实时监督机制
- python - 通过组合列表和字典创建自定义数据结构 - Python 3.x