【问题标题】:For parallel algorithm with N threads, can performance gain be more than N?对于 N 个线程的并行算法,性能增益能否超过 N?
【发布时间】:2011-10-25 16:20:45
【问题描述】:

一个理论问题,也许很明显:

一个算法是否有可能在以 N 个线程并行实现后,比原来的单线程算法执行速度快N 倍?换句话说,增益是否可以更好地与线程数呈线性关系?

【问题讨论】:

    标签: performance algorithm parallel-processing theory


    【解决方案1】:

    这并不常见,但绝对有可能

    例如,考虑构建一个软件管道,其中管道中的每个步骤执行相当少量的计算,但需要足够的静态数据来大约填满整个数据缓存 - 但每个步骤使用不同的静态数据。

    在这种情况下,单个处理器上的串行计算通常主要受主内存带宽的限制。假设您拥有(至少)与管道步骤一样多的处理器/内核(每个都有自己的数据缓存),您可以加载每个数据缓存一次,并一个接一个地处理一个数据包,保留所有这些都是相同的静态数据。现在您的计算可以以处理器的速度进行,而不受主内存带宽的限制,因此速度提升很容易达到线程数的 10 倍。

    理论上,您可以使用具有非常大缓存的单个处理器来完成相同的任务。然而,从实际的角度来看,处理器和缓存大小的选择是相当有限的,所以如果你想使用更多的缓存,你需要使用更多的处理器——大多数系统提供的方式来实现这一点有多个线程。

    【讨论】:

    • 您有时也会在访问多个节点时看到这一点,现在有多个内存带宽/网络管道/I/O 管道要访问——如果争用这些是最初的瓶颈,您可以简要地看到正是由于上述 Jerry 所描述的原因,超线性加速。
    【解决方案2】:

    是的。

    我看到了一种通过复杂动作移动机器人手臂的算法,该算法基本上分为 N 个线程,并让每个线程或多或少地随机移动通过解决方案空间。 (这不是一个实用算法。)统计数据清楚地显示了一个线程的超线性加速。显然,随着时间的推移,找到解决方案的概率上升得相当快,然后又趋于平稳,因此优势在于有很多初始尝试。

    【讨论】:

    • 有趣的地方!正是出于这个原因,现代 SAT 求解器经常采用激进的重启策略。
    • @missingno:听起来很有趣,你能提供一些参考吗?
    • 基本思想是,对于 NP 完全问题,求解长度分布严重偏向指数最坏情况(相对于非常简单的最佳情况)。但是,除了完全矫枉过正的sat handbook(见边栏)之外,我想不出任何好的参考资料。 SAT 是个有深度的人......无论如何,提到Minisat 并没有什么坏处。
    • 不过,这不需要多个线程。您可以使用一个线程和类似于上下文切换的东西来实现它。也就是说,计算一次计算的一部分,然后计算第二次计算的一部分,等等。
    • @JerryCoffin,重点是,这些“线程”将在一个实际线程上运行,因此它们只会使用一个 CPU 内核。这意味着加速是因为使用了不同的算法,而不是因为有更多的内核可用。 (我实际上不会以这种方式实现它,除非有充分的理由这样做。)
    【解决方案3】:

    Amdahl's law(并行化)告诉我们这对于一般情况是不可能的。充其量我们可以完美地将工作除以 N。原因是在没有序列部分的情况下,Amdahl 的加速公式变为:

    加速 = 1/(1/N)

    其中 N 是处理器的数量。这当然减少到只有 N。

    【讨论】:

    • 虽然阿姆达尔定律没有考虑一些实际的细节,比如上下文切换的代价。
    • @dacc:如果你并行化串行算法是,如果你串行化并行算法则不是。
    • 阿姆达尔定律是一个非常有用的经验法则,但它还不是一个完整的并行计算理论。正如@Jerry Coffin 的回答一样,缓存效应(或者类似地,使用多个节点时使用的内存带宽效应)有时可以在少量处理器上实现超线性加速。
    猜你喜欢
    • 2014-04-30
    • 2015-10-05
    • 2020-01-21
    • 2019-07-12
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多