2010-09-26 232 views
3

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

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

  1. 在某些时候,过程1使用MPI_send发送一个解决方案来处理2.如何保证有一个MPI_Rev匹配这个MPI_Send,因为这是发送动态触发?

  2. 当进程1需要解决方案时,如何向进程2发送请求,进程2是否会及时发现请求?

+0

“保证”每个MPI_Send将具有匹配的MPI_Recv的方式是构造代码,以便发生什么。您可以使用MPI_Barrier同步这两个进程,并在已知点进行解决方案集的交换。 – 2010-09-29 18:44:41

回答

1

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

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

如果是时间敏感,请在等待消息时使用阻止呼叫。阻塞机制(至少在OpenMPI中)使用旋转轮询,所以等待进程将占用100%cpu。

+0

感谢您的建议。实际上,我更关心接收过程如何检测到有消息传出?使用while循环来检查所有的时间?有更好的方法吗? – Jackie 2010-09-26 22:00:18

+0

np :)是的,使用单个发送到单个接收的最简单范例,您可以设置一个您负责检查的异步接收,或者使用一个阻塞调用,当有新消息时将立即返回。阻塞时,OpenMPI只会忙于等待(为了获得最佳通信性能而阻塞100%的CPU),但MPICH2可配置为阻塞并等待中断,在CPU上更容易。 – 2010-09-27 02:32:51

3

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

1)使用非阻塞send/recvs。用irecv/isend替换您的send/recv呼叫并等待。发件人可以发出isend并继续处理下一个问题。在某些时候,您将不得不发出mpi-wait以确保您的上一次发送已收到。您的process2可以使用irecv提前发布recv并继续执行其工作。同样,在某些时候,你会打电话给mpi-wait来确保你的irecv已经收到。如果我正确理解你的要求,这可能有点麻烦。

2)优雅的方式是使用单面通信。 MPI_Put,Get。

3)重构你的算法,使得在一定的时间间隔内交换信息和状态。