异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。异构计算已经无处不在,从超算系统到桌面到云到终端,都包含不同类型指令集和体系架构的计算单元,下面先从几个系统了解下异构计算超算系统。
天河-2:包括16,000个计算节点,每个节点 2*Xeon (IveBridge)+3*Phi。Total 3,120,000 Core, Linpack测试基准为33.86 petaFLOPS ,Power 17.6 megawatts。编程框架:OpenMC/OpeMP。
Mac Pro: Intel Xeon E5 (6/8/2 cores) + Dual AMD FirePro D500 GPU (1526 stream processors, 2.2 teraflops, 3-way 4k video)。编程框架:CUDA、OpenCL、Metal。
Amazon Linux GPU Instances g2.8xlarge: 4 GPU (each with 1,536 CUDA cores and 4 GB of video memory and the ability to 4* 1080p@30fps), 32 vCPU 。编程框架:CUDA,OpenCL。
Qualcomm Snapdragon 820 : octa-core CPU+ Adreno 530 GPU+ Hexagon 680 DSP,编程框架:MARE,OpenCL。
显然,异构计算系统包含了不同异构计算单元,如CPU、GPU、DSP、ASIC、FPGA等。除了异构硬件单元,不同异构计算平台采用的编程框架也不尽相同。那么,为什么要用异构计算?
异构计算优势主要提现在性能、性价比、功耗、面积等指标上,在特定场景,异构计算往往会表现出惊人的计算优势。
Google Brain:1,000台服务器 (16,000 CPU核) 模拟simulating a model of the brain with a billion synapses.
Nvidia:three GPU-accelerated servers: 12 GPUs in total, 18,432 CUDA processor cores.
The Nvidia solution uses 100 times less energy, and a 100 times less cost.
关于GPU和CPU的详细分析和对比,请参考文章: GPU技术的现在和ASIC的未来、 谈谈GPU和CPU为何不同和 GPU关键参数和应用场景。
除OpenCL之外,还有很多编程框架?异构并行计算框架是充分发挥异构硬件性能和屏蔽硬件差异的关键,但目前业界不存在一个统一标准。
OpenCL是业界主流公司推动的异构并行计算编程标准。OpenCL属于性能层,业界很多产能层框架对接OpenCL。
Intel、ARM、高通的异构硬件均支持OpenCL软件设计。
Intel Xeon+FPGA异构芯片支持OpenCL。
Nvidia CUDA、Apple Metal是针对各自异构硬件设计的计算私有框架,是封闭系统,但都有广泛的开发者支持。CUDA和OpenCL在设计理念上非常相近,但Nvidia GPU性能业界最强,有能力通过CUDA绑定用户,比如深度学习上Nvidia GPU效果最好,开发者只能选择CUDA。
异构硬件的一个趋势是SOC上集成多种异构硬件。比如高通820芯片集成了ARM64+GPU+DSP等多种形态。
但传统的计算框架只针对一种硬件设计,无法支持多形态。
高通设计了Symphony异构并行计算框架来发挥多形态异构硬件性能,同时适应未来芯片的演进。
OpenCL异构编程技术得到各大厂家的大力支持,可屏蔽异构硬件与OS差异,简化异构核编程复杂度,OpenCL由苹果提出,得到业界大多数厂商的支持:如Nvidia、Apple、AMD、ARM、INTEL、TI等等,支撑GPGPU、DSP、FPGA等通用硬件加速器。
优势:OpenCL是针对GPGPU大规模数据并行的特性所开发的底层编程框架,屏蔽各厂商GPU之间的差异,与芯片设计协同演进,C语言的扩展。
不足:性能的可移植性不足。
OpenCL编程模型中隐含了很多的硬件特征,比如并行粒度、内存模型、存储层次、资源粒度、内存带宽和延迟、ISA差异等,这导致不同的加速器上的OpenCL代码都要重新思考上述特征。
随着FPGA的广泛使用,成本逐步降低,作为软件定义实现快速在线指令优化,对整个编译器、运行框架、OS产生巨大影响。新架构对软件的挑战:
1)支持CPU+FPGA融合并行的计算框架,包括FPGA编译和高层语言设计。
2)大规模分布式FPGA资源管理与调度
3)高性能FPGA算法库。
异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。常见的计算单元类别包括CPU、GPU、DSP、ASIC、FPGA等。
FPGA和GPU/CPU对比具有以下不同:
1.软件定义的硬件架构:GPU/CPU硬件固定,其并行性设计是适应固定硬件。而FPGA的硬件逻辑可以通过软件动态改变,从硬件的角度来适配软件,从而获得更高的计算性能。
2.更高并行性、能效比:FPGA拥有更丰富的计算资源组件,从而能够满足更多并行计算需求。并且能够充分发掘软件算法中的并行性,降低功耗。
同时,新架构融合CPU+FPGA,将成为一种发展趋势:
1. 异构核首次作为一等公民:通过CPU+FPGA的融合设计,由主机+外设的Offloading模式转变为异构多核片上系统设计,CPU与FPGA地位等同,通信方式由板级转向片内。
2. OpenCL带来了FPGA的编程革命:提高了FPGA的可编程性,将程序员从复杂的硬件电路设计中解救出来,更专注于系统/算法的设计。
总结:CPU主要是做通用控制以及计算的,整个算术逻辑单元ALU占整个芯片面积不到5%。CPU里面包含很多控制逻辑,预测,Cache等逻辑,所以算力不高,但是什么都能做。
CPU主要特点:主频高,但核数有限;逻辑控制和算术运算单元、具有大量缓存,主要功能在于管理和调度任务。
GPU专门用来做浮点运算,只能作为协处理器配合CPU完成特定计算。但GPU天然假设所有运算可以并行(GPU具有数千个计算核),整个芯片90%都是运算逻辑。所以算力非常高,通常是CPU的几十上百倍。
GPU特点:高并发(几千个核并),强浮点能力和高显存带宽。
FPGA主频低但集成大量计算单元,流水线并行和数据并行,具备硬件编程和加速和特定应用IP核。然而,ASIC是针对某一场景优化的专用处理单元,硬件基本不可编程,采用多个IP集成,但有高性价比和能效比。