概述
总的来说,使用并行程序的最重要的目的有两个。一是为了获得更好的性能;二是业务模型的需要,确实需要多个执行实体。这里主要关注程序性能的问题。
当将串行程序改造为并发程序,提高了程序的性能,但空间提高了多少?是否真的有提高?还是一个需要研究的问题。目前主要有两个定律对这个问题进行了解答,一个是Amdahl定律,另一个是Gustafson定律。
Amdahl定律
Amdahl定律是计算机科学中非常重要的定律,它定义了串行系统并行化后加速比的计算公式和理论上限。
加速定义:
加速比 = 优化前系统耗时 / 优化后系统耗时
通过公式可以知道,加还比值越大,表明优化的效果越好越明显。下面看一下Amdahl加速公式的推导过程。
将上面的公式代入下面的公式,得到:
加速比 =
=
=
其中,n表示处理器的个数,T表示时间,表示优化前耗时(表示只有一个处理器时的耗时),
表示使用n个处理器优化后的耗时,
是程序中只能串行执行的比例。
根据上面的公式,如果CPU的处理器个数趋于无穷(
趋于0),则加速比与系统的串行化比例成反比,如果系统中有一半的代码是串行执行的,那么优化后的最大加速比为2。
实际上仅增加CPU处理器的数量并不一定能起到有效的作用,如果程序的串行化比例很低,那效果就不明显。但如果程序中的串行化代码比例比较高,将串行化的代码修改为并行化的模块比重,在此基础上再合理增加并行处理器的数量,才能以最小的投入,得到最大的加速比。
Gustafson定律
Gustafson定律也试图说明处理器个数、串行化比例和加速比之间的关系。但是Gustafson定律和Amdahl定律分析的角度有所不同。但加速比也是定义为优化前的系统耗时除以优化后的系统耗时。
从Gustafson定律中,更容易的发现,如果串行化的比例很小,并行化的比例很大,那么加速比就是处理器的个数。只要不断的累加处理器,就能获得更快的速度。
比较
可以看出,Gustafson定律和Amdahl定律的结果有所不同,是因为这两个定律对同一个客观事实分析的角度不太一样,侧重点也有所不同。
Amdahl强调的是,当串行化比例一定时,加速比是有上限的,不管你堆叠多少个CPU参与计算,都不能突破这个上限。而Gustafson定律认为,虽然开始运行速度慢,但只要给你足够的时间,只要你后期的速度比期望值快一点点,你总是可以把平均值速度调整到非常接近的那个期望值的。
因此Gustafson定律关心的是,如果可被并行化的代码所占比例足够大,那么加速比就能随着CPU的数量线性增长。
注:以上内容参考《实战Java高并发程序设计(第2版)》。