在MPI中,非阻塞式发送/接收立即返回,并在后台完成操作。我所能想到的唯一方式是当前进程/线程调用/创建另一个进程/线程,并将发送/接收代码的映像加载到其中,然后它本身返回。然后,这个新的进程/线程完成此操作并设置标志,等待/测试函数返回。我理解正确吗?
在MPI中,非阻塞式发送/接收立即返回,并在后台完成操作。我所能想到的唯一方式是当前进程/线程调用/创建另一个进程/线程,并将发送/接收代码的映像加载到其中,然后它本身返回。然后,这个新的进程/线程完成此操作并设置标志,等待/测试函数返回。我理解正确吗?
在另一个线程中。这通常是大多数MPI实现中的选项(通常在配置/编译时)。在此版本中,正如您所推测的那样,MPI实现具有运行单独的进度引擎的另一个线程。该线程管理所有MPI消息和发送/接收数据。如果您没有使用计算机上的所有内核,这种方式可以很好地工作,因为它在后台进行进度而不会增加其他MPI调用的开销。
在其他MPI调用中。这是更常见的做法,也是大多数实现的默认值。在此版本中,当您启动调用(MPI_I<something>
)时,非阻塞调用将被启动,基本上添加到内部队列中。在该调用上什么都不会发生,直到您稍后执行另一个实际执行一些阻塞通信(或等待先前非阻塞调用完成)的MPI调用。当您进入未来的MPI调用时,除了执行您要求它执行的任何操作外,它还将运行进度引擎(也就是在版本#1中运行的东西)。根据正在发生的MPI调用的内容,进度引擎可能会运行一段时间,也可能只运行一次。例如,如果您在MPI_IRECV
上调用了MPI_WAIT
,则将保留在进度引擎中,直到接收到您正在等待的消息。如果您只是执行一个MPI_TEST
,它可能只会循环运行一次进度引擎,然后跳回。
更多奇特的方法。正如Jeff在他的文章中提到的那样,还有更多依赖于您运行的硬件的奇异方法。您可能有一个NIC,可以以某种方式在后台移动消息或其他方式来加快MPI调用。通常,这些非常特定于实现和您运行的硬件,因此,如果您想了解更多信息,您需要在问题上更具体。
所有这些都特定于您的实现,但大多数实现都以某种类似的方式工作。