C语言 尝试通过 MPI 中的多个等级发送一个圆圈中的数组,但出现 seg 错误.谁能告诉我为什么



我正在尝试使用 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的地址的指针。

因此,解决方案将是:

  1. 在每个进程上运行array = malloc(sizeof(int)*arrasize);
  2. MPI_Recv(&array(和MPI_Send(&array(更改为MPI_Recv(array(和MPI_Send(array (。

相关内容

  • 没有找到相关文章