并行的两个重要定律
Amdahl 定律
Amdahl 定律是计算机科学中非常重要的定律。它定义了串行系统并行化后的加速 比的
计算公式和理论上限
加速比定义:
加速比=优化前系统耗时 优化后系统耗时
所谓加速比就是优化前 耗时与优 后耗时 的比值。 加速比越 明优化效果越明
显。 显示了 mdahl 公式的推导 ,其中 表示处理器个数, 表示时间, T1 表示
优化前耗时(也就是只有 处理器时的耗时) , 表示使用 个处理器优化后的耗时。
是程序 只能串行执行的 比例
根据这个公式,如果 CPU 处理器数量趋于无穷,那么加速比与系统的串行化比例成反
比,如果系统中必须有 50% 的代码串行执行,那么系统的最大加速比为
假设有一个程序分为以下步骤执行,每个执行步骤花费 100 个单位时间。其中,只有
步骤 和步骤 可以并行,步骤 必须串行 在全串行的情况下,系
统合计耗时为 500 个单位时间
若将步骤 和步骤 并行化,假设在双核处理上,则有如图 10 所示的处理流程
这种情况下,步骤 和步骤 的耗时将为 50 个单位时间 故系统整体耗时为 400 个单位时
根据加速比的定义有:
加速比=优化前系统耗时/优化后系统耗时= 500 I 400 = 1.25
由于 个步骤中, 个步骤必须串行,因此其串行化比例为 3/5 = 0.6 ,即 F=0.6 ,且双
核处理器的处理器个数N为2 代入加速比公式得
加速比= 1/(0.6+(1 0.6) 2) = 1.25
在极端情况下,假设并行处理器个数为无穷大,则有如图 1.1 所示的处理过程 步骤
和步骤 的处理时间趋于 即使这样,系统整体耗时依然大于 300 个单位时间 使用加
速比计算公式, 趋于无穷大,有加速比= l!F,且 F=0.6 ,故有加速比= l.67 。即加速比
的极限为 500/300 = 1.67
由此可见,为了提高系统的速度,仅增加 CPU 处理器的数 并不 定能起到有效的作
用。需要从根本上修改程序的串行行为,提高系统内可并行化的模块比 ,在此基础上,
合理增加并行处理器数 ,才能以最小的投入,得到最大的加速比
Gustafson 定律
Gustafso 定律 试图说明 理器 串行化比例和加速 间的关系
但是 Gustafson 定律 Amdah 定律的角度不同 同样,加速 都被定义为优 前的系
统耗时除以优 后的系统耗时
可以看到,由于切入角度的不同, Gustafson 定律的公式和 Amdahl 定律的公式截然不
同。从 Gustafson 定律中,我们可以更容易地发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。只要不断地累加处理器,就能获得更快的速度
是否相互矛盾
Amdahl 定律和 Gustafson 定律的结论不同,这是不是说明这两个理论之间有 个是错
误的呢?其实不然,两者的差异其实是因为这两个定律对同 个客观事实从不同角度去审
视后的结果,它们的侧重点有所不同
举一个生活中的例子, 辆汽车行驶在 60 km 的路上,你花了 个小时,行驶了 30km
无论接下来开多快,你都不可能达到 90km/h 的速度
求解图的方程,你会发现如果想达到90km的时速,那么你从AB中点到达B
点的时间会是一个负数,这显然不是一个合理的结论。实际上,如果前半程30k你使用了
一小时,那么即使你从中点到B点使用光速,也只能把整体的平均时速维持在60k/h.
也就是说Amdahl强调:当串行化比例一定时,加速比是有上限的,不管你堆叠多少个
CPU参与计算,都不能突破这个上限!
而Gustafson定律的出发点与之不同,对Gustafson定律来说,不管你从A点出发的速
度有多慢,只要给你足够的时间和距离,只要你后期的速度比期望值快那么一点点,你总
是可以把平均速度调整到非常接近那个期望值的。比如,你想要达到均速90k/h,即使在
前30km你的时速只有30km/h,你只要在后面的速度达到91km/h,给你足够的时间和距离,
总有一天可以把均速提高到90km/h。
因此,Gustafson定律关心的是:如果可被并行化的代码所占比例足够大,那么加速比
就能随着CPU的数量线性增长。
所以,这两个定律并不矛盾。从极端的角度来说,如果系统中没有可被并行化的代码
(即F=1),那么对于这两个定律,其加速比都是1。反之,如果系统中可被并行化代码
的比例达到100%,那么这两个定律得到的加速比都是n(处理器个数)。