如何使用MPI组织异步通信?

如何使用MPI组织异步通信?,mpi,Mpi,我计划使用MPI构建一个支持异步通信的解算器。基本思路如下 假设有两个并行进程。流程1希望定期向流程2发送找到的好的解决方案,并在需要多样化时向流程2请求好的解决方案 在某些情况下,流程1使用MPI\u send向流程2发送解决方案。由于此发送是动态触发的,如何保证有一个与此MPI\u发送匹配的MPI\u Rev 当流程1需要解决方案时,它如何向流程2发送请求,而流程2将及时通知其请求 根据您调用的MPI_*函数的性质,发送将阻塞,直到另一个进程调用了匹配的接收,因此您需要确保代码中会发生这种情

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

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

  • 在某些情况下,流程1使用
    MPI\u send
    向流程2发送解决方案。由于此发送是动态触发的,如何保证有一个与此
    MPI\u发送匹配的
    MPI\u Rev

  • 当流程1需要解决方案时,它如何向流程2发送请求,而流程2将及时通知其请求


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

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


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

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

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

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


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

    谢谢你的建议。事实上,我更关心的是接收过程如何检测是否有消息到来?使用while循环始终进行检查?有更好的方法吗?np:)是的,使用单发送到单接收的最简单范例,您可以设置一个异步接收,负责检查,或者使用阻塞调用,当出现新消息时,该调用将立即返回。阻塞时,OpenMPI只执行忙等待(阻塞时消耗100%的CPU以获得最佳通信性能),但MPICH2可以配置为阻塞并等待中断,这在CPU上更容易实现。要“保证”每个MPI_发送都有一个匹配的MPI_Recv,方法是构造代码,这样就可以实现。您可以使用MPI_屏障来同步这两个进程,并在已知点交换解决方案集。