MPI_Send/Recv 发送动态分配的 int 数组失败

夜曲

我试图了解发送数组的工作原理。我写了一个简单的程序,但效果不佳,因为它通常会在分段错误时崩溃。我的程序有一些论据:

mpirun -np 2 sendTest

这是代码:

#include <mpi.h>
#include <iostream> 

using namespace std;

int main(int argc, char *argv[])
{
    int cpuNum;
    int myId;
    MPI_Status mpiStatus;

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&cpuNum);
    MPI_Comm_rank(MPI_COMM_WORLD,&myId);

    int *myNumbs=(int*)malloc(2*(sizeof(int)));
    int *neighNumbs=(int*)malloc(2*(sizeof(int)));

    if(myId==0){
        myNumbs[0]=0;
        myNumbs[1]=0;

        MPI_Send(&myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
        MPI_Recv(&neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);

        cout<<"this is cpu 0, neigh myNumbs=";
        for (int i = 0; i < 2; ++i){
            printf("%d,",neighNumbs[i]);
        }
        cout<<endl;
    }
    else{
        myNumbs[0]=1;
        myNumbs[1]=1;

        MPI_Recv(&neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
        MPI_Send(&myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);

        cout<<"this is cpu 1, neigh myNumbs=";
        for (int i = 0; i < 2; ++i){
            printf("%d,",neighNumbs[i]);
        }
        cout<<endl;
    }

    MPI_Finalize();
    return 0;
}

正如我所说,通常像这样的错误崩溃:*** Process received signal *** Signal: Segmentation fault (11) Signal code: Address not mapped (1)但有时一个或另一个进程接收数据。

麦克猫

您必须传递已分配数组的地址,而不是指向已分配数组的指针的地址

去掉&指针变量前的两个:try

        MPI_Send(myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
        MPI_Recv(neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);

代替

        MPI_Send(&myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
        MPI_Recv(&neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);

        MPI_Recv(neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
        MPI_Send(myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);

代替

        MPI_Recv(&neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
        MPI_Send(&myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MPI动态分配数组

来自分类Dev

MPI_Sendrecv与对recvbuf的操作?

来自分类Dev

动态分配char数组和int数组的结构

来自分类Dev

在结构内部动态分配一个int数组

来自分类Dev

动态分配失败?C ++

来自分类Dev

为什么动态分配的int数组在scanf,C语言中使用&?

来自分类Dev

如何在结构数组中初始化和动态分配int指针成员?

来自分类Dev

结构数组,动态分配

来自分类Dev

动态分配和数组

来自分类Dev

读写动态分配的数组

来自分类Dev

动态分配结构数组

来自分类Dev

简化C函数中的宏(动态分配的数组和MPI_Recv)

来自分类Dev

如何动态分配全局 int*?

来自分类Dev

动态分配数组说明

来自分类Dev

python遍历动态分配的Cython数组

来自分类Dev

C ++-本地堆栈数组与动态分配

来自分类Dev

为结构数组动态分配内存

来自分类Dev

动态分配多个一维数组

来自分类Dev

C ++中的动态分配数组

来自分类Dev

如何扩展动态分配的数组

来自分类Dev

动态分配字符串数组

来自分类Dev

分段故障动态分配的结构数组

来自分类Dev

如何制作动态分配的结构数组?

来自分类Dev

动态分配和复制数组

来自分类Dev

动态分配数组的末尾

来自分类Dev

删除动态分配的数组与单个指针

来自分类Dev

使用动态分配的char数组的长度

来自分类Dev

动态分配字符串数组

来自分类Dev

查找动态分配的数组的大小