当摩尔定律还是行业的铁律时,计算机编程几乎一直都是串行的,绝大多数的程序只存在一个进程或线程。大家还过着“我写个程序,性能达不到就睡个觉,等硬件工艺刷新硬件性能,性能就达标了”的美好生活。2003年以后因为工艺达到了瓶颈,你光“睡觉”是不行了。异构并行计算作为重要技术之一承担起了技术变革的重任。
异构并行计算的本质是把任务分发给不同架构的硬件计算单元(比如说CPU、GPU、FPGA等),让他们各司其职,同步工作。如同平时工作,把业务中不同类型的任务分给不同的计算资源执行。
从软件的角度来讲,异构并行计算框架是让软件开发者高效地开发异构并行的程序,充分使用计算平台资源。从硬件角度来讲,一方面,多种不同类型的计算单元通过更多时钟频率和内核数量提高计算能力,另一方面,各种计算单元通过技术优化(如GPU从底层架构支持通用计算,通过分支预测、原子运算、动态并行、统一寻址、NIC直接访问显存等能力)提高执行效率。
异构计算(Heterogeneous Computing)在80年代中期就已产生,其定义更加宽泛。异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。常见的计算单元类别包括CPU、GPU等协处理器、DSP、ASIC、FPGA等。一个异构计算平台往往包含使用不同指令集架构(ISA)的处理器。
在HPC异构并行计算架构应用技术中,通常分为通用架构并行和专用架构并行。通用架构并分为同构多核并行(X86 CPU多核并行计算和非X86 CPU多核并行计算)和异构众核并行(CPU+GPU异构协同计算和CPU+MIC异构协同计算);专用架构并行主要是指CPU+FPGA异构协同计算。
从更广义的角度来讲,不同计算平台的各个层次上都存在异构现象,除硬件层的指令集、互联、内存层次之外,软件层中应用二进制接口、API、语言特性底层实现等的不同,对于上层应用和服务而言,都是异构的。异构并行计算框架有个非常重要的特征就是能够帮助开发者屏蔽底层硬件差异,能让软件平台自适应未来硬件的演进。概括来说,理想的异构计算具有如下的一些要素:
它所使用的计算资源具有多种类型的计算能力,如SIMD、MIMD、向量、标量、专用等。
其中,芯片硬件定义了单指令单数据(SISD)、单指令多数据流(SIMD)、多指令单数据(MISD)和多指令多数据(MIMD)四个并行级别 ,此外,MIMD还分单程序多数据(SPMD)和多程序多数据(MPMD)。
它需要识别计算任务中各子任务的并行性需求类型;
它需要使具有不同计算类型的计算资源能相互协调运行;
它既要开发应用问题中的并行性,更要开发应用问题中的异构性,即追求计算资源所具有的计算类型与它所执行的任务(或子任务)类型之间的匹配性;
它追求的最终目标是使计算任务的执行具有最短时间。
代码类型)与机器能有效支持的计算类型(即机器能力