并行编程方法与优化实践

刘文志
前言 为什么要写这本书 本书主要是为软件工程师写的。在解释为什么笔者认为软件工程师需要这本书之前,先来介绍并行、并发和代码性能优化这3个概念,理解这3个概念是阅读本书的基础。 ·并行对应的英文单词是parallelism,是指在具有多个处理单元的系统上,通过将计算或数据划分为多个部分,然后将各个部分分配到不同的处理单元上,各处理单元相互协作,同时运行,以达到加快求解速度或者扩大求解问题规模的目的。 ·并发对应的英文单词是concurrency,是指在一个处理单元上运行多个应用,各应用分时占用处理单元。这是一种微观上串行、宏观上并行的模式,有时也称其为时间上串行、空间上并行。 ·代码性能优化是指通过调整源代码,使其生成的机器指令能够更高效地执行。通常高效是指执行时间更少、使用的存储器更少或能够计算更大规模的问题。 从大的方面来说,并行和并发都是代码性能优化的一种方式。但是今天并行和并发已经变得如此重要,以至于需要“开宗立派”。为了划清并行、并发和代码性能优化的界线,在本书中,代码性能优化特指除并行和并发以外的代码优化方法,比如向量化和提高指令流水线效率。在本书中,笔者将向量化独立出来解说。 2003年以前,在摩尔定律的作用下,单核标量处理器的性能持续提升,软件开发人员只需要写好软件,而性能的提升则等待下次硬件的更新。2003年之前的几十年里,这种“免费午餐”的模式一直在持续。2003年后,主要由于功耗的原因,这种“免费午餐”已经不复存在了。为了生存,各硬件生产商不得不采用各种方式提高硬件的计算能力。目前最流行的3种方式如下: 1)让处理器在一个周期处理多条指令,多条指令可相同可不同。如Intel Haswell处理器一个周期可执行4条整数加法指令、2条浮点乘加指令,访存和运算指令也可同时执行。 2)使用向量指令,主要是SIMD和VLIW技术。SIMD技术将处理器一次能够处理…