非阻塞MPI调用的抽象实现
非阻塞发送/接收立即在MPI中返回,操作在后台完成。我看到这种情况发生的唯一方式是,当前进程/线程调用/创建另一个进程/线程,并将send/recv代码的映像加载到该进程/线程中,然后自身返回。然后这个新进程/线程完成这个操作,并在等待/测试返回的地方设置一个标志。我说的对吗?您是否在问,如果一个单独的消息处理线程是非阻塞操作的唯一解决方案 如果是这样,答案是否定的。我甚至认为,许多设置使用不同的策略。消息处理的进度通常在所有MPI调用期间完成。我建议你看看杰夫·斯奎尔斯的作品非阻塞MPI调用的抽象实现,mpi,Mpi,非阻塞发送/接收立即在MPI中返回,操作在后台完成。我看到这种情况发生的唯一方式是,当前进程/线程调用/创建另一个进程/线程,并将send/recv代码的映像加载到该进程/线程中,然后自身返回。然后这个新进程/线程完成这个操作,并在等待/测试返回的地方设置一个标志。我说的对吗?您是否在问,如果一个单独的消息处理线程是非阻塞操作的唯一解决方案 如果是这样,答案是否定的。我甚至认为,许多设置使用不同的策略。消息处理的进度通常在所有MPI调用期间完成。我建议你看看杰夫·斯奎尔斯的作品 有关更完整的答案
有关更完整的答案,请参阅韦斯利·布兰德的答案。有两种方法可以取得进展:
MPI_I
)时启动的,并且基本上被添加到内部队列中。在您稍后对MPI进行另一次调用之前,该调用(可能)不会发生任何事情,而该调用实际上会执行一些阻塞通信(或等待以前的非阻塞调用完成)。当您输入未来的MPI调用时,除了执行您要求它执行的任何操作外,它还将运行进度引擎(与版本1中线程中运行的操作相同)。根据应该发生的MPI调用正在执行的操作,进度引擎可能会运行一段时间,也可能只运行一次。例如,如果您在MPI\u-IRECV
上调用了MPI\u WAIT
,您将一直呆在进度引擎中,直到收到等待的消息。如果您只是在做一个MPI\u测试
,它可能只是在进度引擎中循环一次,然后跳出所有这些都是特定于您的实现的,但大多数都以类似的方式工作。这是一篇复杂的文章,但他确实指出,硬件协助传递消息是一个可行的解决方案。这回答了我的问题。非常感谢。但是,如果有人能用easy语言解释实现这个“进程”的不同“方法”,那就太好了。嗯,不确定我是否是回答这个问题的正确人选,因为我不负责MPI实现,但基本上,问题是,在任何MPI调用期间都会完成未决通信的工作。因此,无论何时调用MPI,它都可能会执行挂起的通信操作,这些操作与当前的实际调用无关。感谢您详细的回答!