非阻塞MPI调用的抽象实现

5

在MPI中,非阻塞式发送/接收立即返回,并在后台完成操作。我所能想到的唯一方式是当前进程/线程调用/创建另一个进程/线程,并将发送/接收代码的映像加载到其中,然后它本身返回。然后,这个新的进程/线程完成此操作并设置标志,等待/测试函数返回。我理解正确吗?

2个回答

7
有两种进展的方式:
  1. 在另一个线程中。这通常是大多数MPI实现中的选项(通常在配置/编译时)。在此版本中,正如您所推测的那样,MPI实现具有运行单独的进度引擎的另一个线程。该线程管理所有MPI消息和发送/接收数据。如果您没有使用计算机上的所有内核,这种方式可以很好地工作,因为它在后台进行进度而不会增加其他MPI调用的开销。

  2. 在其他MPI调用中。这是更常见的做法,也是大多数实现的默认值。在此版本中,当您启动调用(MPI_I<something>)时,非阻塞调用将被启动,基本上添加到内部队列中。在该调用上什么都不会发生,直到您稍后执行另一个实际执行一些阻塞通信(或等待先前非阻塞调用完成)的MPI调用。当您进入未来的MPI调用时,除了执行您要求它执行的任何操作外,它还将运行进度引擎(也就是在版本#1中运行的东西)。根据正在发生的MPI调用的内容,进度引擎可能会运行一段时间,也可能只运行一次。例如,如果您在MPI_IRECV上调用了MPI_WAIT,则将保留在进度引擎中,直到接收到您正在等待的消息。如果您只是执行一个MPI_TEST,它可能只会循环运行一次进度引擎,然后跳回。

  3. 更多奇特的方法。正如Jeff在他的文章中提到的那样,还有更多依赖于您运行的硬件的奇异方法。您可能有一个NIC,可以以某种方式在后台移动消息或其他方式来加快MPI调用。通常,这些非常特定于实现和您运行的硬件,因此,如果您想了解更多信息,您需要在问题上更具体。

所有这些都特定于您的实现,但大多数实现都以某种类似的方式工作。


感谢您详细的回答! - Gaurav Saxena

4
您是否在询问,对于非阻塞操作,是否只有为消息处理创建一个单独的线程才是解决方案?
如果是这样,答案是否定的。我认为许多设置使用不同的策略。通常,消息处理的进展是在所有MPI调用期间完成的。我建议您查看Jeff Squyres的博客文章
查看Wesley Bland的回答以获取更完整的答案。

这是一个复杂的帖子,但是是的,他确实指出硬件辅助传递消息是可行的解决方案。那回答了我的问题。谢谢! - Gaurav Saxena
但如果有人能用简单的语言解释实现这种“进展”的不同“方法”,那就太好了。 - Gaurav Saxena
我不确定自己是否是正确的回答者,因为我并没有在MPI实现方面工作。但基本上,问题在于任何MPI调用期间都会处理挂起通信的工作。因此,每当您调用MPI时,它可能会推进与当前调用无关的挂起通信操作。 - haraldkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接