MPI_Sendrecv_replace()死锁问题

时间:2013-09-18 06:53:48

标签: c++ mpi

我正在完成作业后的作业:

  

每个进程都需要一个double作为输入。使用功能   MPI_Sendrecv_replace()将所有双打与相反的进程交换   等级(第一个和最后一个,第二个和最后一个,......)。在每个过程输出收到的数字。

所以这是我写的代码。

#include "mpi.h"
#include <stdio.h>
#include "pt4.h"

int main(int argc, char *argv[])
{
    MPI_Init(&argc,&argv);
    int flag;
    MPI_Initialized(&flag);
    if (flag == 0)
        return;
    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    double n;
    pt >> n; // pt is a stream provided by side library (works perfectly fine)

    int oppositeRank = (size - 1) - rank;

    if (rank != oppositeRank)
    {
        MPI_Status status;
        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                             rank, 0, MPI_COMM_WORLD, &status);
    }

    pt << n;
    MPI_Finalize();
    return 0;
}

尽管此代码编译没有任何问题,但它永远不会停止。所以问题是为什么?我究竟做错了什么?

1 个答案:

答案 0 :(得分:8)

替换它:

        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                         rank, 0, MPI_COMM_WORLD, &status);

用这个:

        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                         oppositeRank, 0, MPI_COMM_WORLD, &status);

您可能会发现this documentation page有用。

此函数将缓冲区发送到处理器(dest或第4个参数)并从另一个(source,第6个参数)接收。要进行交换,您可以发送到另一个等级并从同一等级接收。在你的情况下,你发送到相反的级别并从自己接收,这将永远不会到来,因此陷入僵局。