我正在完成作业后的作业:
每个进程都需要一个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;
}
Run Code Online (Sandbox Code Playgroud)
虽然这段代码编译没有任何问题,但它永远不会停止.所以问题是为什么?我究竟做错了什么?
替换这个:
MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0,
rank, 0, MPI_COMM_WORLD, &status);
Run Code Online (Sandbox Code Playgroud)
有了这个:
MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0,
oppositeRank, 0, MPI_COMM_WORLD, &status);
Run Code Online (Sandbox Code Playgroud)
您可能会发现此文档页面很有用.
此函数将缓冲区发送到处理器(dest或第4个参数)并从另一个(source第6个参数)接收.要进行交换,您可以发送到另一个等级并从同一等级接收.在你的情况下,你发送到相反的级别并从自己接收,这将永远不会来,因此僵局.