【问题标题】:Performance gain issue in multicore application多核应用程序中的性能增益问题
【发布时间】:2010-08-09 05:57:49
【问题描述】:

我有一个用 C 语言编写的串行(非并行)应用程序。我使用英特尔线程构建模块对其进行了修改和重新编写。当我在四核机器 AMD Phenom II 机器上运行这个并行版本时,我获得了超过 4 倍的性能增益,这与阿姆达尔定律相冲突。谁能给我一个为什么会发生这种情况的原因?

谢谢, 拉克什。

【问题讨论】:

  • 您的应用程序通常是 CPU 密集型还是 IO 密集型?如果它是 IO 绑定的,它可能能够将等待 IO 的进程换成其他进程,从而比平时节省更多时间。

标签: tbb multicore


【解决方案1】:

如果你重写程序,你可以让它更有效率。 Amdahl 定律只限制了由于并行性而导致的加速量,而不是通过改进代码可以使您的代码多快。

您可能会意识到拥有 4 倍缓存的效果,因为现在您可以使用所有四个 proc。或者可能与您机器上运行的其他进程的争用较少。或者你不小心修复了一个错误预测的分支。

TL/DR:它发生了。

【讨论】:

    【解决方案2】:

    它被称为“超线性加速”,可能由于多种原因而发生,但最常见的根本原因可能是缓存行为。通常当超线性加速发生时,这是一个线索,表明您可以使顺序版本更高效。

    例如,假设您有一个处理器,其中一些内核共享 L2 缓存(当今的常见架构),并假设您的算法对大型数据结构进行多次遍历。如果按顺序执行遍历,则每次遍历都必须重新将数据拉入二级缓存,而如果并行执行遍历,则可以避免大量未命中,只要遍历运行在步(在这里失步是不可预测的性能的一个很好的来源)。为了使顺序版本更高效,您可以交错遍历,从而提高局部性。

    【讨论】:

      【解决方案3】:

      谁能告诉我为什么会这样?

      总之,缓存。

      每个内核都有自己的 L1 缓存,因此,只需使用更多内核,您就可以增加正在运行的缓存数量,这反过来又使您的更多数据更接近处理数据的位置。仅此一项就可以显着提高性能(就像您在单个内核上有更大的缓存一样)。结合有效并行化带来的近线性加速,您可以看到整体上的超线性性能提升。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-16
        • 2017-04-26
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 2012-08-22
        相关资源
        最近更新 更多