【问题标题】:Ok to call MPI_Isend multiple times on one buffer?可以在一个缓冲区上多次调用 MPI_Isend 吗?
【发布时间】:2013-06-09 02:51:56
【问题描述】:

关于 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);

【问题讨论】:

  • 我在这里猜测,这就是为什么这不是一个完整的答案,你真正不想做的是修改源缓冲区的内容或读取发送完成之前的目标缓冲区。所以对我来说,你在做什么看起来不错。但请测试。不要相信我的话。
  • @bob.sacamento 当然,这是真的。而且我知道我的代码对于我正在使用的 MPI 实现是正确的(查看源代码),但我想知道根据标准这是否正确,即适用于 MPI 的每个正确实现。

标签: mpi message-passing


【解决方案1】:

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

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

编辑:

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

【讨论】:

  • 谢谢。 MPI 2.2 标准的那部分很有启发性。
【解决方案2】:

刚刚咨询了MPI 3.0 Standard,发现如下信息:

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

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

【讨论】:

  • 嗯,这就是我害怕的。标准是否指定发送完成时的发送缓冲区必须未经修改地“返回”给应用程序,或者它们可以被修改?我只是看不出一个合理的实现将如何通过实际修改发送缓冲区而受益。
  • 实现不一定要修改缓冲区,但确实需要确保缓冲区在复制/发送时不会更改。
猜你喜欢
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多