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