我计划使用MPI构建支持异步通信的解算器。基本思路如下。
假设有两个并行进程。流程1希望定期向流程2发送好的解决方案,并在需要多样化时从流程2中寻求好的解决方案。
在某些时候,流程1使用MPI_send
向流程2发送解决方案。如何保证MPI_Rev
匹配此MPI_Send
,因为此次发送已触发动态?
当流程1需要解决方案时,如何向流程2发送请求,流程2会及时发现其请求?
答案 0 :(得分:3)
有三种方法可以实现您的目标,尽管它不是真正的异步通信。
1)使用非阻塞发送/接收。用irecv / isend替换你的send / recv调用并等待。发件人可以发出一个isend并继续处理下一个问题。在某些时候,您将不得不发出一个mpi-wait以确保收到您之前的发送。您的process2可以使用irecv提前发出recv并继续执行其工作。再次,在某些时候你会调用mpi-wait以确保收到你的irecv。如果我理解你的要求,这可能有点麻烦。
2)优雅的方式是使用单面通信。 MPI_Put,Get。
3)以一定的时间间隔重构算法,过程1和过程1。 2交换信息和状态。
答案 1 :(得分:1)
根据您调用的MPI_ *函数的性质,发送将阻塞,直到另一个进程调用了匹配的接收,因此您需要确保在您的代码中发生这种情况。 还有非阻塞函数调用MPI_Isend f.ex,它为您提供了一个请求句柄,您可以稍后检查该句柄,以查看匹配的接收是否已收到进程'send。
关于您的问题,您可以发出非阻塞接收(MPI_Irecv是最基本的接收)并根据您的应用程序每n秒检查一次状态。然后,当收到消息并准备好读取时,状态将设置为完成。
如果时间敏感,请在等待消息时使用阻止呼叫。阻塞机制(至少在OpenMPI中)使用旋转轮询,因此等待进程将占用100%cpu。