非阻塞MPI调用的抽象实现

非阻塞MPI调用的抽象实现,mpi,Mpi,非阻塞发送/接收立即在MPI中返回,操作在后台完成。我看到这种情况发生的唯一方式是,当前进程/线程调用/创建另一个进程/线程,并将send/recv代码的映像加载到该进程/线程中,然后自身返回。然后这个新进程/线程完成这个操作,并在等待/测试返回的地方设置一个标志。我说的对吗?您是否在问,如果一个单独的消息处理线程是非阻塞操作的唯一解决方案 如果是这样,答案是否定的。我甚至认为,许多设置使用不同的策略。消息处理的进度通常在所有MPI调用期间完成。我建议你看看杰夫·斯奎尔斯的作品 有关更完整的答案

非阻塞发送/接收立即在MPI中返回,操作在后台完成。我看到这种情况发生的唯一方式是,当前进程/线程调用/创建另一个进程/线程,并将send/recv代码的映像加载到该进程/线程中,然后自身返回。然后这个新进程/线程完成这个操作,并在等待/测试返回的地方设置一个标志。我说的对吗?

您是否在问,如果一个单独的消息处理线程是非阻塞操作的唯一解决方案

如果是这样,答案是否定的。我甚至认为,许多设置使用不同的策略。消息处理的进度通常在所有MPI调用期间完成。我建议你看看杰夫·斯奎尔斯的作品


有关更完整的答案,请参阅韦斯利·布兰德的答案。

有两种方法可以取得进展:

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

  • 在其他MPI调用中。这是更常见的操作方式,也是我认为大多数实现的默认方式。在这个版本中,非阻塞调用是在您启动调用(
    MPI_I
    )时启动的,并且基本上被添加到内部队列中。在您稍后对MPI进行另一次调用之前,该调用(可能)不会发生任何事情,而该调用实际上会执行一些阻塞通信(或等待以前的非阻塞调用完成)。当您输入未来的MPI调用时,除了执行您要求它执行的任何操作外,它还将运行进度引擎(与版本1中线程中运行的操作相同)。根据应该发生的MPI调用正在执行的操作,进度引擎可能会运行一段时间,也可能只运行一次。例如,如果您在
    MPI\u-IRECV
    上调用了
    MPI\u WAIT
    ,您将一直呆在进度引擎中,直到收到等待的消息。如果您只是在做一个
    MPI\u测试
    ,它可能只是在进度引擎中循环一次,然后跳出

  • 更奇特的方法。正如Jeff在他的帖子中提到的,有更多奇特的方法依赖于您运行的硬件。您可能有一个NIC,它可以在后台移动消息或以其他方式加快MPI调用,从而为您带来一些魔力。一般来说,这些都非常特定于您运行的实现和硬件,因此如果您想了解更多关于它们的信息,您需要在问题中更加具体


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

    这是一篇复杂的文章,但他确实指出,硬件协助传递消息是一个可行的解决方案。这回答了我的问题。非常感谢。但是,如果有人能用easy语言解释实现这个“进程”的不同“方法”,那就太好了。嗯,不确定我是否是回答这个问题的正确人选,因为我不负责MPI实现,但基本上,问题是,在任何MPI调用期间都会完成未决通信的工作。因此,无论何时调用MPI,它都可能会执行挂起的通信操作,这些操作与当前的实际调用无关。感谢您详细的回答!