使用memcpy错误进行简单的MPI_Gather测试

时间:2016-11-22 20:57:21

标签: c++ c amazon-web-services parallel-processing mpi

我正在学习MPI,并尝试创建一些函数的示例。我有几个工作,但我遇到了MPI_Gather的问题。我有一个更复杂的拟合测试,但我把它修剪成最简单的代码。但是,我仍然收到以下错误:

root@master:/home/sgeadmin# mpirun ./expfitTest5
Assertion failed in file src/mpid/ch3/src/ch3u_request.c at line 584: FALSE
memcpy argument memory ranges overlap, dst_=0x1187e30 src_=0x1187e40 len_=400

internal ABORT - process 0

我正在通过AWS EC2运行一个主实例和两个节点实例。我安装了所有相应的库,因为我已经有其他MPI示例可以工作了。我的节目是:

int main()
{
    int world_size, world_rank;
    int nFits = 100;
    double arrCount[100];
    double *rBuf = NULL;

    MPI_Init(NULL,NULL);
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    assert(world_size!=1);
    int nElements = nFits/(world_size-1);

    if(world_rank>0){
    for(int k = 0; k < nElements; k++)
    {
            arrCount[k] = k;
    }}

    MPI_Barrier(MPI_COMM_WORLD);

    if(world_rank==0)
    {
            rBuf = (double*) malloc( nFits*sizeof(double));
    }

    MPI_Gather(arrCount, nElements, MPI_DOUBLE, rBuf, nElements, MPI_DOUBLE, 0, MPI_COMM_WORLD);

    if(world_rank==0){
    for(int i = 0; i < nFits; i++)
    {
            cout<<rBuf[i]<<"\n";
    }}

    MPI_Finalize();

  exit(0);
}

在malloc或MPI_Gather中有什么我不理解的东西吗?我将我的代码与其他样本进行了比较,但未发现任何差异。

1 个答案:

答案 0 :(得分:1)

收集操作中的root进程确实参与了该操作。即它将数据发送到它自己的接收缓冲区。这也意味着你必须为它在接收缓冲区中的部分分配内存。

现在您可以使用MPI_Gatherv并在0的根目录中指定recvcounts[0] / sendcount来密切关注您的示例。但通常你更愿意以root的方式参与MPI应用程序,即int nElements = nFits/world_size