MPI C++ - 排名变化

MPI C++ - Rank changes

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

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)