gpt4 book ai didi

c++ - MPI_Sendrecv_replace() 死锁问题

转载 作者:太空狗 更新时间:2023-10-29 20:04:35 26 4
gpt4 key购买 nike

我正在完成以下作业:

Every process takes a double as an input. Using function MPI_Sendrecv_replace() swap all doubles with processes of opposite rank (first & last, second & last but one, ...). In every process output recieved number.

这是我编写的代码。

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

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

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

关于c++ - MPI_Sendrecv_replace() 死锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18865663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com