10.2 并行程序设计模式
对于多核 CPU,传统的串行程序已经无法很好地发挥 CPU 的性能,此时需要通过使用多线程并行的方式挖掘 CPU 的潜能( Amdahl 定律)。
并行程序设计模式属于设计优化的一部分,它们是对一些常用多线程结构的总结和抽象,本节主要介绍一些常用的并行程序设计模式。
10.2.1 Amdahl 定律
Amdahl(阿姆达尔)定律是计算机系统设计的重要定量原理之一,于 1967 年由 IBM 360
系列机的主要设计者阿姆达尔首先提出。该定律是指,系统中对某一部件采用更快的执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频率,或其占总执行时间的比例。 Amdahl 定律实际上定义了采取增强(加速)某部分功能处理的措施后可获得的性能改进或执行时间的加速比。阿姆达尔曾致力于并行处理系统的研究,对于固定负载情况下描述并行处理效果的加速比 s,他经过深入研究给出了公式 s=1/(a+(1-a)/n)。其中, a 为串行计算部分所占比例, n 为并行处理节点的个数。这样,当 a=0 时,最大加速比 s=n;当 a=1 时,最小加速比 s=1;当 n→∞时,极限加速比 s→1/ a,这也是加速比的上限。例如,若串行代码占整体代码的 25%,则并行处理的总体性能不可能超过 4。这一公式已被学术界所接受,并被称作“ Amdahl(阿姆达尔)定律”( Amdahl Law)。
Amdahl 定律定义了串行系统并行化后加速比的计算公式和理论上限:加速比 = 优化前系统耗时 / 优化后系统耗时
Amdahl 定律给出了加速比与系统并行度和 CPU 处理器数量的关系。设加速比为speedup,系统内必须串行化的程序比重为 F, CPU 处理器数量为 N,则有:
speedup ≤ 1 / (F+((1-F)/N))
根据这个公式,若 CPU 处理器数量趋近于无穷,那么加速比与系统的串行化率成反比;若系统中必须有 50%的代码串行执行,那么系统的最大加速比为 2。
如图 10-3 所示, speedup = 1。
如图 10-5 所示, speedup = 1 / 0.6 = 1.67。
由此可见,为了加快系统的速度,仅增加 CPU 处理器数量并不一定能起到有效的作用,需要从根本上修改程序的串行行为,提高系统内并行化的模块比重。在此基础上,合理增加并行处理器数量,才能以最小的投入得到最大的加速比。
反观我们的开发工作,也不是并发数越多越好,合理的并发数加上硬件的支持,才能使我们的程序发挥最大效用。
10.2.2 Future 模式
Future 模式有点类似于网上购物,在你购买商品、订单生效之后,你可以做自己的事情,等待商家通过快递为你送货上门。 Future 模式就是,某一程序提交请求