MPI_Sendrecv_replace() 死锁问题
MPI_Sendrecv_replace() dead-lock issue
我正在做作业,以下作业:
每个进程都采用双精度作为输入。使用函数
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 个参数)接收。要进行交换,您发送到另一个等级并从同一等级接收。在你的情况下,你被送到相反的等级并从你自己那里接收,这永远不会到来,因此陷入僵局。
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 如何重现 Boost 进程文档提示的死锁?
- 多线程Windows GUI应用程序中的死锁
- 为什么printf会导致与future.get的死锁,而cout则不会?
- C++中具有阻塞队列和障碍的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 避免并发等待对象中的死锁
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 当用2个螺纹锁定时,将recursive_mutex死锁
- 解决死锁问题,在主线程中等待多个工作线程完成 (C++11)
- 如何理解C++并发操作中同类实例导致死锁的问题
- 通过套接字发送的图像流-服务器死锁问题
- MPI_Sendrecv_replace() 死锁问题
- GTK中线程的死锁问题