首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试通过MPI中的几个等级发送一个循环中的数组,但收到seg错误。有人能告诉我为什么吗?

尝试通过MPI中的几个等级发送一个循环中的数组,但收到seg错误。有人能告诉我为什么吗?
EN

Stack Overflow用户
提问于 2019-05-31 07:04:21
回答 1查看 91关注 0票数 0

我正在尝试使用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

然后,对于尝试发送和接收数组的每个秩,也会有更多相同的情况

任何人所能提供的任何帮助都将非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 07:33:05

您的array没有指向除第0个进程以外的每个进程(列)中的有效内存地址。当你试图在一个随机的(即无效的)地址中写一些东西时,这会使你的程序崩溃,当你调用MPI_Recv(&array, arraysize...的时候。

(感谢Gilles Gouaillardet在评论中指出),你应该将array (而不是&array)传递给MPI函数,因为它本身就是指向一个地址的指针,这个地址被分配给你来存储一些int

因此,解决方案将是:

对于process.

  • Change (和MPI_Send(array.

),

  1. 在每个MPI_Recv(array MPI_Recv(&array (和MPI_Send(&array)上运行array = malloc(sizeof(int)*arrasize);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56386700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档