【发布时间】:2011-10-25 16:20:45
【问题描述】:
一个理论问题,也许很明显:
一个算法是否有可能在以 N 个线程并行实现后,比原来的单线程算法执行速度快N 倍?换句话说,增益是否可以更好地与线程数呈线性关系?
【问题讨论】:
标签: performance algorithm parallel-processing theory
一个理论问题,也许很明显:
一个算法是否有可能在以 N 个线程并行实现后,比原来的单线程算法执行速度快N 倍?换句话说,增益是否可以更好地与线程数呈线性关系?
【问题讨论】:
标签: performance algorithm parallel-processing theory
这并不常见,但绝对有可能。
例如,考虑构建一个软件管道,其中管道中的每个步骤执行相当少量的计算,但需要足够的静态数据来大约填满整个数据缓存 - 但每个步骤使用不同的静态数据。
在这种情况下,单个处理器上的串行计算通常主要受主内存带宽的限制。假设您拥有(至少)与管道步骤一样多的处理器/内核(每个都有自己的数据缓存),您可以加载每个数据缓存一次,并一个接一个地处理一个数据包,保留所有这些都是相同的静态数据。现在您的计算可以以处理器的速度进行,而不受主内存带宽的限制,因此速度提升很容易达到线程数的 10 倍。
理论上,您可以使用具有非常大缓存的单个处理器来完成相同的任务。然而,从实际的角度来看,处理器和缓存大小的选择是相当有限的,所以如果你想使用更多的缓存,你需要使用更多的处理器——大多数系统提供的方式来实现这一点有多个线程。
【讨论】:
是的。
我看到了一种通过复杂动作移动机器人手臂的算法,该算法基本上分为 N 个线程,并让每个线程或多或少地随机移动通过解决方案空间。 (这不是一个实用算法。)统计数据清楚地显示了一个线程的超线性加速。显然,随着时间的推移,找到解决方案的概率上升得相当快,然后又趋于平稳,因此优势在于有很多初始尝试。
【讨论】:
Amdahl's law(并行化)告诉我们这对于一般情况是不可能的。充其量我们可以完美地将工作除以 N。原因是在没有序列部分的情况下,Amdahl 的加速公式变为:
加速 = 1/(1/N)
其中 N 是处理器的数量。这当然减少到只有 N。
【讨论】: