MPI_Sendrecv_replace() 死锁问题

MPI_Sendrecv_replace() dead-lock issue

本文关键字:死锁 问题 replace Sendrecv MPI      更新时间:2023-10-16

我正在做作业,以下作业:

每个进程都采用双精度作为输入。使用函数 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;
}

尽管此代码编译没有任何问题,但它永远不会停止。那么问题来了,为什么呢?我做错了什么?

替换这个:

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

您可能会发现此文档页面很有用。

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