我有一个用 C 语言编写的串行(非并行)应用程序。我使用英特尔线程构建块对其进行了修改和重新编写。当我在四核机器 AMD Phenom II 机器上运行这个并行版本时,我获得了超过 4 倍的性能增益,这与阿姆达尔定律相冲突。谁能给我一个为什么会发生这种情况的原因?
谢谢,拉克什。
如果你重写程序,你可以让它更有效率。阿姆达尔定律只限制了由于并行性而导致的加速量,而不是通过改进代码可以使您的代码快多少。
您可能会意识到拥有 4 倍缓存的效果,因为现在您可以使用所有四个 proc。或者可能与您机器上运行的其他进程的争用较少。或者你不小心修复了一个错误预测的分支。
TL/DR:它发生了。
它被称为“超线性加速”,可能由于多种原因而发生,但最常见的根本原因可能是缓存行为。通常当发生超线性加速时,这是一个线索,表明您可以使顺序版本更高效。
例如,假设您有一个处理器,其中一些内核共享 L2 缓存(当今的常见架构),并假设您的算法对大型数据结构进行多次遍历。如果按顺序执行遍历,则每次遍历都必须重新将数据拉入二级缓存,而如果并行执行遍历,则可以避免大量未命中,只要遍历运行在步(在这里失步是不可预测的性能的一个很好的来源)。为了使顺序版本更有效,您可以交错遍历,从而提高局部性。
谁能给我一个为什么会发生这种情况的原因?
总之,缓存。
每个核心都有自己的 L1 缓存,因此,只需使用更多核心,您就增加了缓存的数量,这反过来又使您的更多数据更接近将要处理的地方。仅此一项就可以显着提高性能(就像您在单个内核上有更大的缓存一样)。当与有效并行化的近线性加速相结合时,您可以看到整体上的超线性性能改进。