【问题标题】:How to use MPI to organize asynchronous communication?如何使用 MPI 组织异步通信?
【发布时间】:2011-04-17 12:11:21
【问题描述】:

我打算使用 MPI 来构建一个支持异步通信的求解器。基本思路如下。

假设有两个并行进程。流程 1 希望定期将找到的好的解决方案发送给流程 2,并在需要多样化时从流程 2 中寻求好的解决方案。

  1. 在某些时候,进程 1 使用 MPI_send 向进程 2 发送解决方案。如何保证有一个 MPI_Rev 与此 MPI_Send 匹配,因为此发送是动态触发的?

  2. 当进程 1 需要解决方案时,如何向进程 2 发送请求,进程 2 会及时注意到它的请求?

【问题讨论】:

  • “保证”每个 MPI_Send 都会有一个匹配的 MPI_Recv 的方法是构造代码,这样就会发生这种情况。您可以使用 MPI_Barrier 来同步这两个过程,并在已知点交换解决方案集。

标签: mpi


【解决方案1】:

有三种方法可以实现你想要的,虽然它不是真正的异步通信。

1) 使用非阻塞发送/接收。用 irecv/isend 替换您的 send/recv 调用并等待。发件人可以发出 isend 并继续处理下一个问题。在某些时候,您将不得不发出 mpi-wait 以确保收到您之前的发送。您的 process2 可以使用 irecv 提前发出 recv 并继续工作。同样,在某些时候,您将调用 mpi-wait 以确保收到您的 irecv。如果我正确理解您的要求,这可能会有点麻烦。

2) 一种优雅的方式是使用单面通信。 MPI_Put,获取。

3) 以这样的方式重构你的算法,在特定的时间间隔内,进程 1 和 2 交换信息和状态。

【讨论】:

    【解决方案2】:

    根据您调用的 MPI_* 函数的性质,发送将阻塞,直到另一个进程调用了匹配的接收,因此您需要确保在您的代码中会发生这种情况。 还有非阻塞函数调用 MPI_Isend f.ex,它为您提供了一个请求句柄,您可以稍后检查以查看进程的发送是否已被匹配的接收接收。

    关于您的问题,您可以发出非阻塞接收(MPI_Irecv 是最基本的)并根据您的应用程序每 n 秒检查一次状态。当收到一条消息并准备好阅读时,状态将设置为完成。

    如果对时间敏感,请在等待消息时使用阻塞呼叫。然而,阻塞机制(至少在 OpenMPI 中)使用旋转轮询,因此等待进程将占用 100% 的 cpu。

    【讨论】:

    • 感谢您的建议。其实我更关心的是接收进程如何检测到有消息来了?使用while循环一直检查?有没有更好的办法?
    • np :) 是的,使用最简单的单次发送到单次接收的范例,您可以设置一个您负责检查的异步接收,或者使用一个阻塞调用,当有一条新消息。阻塞时,OpenMPI 只做忙等待(在阻塞时占用 100% CPU 以获得最佳通信性能),但 MPICH2 可以配置为阻塞并等待中断,更容易占用 CPU。
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多