Performance 对于具有N个线程的并行算法,性能增益能否超过N?

Performance 对于具有N个线程的并行算法,性能增益能否超过N?,performance,algorithm,parallel-processing,theory,Performance,Algorithm,Parallel Processing,Theory,一个理论问题,也许很明显: 一个算法在用N个线程并行实现后,执行速度是否可能比原来的单线程算法快N倍以上?换句话说,增益是否比与线程数成线性关系更好?(并行化)告诉我们,这在一般情况下是不可能的。充其量我们可以将功完美地除以N。原因是,如果没有序列部分,阿姆达尔的加速公式为: 加速比=1/(1/N) 其中N是处理器的数量。当然,这只会减少到N。是的 我看到了一种通过复杂动作移动机器人手臂的算法,基本上是将机器人手臂分成N条线程,让每条线程在解空间中或多或少地随机移动。(这不是一个实用的算法。)统

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

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

(并行化)告诉我们,这在一般情况下是不可能的。充其量我们可以将功完美地除以N。原因是,如果没有序列部分,阿姆达尔的加速公式为:

加速比=1/(1/N)

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

是的


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

这并不常见,但肯定是可能的

例如,考虑构建一个软件管道,其中管道中的每一步都进行相当小的计算,但需要足够的静态数据来大致填充整个数据缓存,但每一步都使用不同的静态数据

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


理论上,你可以用一个拥有巨大缓存的单处理器来完成同样的任务。然而,从实用的角度来看,处理器和缓存大小的选择是相当有限的,因此,如果您想使用更多的缓存,则需要使用更多的处理器——大多数系统提供的方法是用多个线程。

尽管AdDaHL定律不考虑一些实际细节,例如,上下文切换的代价。@dacc:如果并行化串行算法,则为是;如果串行化并行算法,则为否。阿姆达尔定律是一个非常有用的经验法则,但它还不是一个完整的并行计算理论。在@Jerry Coffin的回答中,缓存效应(或者类似地,使用多个节点时使用的内存带宽效应)有时会在少量处理器上提供超线性加速。有趣的一点!现代SAT解算器通常正是出于这个原因而采用激进的重启策略。@missingno:听起来很有趣,你能提供一些参考吗?基本思想是,对于NP完全问题,求解分布的长度严重偏向指数最坏情况(与非常简单的最佳情况相反)。然而,我想不出任何好的参考文献,除了完全的过度使用(见侧栏)。坐是深的人。。。不管怎么说,提到它也无妨。不过,这并不需要多个线程。您可以使用一个线程和类似于上下文切换的东西来实现这一点。也就是说,计算一次计算的一部分,然后计算第二次计算的一部分,等等@JerryCoffin,关键是,这些“线程”将在一个实际线程上运行,因此它们将只使用一个CPU核。这意味着加速是因为使用了不同的算法,而不是因为有更多的内核可用。(除非有充分的理由这样做,否则我不会以这种方式实现它。)当您访问多个节点时,有时也会看到这种情况,现在有多个内存带宽/网络管道/I/O管道要访问--如果对这些的争用是最初的瓶颈,你可以简单地看到超线性加速,这正是Jerry上面描述的原因。