
1.2 为什么要并行或向量化
从2003年开始,CPU频率的提升接近停止,那种每次硬件的更新都会提升标量串行软件的性能的“免费午餐”已经结束,为了提升软件的性能,软件开发人员不得不使用并行或向量化技术。除了现实世界中的硬件已经完全是并行硬件外,还有几个原因要求我们必须使用并行或/和向量化:现在的编译器不能很好地自动向量化或并行串行软件(一些编译器能够自动向量化和并行简单程序);现实世界中人类对计算能力的需求永无止境。
有些编译器公司和组织(如Intel、GNU、PGI、CAPS)想让编译器自动向量化或并行串行程序,这一直是人们奋斗的目标。20世纪80年代中期,基于依赖分析的自动向量化工具已经基本可用,可以帮助程序员将Fortran语言代码移植到向量计算机上进行并行计算。现代的GCC能够向量化和并行一些非常简单的代码,但是对于复杂一些的程序基本上无能为力。实际上,即使是简单的代码,自动向量化或并行的性能也很难做到完美(通常性能比手工编写的要差很多)。其他的一些相关的研究,包括共享存储的MIMD(Multi instruction Multi Data,多指令多数据)和分布式存储结构的自动并行化,到目前为止,这些方法都少有进展。实际上,自动向量化或并行的主要难点在于编译器没有办法收集/分析向量化或并行所需的数据相关性和控制相关性等信息,必须需要程序开发人员干预。现在,研究的重点转向基于编程语言的策略研究,即从开发人员那里获得更多有关逻辑控制和数据相关性的描述,同时利用自动向量化或并行技术来减轻程序设计的负担。OpenMP、OpenACC、CUDA和OpenCL就是其中的典型代表。
由于标量单核的性能已经不能大幅度提升,以及向量多核/众核技术的普及,只有向量化或并行才能充分利用多核/众核技术带来的性能提升,而研发人员总能发掘出要求更高计算能力的应用(希望程序能够运行得更快或者能够计算更大规模的问题),这些应用对计算能力的需求推动着硬件和软件技术向前发展。一旦软硬件技术的发展暂时满足了应用对计算能力的需求,科研人员又会提出更高的要求。这种良性互动推动着科学发展。只是其中的一方由硬件厂商变成了硬件厂商和软件开发人员的结合,而硬件厂商通常只管卖出产品,发挥多核向量处理器性能的实现责任落在了开发人员肩上,而开发人员没有选择。