探测 MPI_Bcast 或 MPI_Send

Posted

技术标签:

【中文标题】探测 MPI_Bcast 或 MPI_Send【英文标题】:Probe for MPI_Bcast or MPI_Send 【发布时间】:2012-06-16 08:44:01 【问题描述】:

我有一个程序,其中有一个主/从设置,并且我为主实现了一些功能,这些功能向从属发送不同类型的数据。一些函数发送给单个从站,但一些函数通过 MPI_Bcast 向所有从站广播信息。

我想在从站中只有一个接收功能,所以我想知道我是否可以探测一条消息并知道它是作为正常阻塞消息广播还是发送,因为有不同的方法来接收什么是广播和正常发送的内容。

【问题讨论】:

【参考方案1】:

不,您无法根据探测调用决定是调用 Bcast 还是 Recv。

一个 MPI_Bcast 调用是一个集体操作——所有 MPI 任务都必须参与。结果,这些不像点对点通信;他们利用所有进程都参与的事实来进行高阶优化。

因为集体操作意味着如此多的同步,所以让其他任务检查它们是否应该开始参与集体是没有意义的;这是必须内置到程序逻辑中的东西。

根进程在广播中的角色与发送不同;一般来说,它不能只调用 MPI_Bcast 然后继续。实现几乎肯定会阻塞,直到一些其他数量的进程参与广播;和

另一个进程在广播中的作用与接收消息不同;一般来说,它将同时接收和发送信息。所以参与广播不同于进行简单的 Recv 调用。

所以探针不起作用; the documentation for MPI_Probe 很清楚,它返回有关下一次 MPI_Recv 会发生什么的信息,并且 Recv 是与 Bcast 不同的操作。

您可能能够在 MPI 3.0 中获得一些您想要的东西,该版本现在正在完成,它允许非阻塞集合 - 例如,MPI_Ibcast。在这种情况下,您可以启动广播并调用 MPI_Test 来检查请求的状态。然而,即使在这里,每个人都需要先调用 MPI_Ibcast;这只允许更轻松地交错集体和点对点通信。

【讨论】:

感谢您的回复!我想我可以通过在广播之前向所有从站发送一条阻塞消息来解决这个问题,该消息带有一个标签,告诉接收函数“准备”广播。我正在将一个项目从 PVM 迁移到 MPI,在 PVM 中他们有一个名为 pvm_mcast 的函数,它的行为类似于 MPI_Bcast,但你可以通过非阻塞接收来接收它,如果 MPI 中有类似的东西,它只是在徘徊。我将阅读一些关于非阻塞集体的内容。 pvm_mcastMPI_Bcast 不同。它是一种多播操作,而不是广播操作,其语义类似于您发出多个MPI_Send 操作所获得的内容。它允许您将数据发送到任意进程子集,而MPI_Bcast 将数据发送到 all 进程,并允许进行一些更高级别的优化。如果原始代码没有使用pvm_mcast 来执行完整的广播,那么最好只使用一堆MPI_Isend,然后是MPI_Waitall。然后你就可以进行探测了。 谢谢,我想我现在已经完全掌握了 pvm_mcast 的概念以及它与 MPI_Bcast 相比的功能。

以上是关于探测 MPI_Bcast 或 MPI_Send的主要内容,如果未能解决你的问题,请参考以下文章

冲突解决:二次探测与单独链接

Nmap原理02 - 版本探测介绍(上)

哈希算法(一次探测,二次探测,哈希桶法)支持字典查询

火星探险问题 网络流

水下探测器_题解

主动信息收集