非阻塞发送/接收在MPI中立即返回,操作在后台完成。我看到发生这种情况的唯一方法是当前进程/线程调用/创建另一个进程/线程并将send / recv代码的图像加载到其自身返回。然后,这个新进程/线程完成此操作并在Wait / Test返回的某处设置一个标志。我是对的吗?
答案 0 :(得分:7)
有两种方法可以取得进展:
在一个单独的线程中。这通常是大多数MPI实现中的一个选项(通常在配置/编译时)。在这个版本中,正如您推测的那样,MPI实现有另一个运行单独进度引擎的线程。该线程管理所有MPI消息和发送/接收数据。如果您没有使用计算机上的所有核心,这种方式很有效,因为它可以在后台进行,而不会增加其他MPI呼叫的开销。
在其他MPI调用中。这是更常见的处理方式,并且是我认为的大多数实现的默认方式。在此版本中,当您启动调用(MPI_I<something>
)时,将启动非阻塞调用,并且基本上将其添加到内部队列。在您之后再次调用MPI(实际上会执行某些阻塞通信(或等待以前的非阻塞调用完成)之前,该调用不会发生任何事情(可能)。当您输入未来的MPI调用时,除了执行您要求它执行的操作之外,它还将运行进度引擎(与在版本#1中的线程中运行的内容相同)。根据应该发生的MPI调用正在进行的操作,进度引擎可能会运行一段时间或者可能只运行一次。例如,如果您在MPI_WAIT
上调用MPI_IRECV
,则会保留在进度引擎中,直到您收到正在等待的消息为止。如果您只是在执行MPI_TEST
,它可能只需循环一次进度引擎,然后跳回去。
更多奇特的方法。正如杰夫在帖子中提到的那样,有更多奇特的方法依赖于您运行的硬件。您可能有一个NIC,可以在后台移动您的消息或其他方式加速您的MPI呼叫,为您做一些魔术。一般来说,这些对于您正在运行的实现和硬件非常具体,因此如果您想了解更多有关它们的信息,您需要在问题中更加具体。
所有这一切都是针对您的实施的,但大多数都以某种方式与此类似。
答案 1 :(得分:4)
您是否在询问,如果用于消息处理的单独线程是非阻塞操作的唯一解决方案?
如果是这样,答案是否定的。我甚至认为,许多设置使用不同的策略。通常,在所有MPI呼叫期间完成消息处理的进度。我建议你看看Jeff Squyres的这个Blog entry。
请参阅Wesley Bland的答案,以获得更完整的答案。