非阻塞MPI调用的抽象实现

Gau*_*ena 5 mpi

非阻塞发送/接收在MPI中立即返回,并且操作在后台完成.我看到发生这种情况的唯一方法是当前进程/线程调用/创建另一个进程/线程并将send/recv代码的图像加载到它自身返回.然后,这个新进程/线程完成此操作并在Wait/Test返回的某处设置一个标志.我对么 ?

Wes*_*and 7

有两种方法可以实现进展:

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

  2. 在其他MPI调用中.这是更常见的做事方式,也是我认为的大多数实现的默认方式.在此版本中,当您启动call(MPI_I<something>)并且基本上将其添加到内部队列时,将启动非阻塞调用.在您之后再次调用MPI,实际执行某些阻塞通信(或等待以前的非阻塞调用完成)之前,该调用不会发生任何事情(可能).当您输入未来的MPI调用时,除了执行您要求它执行的操作之外,它还将运行进度引擎(与在版本#1中的线程中运行的内容相同).根据应该发生的MPI调用正在进行的操作,进度引擎可能会运行一段时间或者可能只运行一次.例如,如果你打电话MPI_WAITMPI_IRECV,你将留在进度引擎内,直到你收到你正在等待的消息.如果你只是在做一次MPI_TEST,它可能只是循环一次进度引擎,然后跳回去.

  3. 更奇特的方法.正如杰夫在他的文章中提到的,有更多的奇特方法取决于你运行的硬件.您可能有一个NIC,可以在后台移动您的消息或其他方式加速您的MPI呼叫,为您做一些魔术.一般来说,这些对于您正在运行的实现和硬件非常具体,因此如果您想了解更多有关它们的信息,您需要在问题中更加具体.

所有这些都是特定于您的实现,但大多数都以某种方式与此类似.