前言
在上一篇文章《使用阿姆达尔定律来提升效率》中提到的阿姆达尔定律前提是假设问题的规模保持不变,并且给定一台速度更快的机器,目标是更快地解决问题。然而,在大多数情况下,这并不完全正确。当有一台更快的机器时,我们可能会希望增加解决问题的规模或提高解决方案的准确性。
古斯塔夫森定律(Gustafson's Law),又称古斯塔夫森-巴西斯定律(Gustafson-Barsis's Law),是并行计算领域的一项原理,旨在解决并行系统的可扩展性问题。该定律由约翰·L·古斯塔夫森(John L. Gustafson)及其同事埃德温·H·巴西斯(Edwin H. Barsis)于1988年提出,旨在回应阿姆达尔定律(Amdahl's Law)。阿姆达尔定律对并行处理所能实现的性能提升持较为悲观的态度。
古斯塔夫森定律指出,通过增加问题规模可以显著提高并行处理的速度。换句话说,该定律表明,随着处理器数量的增加,总体计算工作量可以按比例增加,以保持恒定的效率。这与阿姆达尔定律形成了对比,后者侧重于固定规模的问题,并强调计算顺序部分的重要性,这限制了可实现的最大加速比。
在古斯塔弗森定律中,保持常数的不是问题的规模,而是我们等待结果的时间。古斯塔夫森观察到,问题的并行部分会随着问题规模的变化而变化,而顺序部分则几乎不会。
1. 古斯塔夫森定律
古斯塔夫森估计加速比S使用并行计算得到的公式如下:
S = s + p x N = s + (1-s) x N = N + (1-N) x s
其中,大写S是并行化的理论加速比,N是处理器的数量,小写s和p分别是在并行系统上执行程序的串行部分和并行部分所花费的时间比例,其中s+p=1。因此,S也可以用p表示为:
S = s + p x N = (1-p) + p x N = 1 + (N-1) x p
2. 古斯塔夫森定律的应用
假设我们有一个70% 并行、30% 顺序的程序,并且我们有10 个处理器,那么按古斯塔弗森定理得到的加速比为:
S = N + (1 - N) x s = 10 + (1 – 10) x 0.3 = 7.3
那假如上面程序有1000个处理器呢?
S = N + (1 - N) x s = 1000 + (1 – 1000) x 0.3 = 700.3
可见随着处理器个数的增加,加速比得到明显的提升。
如果我们使用阿姆达尔定律估计,速度的增加将从 2.7 增加到 3.3。
3. 古斯塔夫森定律的局限性
对于许多软件程序来说,可以对串行执行的时间进行检测和量化。这可以通过在程序的串行部分周围放置计时器来估算s来实现。
基于此分数,可以使用阿姆达尔定律和古斯塔夫森定律来估算加速比。然而,这两个定律都没有考虑通信成本或中间级别的并行性。随着处理器数量的增加,古斯塔夫森定律所实现的加速仍然有限,因为通信成本最终会变得如此之高,以至于抵消了增加工作负载所带来的任何好处。
事实上,当应用于现代并行系统时,这两条定律可能并不准确,因为通信成本对加速有很大的影响。
4. 总结
阿姆达尔定律是保持规模不变谈加速比,古斯塔夫森定律是保持时间长度不变谈加速比。阿姆达尔定律是悲观的,而古斯塔夫森定律则是乐观的。从阿姆达尔定律的角度来看待并行性可能会令人沮丧。古斯塔夫森证明,当我们增加并行部分的工作量时,顺序部分造成的瓶颈会变得不那么严重。
古斯塔弗森定理强调了可拓展性在并行处理中的重要性,它关注并行部分以及如何扩展它以实现更好的性能,这一点与强调计算顺序部分对性能影响的阿姆达尔定律不同。古斯塔夫森定律更适用于现实世界的问题,因为许多计算任务自然会随着数据的大小或所解决问题的复杂性而扩展。