我的问题在精神上与“通过翻牌计数进行算法分析过时了吗?” . 计算算法中的计算操作数通常用作一阶模型,以帮助理解算法的计算成本。但是,数据移动的单位成本(例如,每次操作的时间)大于处理器周期的成本(参见 Peter Norvig 在此链接上的 PC 上操作的大致时序表)。是否有任何类型的通信分析类似于计算操作的分析?如果不是,是否编写算法并运行它是确定通信成本的唯一(或最有效的方法)?
在分析并行算法时,您如何考虑通信成本?
构建包含 FLOPS、内存带宽和通信的并行代码的性能模型是相当普遍的。此处为 POP (v2) 海洋代码的此类代码建模性能的真实示例;这只是谷歌搜索中出现的第一个。我在回答这个问题时给出了一个简单的例子来说明它是如何工作的:如何减少并行显式有限差分方案的通信瓶颈?
这些性能模型的通信部分通常计算消息的数量和大小,并使用延迟和带宽来估计点对点消息所花费的时间,并带有一些集体的对数因子。
与任何建模练习一样,您可以疯狂地在模型中添加更多项——使节点上的通信成本更低,而关闭交换机的成本更高,包括负载不平衡等——但即使是相当简单的模型也会给你一个相当对代码中发生的事情有深入的了解,并允许您定量回答诸如“infiniband 与以太网是否可能对这个模拟产生影响”等问题。
至于您的最后一个问题,“如果不是,那么编写算法并运行它是确定通信成本的唯一(或最有效的方法)吗?” ——当然,实验总是胜过理论,但理论可以成为有用的指南。
霍克尼模型是一个极好的简单的沟通模型:发送单个信息的时间从一个过程到另一个过程的话是
在哪里是所谓的延迟成本,并且是反带宽。通常,机器越大,越大是。显然,霍克尼模型没有考虑网络拥塞等更微妙的问题,但很难准确地强调一个人可以从这个模型中获得多少里程。
如果您想查看使用 Hockney 模型对 MPI 集体通信的各种算法进行分析,我强烈推荐集体通信:理论、实践和经验。它讨论了在各种网络拓扑上用于广播、减少、分散、收集、全部收集、减少分散和全部减少的各种算法。
这是一件很难做到的事情,没有什么比包括记忆运动的复杂性分析更通用、定义明确和强大的了。内存复杂性至少是一个开始。Kung 和其他人在这方面做了相关工作(HT Kung. Memory requirements for balance computer architectures. In Proceedings of the ACM Int'l. Symp. Computer Architecture (ISCA), Tokyo, Japan, 1986)和 Jim Demmel 在伯克利的小组最近明确研究了包括通信在内的复杂性理论,但“记忆运动”理论还有很长的路要走,直到它与传统的复杂性理论和分析一样通用。
根据 MJ Quinn 所著的“使用 MPI 和 OPENMP 在 C 中进行并行编程”(2004)一书,您可以在“任务通道”模型中考虑并行程序。在其中,要理解的关键是“一个任务一次只能发送一条消息,但它可以在发送消息的同时接收一条消息”(Quinn,2004,第 76 页)。因此,您只需要考虑每次迭代同时发送多少条消息。此外,通信永远不会是瞬时的:在通过通道发送 1 位之前总是有一个延迟期(认为它好像处理器需要“预热”才能发送消息)。我们通常可以假设这是一个常数,与消息长度无关。总的来说,我们不会考虑太多其他的“硬件依赖” 影响算法分析的因素,例如带宽、网络拓扑或缓存命中率。这是并行实现没有按照算法分析预测的那样执行的部分原因。程序员不知道他们正在测试代码的机器的这些参数也很常见,这使得实验测试更加方便。