我正在完成作业后的作业:
每个进程都需要一个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;
}
尽管此代码编译没有任何问题,但它永远不会停止。所以问题是为什么?我究竟做错了什么?
答案 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个参数)接收。要进行交换,您可以发送到另一个等级并从同一等级接收。在你的情况下,你发送到相反的级别并从自己接收,这将永远不会到来,因此陷入僵局。