我正在使用 MPI 编写一个并行应用程序,其中主进程的数据大小大约与缓存一样大(在我正在处理的平台上为 4MB)以发送到每个进程。由于 4MB 对于 master 一次发送可能太大,因此有必要将整个数据分成适合发送和接收的特定大小的较小块。
我的问题是,考虑到整个数据的大小,对于发送和接收每个较小块的最佳大小有什么建议吗?
谢谢。
4MB 对于任何 MPI 实现都不会有任何问题;不过,我不确定您所说的“太大”是什么意思。
一条经验法则是,如果您可以轻松地在一条消息中发送所有数据,那通常会更快——原因是发送和接收任何一条消息(延迟)都需要一定的时间来自函数调用、对传输层的调用等。最重要的是,发送任何额外的数据字节需要花费一些时间,通常接近固定的时间量(超过带宽的一个字节)。只是对处理器之间发送消息(尤其是大消息)的实际复杂性的非常粗略的近似,但它是一个非常有用的近似。在该模型中,您发送的消息越少越好,因为您产生的延迟开销更少。
如果您打算发送许多小消息,上述情况几乎总是正确的;但是,如果您谈论的是发送(例如)4 条 1MB 消息与 1 条 4MB 消息,即使在该模型下,差异也可能很小,并且可能会被特定于您的传输的其他效果所淹没。如果您想更准确地评估您的平台需要多长时间,那么对于实际需要多长时间的经验测量确实没有替代品。最好的方法就是在你的代码中尝试几种方法,看看什么是最好的。这真的是唯一确定的答案。第二种方法是查看 MPI“微基准”:
以上两项都包括发送和接收各种大小的消息所需时间的基准;你用你的 MPI 编译上面的内容,你可以简单地读出发送/接收(比如)4MB 消息与 4x 1MB 消息需要多长时间,这可能会给你一些关于如何继续的线索。