一.介绍
Amdahl(Amdahl)定律是计算机科学中非常重要的定律,他定义了串行系统并行化后加速比的计算公式和理论上限。
加速比定义: 加速比= 优化前系统消耗/ 优化后系统消耗
所谓的加速比,就是优化前的消耗与优化后的消耗的比值。优化比越高,就说明优化效果越明显。
Amdahl定律给出了加速比与系统并行度和处理器数量的关系。设加速比为speedup,系统内必须串行化的程序比重为F,CPU处理器数量为N,则有:speedup<= 1/(F+(1-F)/N)
根据这个公式,如果说CPU处理器的数量趋向于无穷大,那么加速比与系统的串行化比率成反比,如果系统中必须有50%的代码串行执行,那么系统的最大加速比为2。
二.案例
假设有一段程序我们将它分成5个步骤,然后每个步骤需要100个时间单位,其中只有步骤二与步骤五可以并行,步骤一三四必须串行,在全部串行的情况下需要消耗500个时间单位。
如果我们将步骤二与步骤五并行化,假设我们在双核处理器上,步骤二与步骤五耗时将变成50个时间单位,这时候系统的合计耗时是400个时间单位。如图:
这时候我们算出的加速比就是:
加速比=优化前系统耗时/优化后系统耗时=500/400=1.25
我们也可以利用加速比的公式来计算,由于5个步骤中有3个步骤是必须要串行的,因此串行化的比重就是3/5=0.6,也就是F=0.6,且双核处理器个数N为2,公式:
加速比=1/(0.6+(1-0.6)/2)=1.25
在极端的情况下,假设并行处理器的个数是无穷大的,步骤二与 步骤五的处理时间趋向于0,即使是这样,系统整体的消耗时间依然大于300个时间单位。即加速比的极限为500/300= 1.67 。
使用加速比计算公式来算,N是无穷大的,有speedup= 1/F,且F= 0.6,所以算出来 speedup= 1.67 。
由此可见,为了提供系统的速度,仅仅增加cpu处理器的数量并不一定能起到有效的作用,需要从根本上修改程序个串行行为,提高程序中并行化的模块比重,在此基础上,合理增加并行处理器的数量,才能以最小的投入,得到最大的加速化。
根据Amdahl 定律,使用多核cpu对系统进行优化,优化的效果取决于cpu的数量以及系统中的串行化程序的比重,cpu数量越多,串行化的比重越低,效果是越好的。如果仅仅提高cpu数量而不降低程序的串行化比重,也无法提供系统性能。
参考:《java程序性能优化》