我有一个用C编写的串行(非并行)应用程序。我已使用英特尔线程构建模块对其进行了修改和重写。当我在AMD Phenom II机器(四核机器)上运行这个并行版本时,我的性能提升超过4倍,这与Amdahl定律相冲突。任何人都可以告诉我为什么会这样吗?
谢谢, 勒凯什。
答案 0 :(得分:4)
如果重写程序,可以提高效率。 Amdahl定律仅限制因并行性而导致的加速量,而不是通过改进代码来提高代码的速度。
你可能已经意识到拥有4倍缓存的效果,因为现在你可以使用所有四个触发器。或者与您机器上运行的其他进程争用较少。或者你不小心修了一个错误预测的分支。
TL / DR:它发生了。
答案 1 :(得分:2)
它被称为“超线性加速”,并且可能由于各种原因而发生,尽管最常见的根本原因可能是缓存行为。通常,当发生超线性加速时,可以使顺序版本更有效率。
例如,假设您有一个处理器,其中某些内核共享L2缓存(这些天是常见的架构),并假设您的算法对大型数据结构进行多次遍历。如果按顺序执行遍历,那么每次遍历都必须重新将数据拉入L2缓存,而如果你并行执行遍历,那么只要遍历运行,你就可以避免大量的这些遍历。步骤(失步是这里不可预测的表现的良好来源)。为了使顺序verison更有效,您可以交错遍历,从而改善局部性。
答案 2 :(得分:1)
有人能告诉我为什么会这样吗?
总之,缓存。
每个核心都有自己的L1缓存,因此,只需使用更多核心,就可以增加缓存中的缓存量,从而使更多的数据更接近处理的位置。仅此一项就可以显着提高性能(就好像你在一个内核上有更大的缓存)。当与有效并行化的近线性加速相结合时,您可以看到整体的超线性性能改进。