【问题标题】:MPI_Send/Recv failed sending dynamically allocated int arrayMPI_Send/Recv 发送动态分配的 int 数组失败
【发布时间】:2018-04-03 20:49:15
【问题描述】:

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

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)。但有时一个或另一个进程会接收数据。

【问题讨论】:

  • &amp;myNumbs ---> myNumbs in all MPI_*.
  • 还是同样的错误

标签: c++ mpi


【解决方案1】:

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

去掉指针变量前的两个&amp;:试试

        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);

【讨论】:

  • 请注意,您可以使用MPI_Sendrecv() 大大简化您的代码(一旦更正)
猜你喜欢
  • 2016-01-04
  • 2013-04-07
  • 2019-04-29
  • 2013-02-02
  • 2015-05-02
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2013-04-28
相关资源
最近更新 更多