我认为唯一的原因 任何 需要MPI任务之间的通信是访问 d_t[i-1] 和 i+1 分别在细分的开始和结束时。
d_t[i-1]
i+1
如果您没有交换数据,那么您将阅读此任务未重新计算的陈旧元素。
但不是全部同步, 的 每个任务只需要将其段的开头发送到之前处理该段的任务。 (同样,它的细分到下一个等级)。 强>
通过发送/接收执行此操作。
的 更好的是,有细分 交叠 最后一点,所以你可以减少沟通 强> 。 “错误的”数据每个外循环迭代将传播1个元素,因此8个元素(1个32字节AVX向量)的重叠应该意味着您只需要每8次迭代进行一次通信。
的 理想情况下,我们可以管理消息以隐藏网络延迟 强> 。与千兆位以太网上的机器之间的延迟相比,计算速度非常快(1微秒= 3GHz时约3000个时钟周期= ~48k浮点FMA操作,假设每个时钟FMA为2个,32字节向量= Haswell / Skyake的理论最大吞吐量)。所以我认为让接收器复制一些关于这些元素的工作是一个不错的选择。
如果每12次迭代发送16个元素(每个在开始/结束时),但在调用receive之前发送2个外循环迭代,则在收到它时将过时2次迭代。 (实际上,如果可以避免破坏自动向量化和OMP自动并行化,则展开外部循环或使用嵌套循环。)
但是这很好,与段的整个大小相比,接收方需要花费大量时间对该数据运行额外的2次迭代并将其捕获。如果任务在发送时保存它们的2个元素,则它们可以将其与接收的块组合以需要2个更少的重叠元素,最终在接收侧使用> = 13个数组元素。
调试时,您可能希望至少有一个额外的重叠元素,这样你就可以 assert 多余的元素是 == 彼此。 (包括验证您的代码是否以相同的方式进行优化,通过收缩倍增+添加到FMA中.IEEE FP数学是确定性的,但编译器有一定的自由......)
assert
==