3

我正在做以下作业:

每个进程都需要一个 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;
}

虽然这段代码编译没有任何问题,但它永远不会停止。那么问题是为什么?我究竟做错了什么?

4

1 回答 1

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

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

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

于 2013-09-18T07:10:35.873 回答