试图通过 MPI 中的多个等级在一个圆圈中发送一个数组,但出现段错误。谁能告诉我为什么?
Trying to send an array in a circle through several ranks in MPI, but am getting seg faults. Can anyone please tell me why?
我正在尝试在 "circle" 中使用 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
(和MPI_Send(&array
)更改为MPI_Recv(array
(和MPI_Send(array
。
我正在尝试在 "circle" 中使用 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
(和MPI_Send(&array
)更改为MPI_Recv(array
(和MPI_Send(array
。