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

时间:2011-10-25 16:20:45

标签: performance algorithm parallel-processing theory

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

在以N个线程的并行方式实现后,算法是否有可能比原始的单线程算法执行超过N次?换句话说,增益是否可以更好地与线程数线性相关?

3 个答案:

答案 0 :(得分:11)

这并不常见,但最确定 是可能的。

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

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

理论上,你可以用一个只有一个非常大的缓存的单个处理器来完成同样的事情。但是,从实际的角度来看,处理器和高速缓存大小的选择相当有限,因此如果要使用更多高速缓存,则需要使用更多处理器 - 以及大多数系统提供的 方式来实现此目的有多个线程。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

  

加速= 1 /(1 / N)

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