MPI_Wait在MPI_Isend后的确切行为是什么?
What is the exact behaviour of MPI_Wait following an MPI_Isend?
我已经阅读了所有与此相关的 MPI 文档和教程以及堆栈溢出问题,但我仍然不完全了解MPI_Wait在"完成"MPI_Isend时的行为。我们能简明扼要地总结一下吗?是吗
- A. 当相应 Isend 中使用的缓冲区可用时返回 再次(我认为是的,但这并不能告诉我我想要的一切 知道(。
- B.当相应的Recv完成时返回(我认为不是 一定,但有时如果消息很大?
- C. 保证接收过程可以在返回后的某个时间完成接收
我问是因为我正在尝试实现一种非阻塞广播(因为MPI_Ibcast是 MPI 3 的东西,并且在我实际遇到的任何实现中似乎都不存在(。我目前在每个过程中遵循的顺序是这样的:
- 从每个过程到其他过程
MPI_Isend
- 做一些其他工作
MPI_Wait
所有Isents都"完成",无论这到底意味着什么MPI_Recv
所有消息
这在实践中似乎工作正常,但我不知道它是否保证有效,或者我是否只是因为我的消息很小而幸运(它们每个只有一个 int,所以我怀疑它们被 MPI 迅速洗牌到一些内部缓冲区或其他什么(。我不知道如果消息更大,这是否会造成死锁(我担心在这种情况下并非所有MPI_Waits都会返回,因为有些可能会陷入僵局,等待另一个进程发生MPI_Recvs(。
如果这不能保证一般有效,那么它至少可以保证适用于非常小的消息吗?或者连这都不一定是真的?我真的不确定我能在这里指望什么。
如果这不能保证有效,那么如何实现非阻塞广播?也许有一些聪明的顺序来执行等待和Recvs?就像排名 0 等待排名 1 到 Recv,然后排名 1 等待排名 0 到 Recv?像这样的切换配对安排更正确吗?
满足以下条件:
MPI_Isend
后跟MPI_Wait
都完成:
一个。相应
Isend
中使用的缓冲区再次可用。
如果要使用MPI_Issend
和MPI_Wait
:
几乎B.发布相应的 Recv 时返回。
以下情况在MPI_Send
之后是正确的:
C. 保证匹配的Recv 可以在返回后的某个时间由接收过程完成。
在您建议的非阻塞广播中,您必须允许交换 3. 和 4.,否则会出现死锁。也就是说,不能有严格的条件,即 4.发生在 3 之后。由于 3 发生在根目录上,而 4 发生在所有其他等级上,因此甚至可能不是问题。
但是,我建议采用更清洁的方法:
在- 根目录上
MPI_Isend
到所有进程 - 从根目录
MPI_Irecv
**all88 进程 - 做一些其他工作(在所有进程上(
MPI_Waitall
所有排名上所有已发布的请求(send
/recv
(
这应该干净,实现起来并且工作得很好。当然,这不是一个优化的集体...但这是另一个话题。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用Boost.MPI库的目的是什么
- 提升 mpi 请求m_handler的目的是什么
- 将 MPI 与线程一起使用的正确方法是什么