c++ - MPI C++ - 排名变化

标签 c++ mpi

我已经对我的代码进行了并行处理,其中的一部分有一个我无法理解的奇怪行为。代码片段如下:

int SizeEdgeForNewNodes_int;

{ 
    MPI_Request send_request[mpi_size - 1], recv_request;
    MPI_Status send_status[mpi_size - 1], recv_status;
    MPI_Barrier(MPI_COMM_WORLD);

    if (myrank == 0) {
        for (int m = 1; m < mpi_size; ++m){
            int sendTag = m;
            MPI_Isend(&SizeEdgeForNewNodes[m], 1, MPI_INT64_T, m, sendTag, MPI_COMM_WORLD, &send_request[m - 1]);
            cout << myrank << " - SizeEdgeForNewNodes[m] = " << SizeEdgeForNewNodes[m] << endl;
        }
    }
    MPI_Barrier(MPI_COMM_WORLD);    

    if (myrank > 0) {
        int recvTag = myrank;
        cout << "within b4 - myrank = " << myrank << endl;
        MPI_Irecv(&SizeEdgeForNewNodes_int, 1, MPI_INT64_T, 0, recvTag, MPI_COMM_WORLD, &recv_request); // 1st non blocking receive
        cout << "within after - myrank = " << myrank << endl;
    }
    MPI_Barrier(MPI_COMM_WORLD);    

    if (myrank != 0){
        MPI_Wait(&recv_request, &recv_status);
    }       
    MPI_Barrier(MPI_COMM_WORLD);    

    if (myrank == 0){
        MPI_Waitall(mpi_size - 1, send_request, send_status);
    }
    MPI_Barrier(MPI_COMM_WORLD); 
}

在 Debug 版本中运行代码时一切正常,获得的输出为:

0 - SizeEdgeForNewNodes[m] = 0
within b4 - myrank = 1
within after - myrank = 1

在 Release 中运行时,我获得以下输出:

0 - SizeEdgeForNewNodes[m] = 0
within b4 - myrank = 1
within after - myrank = 0

我使用的是 intel-15.0 编译器,MPI 实现是 mvapich2/2.1。 谢谢你的帮助,

JB

最佳答案

您收到一个 64 位的 int,但您的缓冲区分配的是 32 位的!所以接收到的值会覆盖你的局部变量(myrank)。 要解决此问题,请更改接收缓冲区的数据类型(SizeEdgeForNewNodes_int)

关于c++ - MPI C++ - 排名变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31630817/

相关文章:

c++ - 如何在不知道类是否为模板的情况下调用模板化成员函数?

c++ - Mac OS X 上的 PostThreadMessage 等效项

c++ - DirectX 11 D3DXMatrixTranslation 继续运行?

c++ - Ubuntu 12.04 上的 Boost.MPI

c - MPI:取消非阻塞发送

c - MPI_Allgather 产生不一致的结果

c - MPI 调试 段错误

fortran - MPI 组未分配正确的处理器等级

c# - 传授预测 C# 或 C++ 分支语句的专家知识

c++ - 为什么使用复制构造函数而不是赋值运算符