【发布时间】:2019-09-18 04:59:18
【问题描述】:
我已阅读所有 MPI 文档和教程以及与此相关的 Stack Overflow 问题,但我仍然不完全了解 MPI_Wait 在“完成” MPI_Isend 时的行为方式。我们可以简明扼要地概括一下吗?有吗
- A.对应 Isend 中使用的缓冲区可用时返回 再次(我认为是的,但这并不能告诉我我想要的一切 知道)。
- 乙。对应的 Recv 完成时返回(我认为不是 必然,但有时如果消息很大?)
- C.保证Recv在返回后的某个时间可以被接收进程完成
我问是因为我正在尝试实现一种非阻塞广播(因为 MPI_Ibcast 是 MPI 3 的东西,并且在我实际遇到的任何实现中似乎都不存在)。我目前在每个过程中遵循的顺序是这样的:
-
MPI_Isend从每个进程到每个其他进程 - 做一些其他的工作
-
MPI_Wait表示所有的“完成”,无论这意味着什么 -
MPI_Recv所有消息
这在实践中似乎工作正常,但我不知道它是否保证可以工作,或者我是否很幸运,因为我的消息很小(它们每个只有一个 int,所以我怀疑它们会被 MPI 迅速洗牌到一些内部缓冲区或其他任何东西中)。我不知道如果消息更大,这是否会造成死锁(我担心在这种情况下并非所有 MPI_Waits 都会返回,因为有些可能会死锁等待 MPI_Recvs 在另一个进程上发生)。
如果不能保证这通常可以正常工作,那么至少可以保证对非常小的消息有效吗?或者这不一定是真的?我真的不确定我可以在这里指望什么。
如果这不能保证有效,那么如何实现非阻塞广播?也许有一些巧妙的顺序来执行等待和接收?就像第一个 rank 0 等待 rank 1 到 Recv,然后 rank 1 等待 rank 0 到 Recv?这样的交换配对安排是否更正确?
【问题讨论】:
-
A 并且只有 A。如果消息足够短,它们可能会以 Eager 模式发送,如果您的 MPI 库实现了进度线程,它们也可能会立即发送。该标准并未强制要求其中任何一项,因此您唯一安全的假设是
MPI_Wait()将在发布匹配的接收后返回。 -
好的,谢谢!好吧,我想我会尝试弄清楚如何订购所有东西,以便那时发生......我猜应该有可能......
-
顺便说一句,Open MPI 和 MPICH 都实现了
MPI_Ibcast() -
好的,下一个问题:我假设 Recv 可以在没有等待发布的情况下完成?这是否意味着我可以在我的订单中交换 (4) 和 (3) 并且应该没问题?
-
您必须交换 4 和 3 以防止死锁。
标签: c++ c mpi nonblocking