1

我最初使用 MPI_Send 与 MPI_Irecv 配对,但我最近发现 MPI_Send 可能会阻塞,直到收到消息。因此,我将更改为 MPI_Isend,我需要将相同的消息发送到 N 个不同的处理器。假设缓冲区稍后会被破坏,我应该在循环中有一个带有 MPI_Isend 和 MPI_Wait 的 for 循环,还是应该在循环后使用 MPI_Waitall 制作一个请求数组并且只有 MPI_Isend 在循环中?

4

2 回答 2

2

由于它的消息相同,您应该能够使用MPI_Bcast。您只需要创建一个新的通信器来定义一个进程子组。

于 2013-04-11T19:36:24.847 回答
2

为了将相同的缓冲区分配给“n”个远程队列,MPI_Bcast 是“显而易见的”选择。除非您有一些“压倒性”的理由来避免使用 MPI_Bcast,否则建议使用它。通常,所有主要 MPI 实现都对 MPI_Bcast 进行了很好的优化。

如果阻塞是一个问题,MPI 3.0 标准引入了 MPI_IBcast 以及其他非阻塞集合。非阻塞集合的初始实现似乎是“幼稚的”,并且构建为非阻塞点对点例程的包装器(例如,MPI_IBcast 被实现为对 MPI_ISend 和 MPI_IRecv 调用的包装器)。在接下来的一两年内,实施的质量可能会有所提高——部分取决于 MPI 应用程序开发人员社区的采用速度。

MPI_Send 将“阻塞”,直到调用应用程序可以安全地重新使用发送缓冲区。对相应 MPI_[I]Recv 的状态没有任何保证。

如果您需要非阻塞,那么最好的建议是在循环中调用 MPI_ISend。或者,持久请求可以与 MPI_Start 或 MPI_Startall 一起使用,如果这是一个将在程序过程中重复的消息模式。 持续的通信请求。

于 2013-04-12T15:27:21.120 回答