我最初使用MPI_Send与MPI_Irecv配对,但我最近发现MPI_Send可能会阻塞,直到收到消息。所以,我正在改为MPI_Isend,我需要向N个不同的处理器发送相同的消息。假设缓冲区稍后会被销毁,我是否应该在循环中使用带有MPI_Isend和MPI_Wait的for循环,或者我应该在循环之后使用MPI_Waitall创建一个请求数组并且只有MPI_Isend?
答案 0 :(得分:2)
由于它是相同的消息,您应该能够使用MPI_Bcast。您只需要创建一个新的通信器来定义一个进程子组。
答案 1 :(得分:2)
为了将相同的缓冲区分配给“n”个远程等级,MPI_Bcast是“明显的”选择。除非你有一些“压倒性”的理由要避免MPI_Bcast,否则建议使用它。通常,MPI_Bcast通过所有主要的MPI实现进行了很好的优化。
如果阻塞是个问题,MPI 3.0 Standard会引入MPI_IBcast以及其他非阻塞集合。非阻塞集合体的初始实现似乎是“天真的”并且构建为非阻塞点对点例程的包装器(例如,MPI_IBcast被实现为对MPI_ISend和MPI_IRecv的调用的包装器)。在未来一两年内,这些实施可能会提高质量 - 部分取决于MPI应用程序开发人员社区的采用速度。
MPI_Send将“阻塞”,直到调用应用程序可以安全地重新使用发送缓冲区。关于相应的MPI_ [I] Recv的状态没有任何保证。
如果您需要非阻塞,那么最好的建议是在循环中调用MPI_ISend。或者,如果这是一个将在程序过程中重复的消息模式,则持久性请求可以与MPI_Start或MPI_Startall一起使用。 Persistent communication requests.