7

关于 MPI_Isend,MPI 标准说“非阻塞发送调用表示系统可能开始将数据复制出发送缓冲区。在调用非阻塞发送操作后,发送方不应访问发送缓冲区的任何部分,直到发送完成。 " (http://www.mpi-forum.org/docs/mpi-11-html/node46.html

在另一个发送调用中引用发送缓冲区是否正常,或者是否包含在“访问发送缓冲区的任何部分”中?

换句话说,以下发件人的 C 代码是否正确?

MPI_Request req[2];
MPI_Status statuses[2];
...
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]);
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]);
MPI_Waitall(2, req, statuses);
4

2 回答 2

3

MPI 标准确实允许这种用法。

如果有更多的“少数”等级需要相同的缓冲区,或者如果这种通信模式将重复超过“少数”次......那么创建一个具有相关等级的通信,并使用 MPI_Bcast 将是更可取。

编辑:

澄清我自己的答案。MPI 2.0 标准明确禁止这种用法。限制是为了适应 F​​ortran。MPI 2.1 或 2.2 标准包括一个“澄清”,即在多个 ISend 中重复使用发送缓冲区是允许的。有关更多信息,请参阅 MPI 2.2 标准的第 16.2.2 节。

于 2013-06-13T03:03:17.613 回答
3

我刚刚查阅了MPI 3.0 标准,发现如下信息:

非阻塞发送调用表明系统可能开始从发送缓冲区复制数据。在调用非阻塞发送操作后,发送方不应修改发送缓冲区的任何部分,直到发送完成。

然而,我最近参加了由该标准的一些开发人员提供的关于 MPI 3.0 的教程,其中提到,根据 MPI 实现(MPICH、LAM 等),访问在在发送完成之前,可以从 Isend 过程修改作为缓冲区的非阻塞通信调用。换言之,可能无法保证第二个 MPI_Isend 中的缓冲区与第一个发送中的缓冲区相同。为了确定这一点,我会查阅您的实现源代码。

于 2013-06-14T18:04:26.583 回答