异构计算(Heterogeneous computing)摘要异构计算(Heterogeneous computing)技术从80年代中期产生,由于它能经济有效地获取高性能计算能力、可扩展性好、计算资源利用率高、发展潜力巨大,目前已成为并行/分布计算领域中的研究热点之一。
本文主要介绍了CPU+GPU基础知识及其异构系统体系结构(CUDA)和基于OpenCL的异构系统,并且总结了两种结构的特点,从而对异构计算有了更深的理解。
关键词:异构计算CUDA OpenCL1、引言异构计算主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。
常见的计算单元类别包括CPU、GPU等协处理器、DSP、ASIC、FPGA 等。
我们常说的并行计算正是异构计算中的重要组成部分异构计算近年来得到更多关注,主要是因为通过提升CPU时钟频率和内核数量而提高计算能力的传统方式遇到了散热和能耗瓶颈。
而与此同时,GPU等专用计算单元虽然工作频率较低,具有更多的内核数和并行计算能力,总体性能/芯片面积的比和性能/功耗比都很高,却远远没有得到充分利用。
CPU的设计让其比较擅长于处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序。
这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤。
而GPU擅于处理规则数据结构和可预测存取模式。
而APU的设计理念则正是让CPU和GPU完美合作,集合两者的长处,用异构计算来达到整体性能的最佳化。
目前,已经有50款领先的应用能够利用AMD APU进行加速,而后续的应用也将陆续到来——异构计算普及的一刻应该是近在咫尺了。
1.1 CPU和GPU的本质区别(1) CPU特点a) CPU的目标是快速执行单一指令流;b) CPU将其用于乱序执行、寄存器重命名、分支预测以及巨大的cache上,这些设计都是为了加速单一线程的执行速度c) CPU利用cache来降低内存访问延迟d) CPU通过大量的cache和分支预测来降低延迟,这些机制消耗了大量的晶体管的电能;e) CPU每个核心支持1~2个线程;f) CPU切换线程的代价是数百个时钟周期;g) CPU通过SIMD(单指令多数据)来处理矢量数据;h)Intel的CPU没有集成内存控制器(2)GPU特点a) GPU的目标是快速执行大量的并行指令流。
b)GPU将晶体管用于处理器阵列、多线程管理、共享内存、内存控制器,这些设计并不着眼于提高单一线程的执行速度,而是为了使GPU可以同时执行成千上万的线程,实现线程间通信,并提供极高的内存带宽。
c) GPU使用cache来放大内存带宽d) GPU通过同时运行上千个线程来隐藏延迟,等待内存访问的线程会被切换掉,e) GPU切换线程不耗时间。
f)对于支持CUDA的GPU,每个流处理器可以同时处理1024个线程。
g) GPU切换线程的代价是0,事实上GPU通常每个时钟周期都切换线程。
h) GPU则使用SIMT(单指令多线程),SIMT的好处是无需开发者费力把数据凑成合适的矢量长度,并且SIMT允许每个线程有不同的分支。
j) 支持CUDA的GPU集成有8个内存控制器,GPU的内存带宽通常是CPU 的十倍1.2 GPU计算模型内核是执行模型的核心,能在设备上执行。
当一个内核执行之前,需要指定一个N-维的范围(NDRange)。
一个NDRange是一个一维、二维或三维的索引空间。
还需要指定全局工作节点的数目,工作组中节点的数目。
如图NDRange 所示,全局工作节点的范围为{12, 12},工作组的节点范围为{4, 4},总共有9个工作组。
如果定义向量为1024维,特别地,我们可以定义全局工作节点为1024,工作组中节点为128,则总共有8个组。
定义工作组主要是为有些仅需在组内交换数据的程序提供方便。
当然工作节点数目的多少要受到设备的限制。
如果一个设备有1024个处理节点,则1024维的向量,每个节点计算一次就能完成。
而如果一个设备仅有128个处理节点,那么每个节点需要计算8次。
合理设置节点数目,工作组数目能提高程序的并行度。
图1.GPU计算模型CPU的长项是整数计算,GPU的优势则是浮点计算。
对于整机性能而言,CPU和GPU都是性能的保障,合理的搭配才是重中之重,才能给用户带来最强的综合性能。
1.3异构计算分类及发展方向目前的趋势,增加并行的性能,而不是时钟频率。
我们的重点是在一个节点,几乎是充分利用指令级并行性。
这意味着,提高性能,必须来自多芯片,多核或多上下文并行。
Flynn的分类法在硬件定义了四个级别的并行:(1)单指令单数据(SISD)(2)单指令多数据流(SIMD)(3)多指令单数据(MISD)(4)多指令多数据(MIMD)此外,两个细分MIMD单程序多数据(SPMD),以及多个程序多数据(MPMD),我们使用这些术语来描述架构。
图2.架构单芯片CBEA,如图所示(a),由一个传统的CPU核心和8个SIMD加速器核心。
这是一个非常灵活的架构,每个核心可以运行单独MPMD时尚和沟通方案,快速通过片上总线。
其主要设计标准得到了最大限度降低消耗的功率。
图中(b)显示了多线程SIMD加速器结合一个标准的多核CPU核心的GPU。
GPU 具有优异的带宽和计算性能,对很少或根本没有同步运行的SPMD方案进行了优化。
它是专为高性能的图形,其中的数据吞吐量是关键。
最后,图中(c)显示了FPGA逻辑块阵列组成和一个标准的多核心CPU的组合。
FPGA的片上,也可以纳入正规的CPU核心,使得它本身就是一个异构芯片。
FPGA可视为用户定义的应用程序的专用集成电路(ASIC)的可重构。
他们提供充分确定性的表现,是专为高吞吐量,例如,在电信方面的应用。
目前异构并行计算向着以下几个方向发展:(1)集群计算。
这是传统高性能计算的领域。
但是今天高性能计算已经演变成了异构并行计算的一部分,越来越多的高性能计算集群使用GPU、MIC、FPGA等。
(2)单机计算。
推动单机计算向异构并行计算发展的主要动力是游戏、计算机辅助设计等,而主要表现是GPU+CPU的异构计算。
(3)移动计算。
近几年发展表明,人们对手机的需求比对PC的需求更大。
目前几乎所有的移动芯片解决方案都是异构的,除了有CPU、GPU之外,还有视频编解码单元、音频处理单元。
倾向于把更多工作内容转移到手机上,但是为了保证续航时间,移动处理器的设计一开始就不是以高性能为目标,这使得要在移动处理器上获取高性能是比较困难的。
(4)嵌入式计算。
在一些恶劣工作环境下,只有DSP和FPGA能够满足要求。
2、异构计算系统2.1 CPU+GPU 异构系统体系结构计算机系统一般都配置了CPU 和GPU,GPU传统上只负责图形渲染,大部分的仸务都由CPU 来完成。
随着图形渲染的数据量越来越大、计算也越来越复杂,GPU 的可编程性和幵行性也随之增强。
目前,主流GPU 的计算能力、存储带宽、性价比与同期的CPU 相比更具竞争力。
下面以支持CUDA(Computing Unified Device Architecture) 的GPU为例来说明CPU+GPU 异构计算系统的体系结构。
支持CUDA 的GPU 通常由数个线程处理器簇。
TPC(Thread Processor Cluster)组成,如:NVIDIA GeForce 9800 GX2 由2个TPC组成双核GPU;NVIDIA GeForce 9800 GTX 只含有一个TPC。
每个TPC 由若干流多处理器SM(Streaming Multi-processor)组成,一个SM 包含8个线程处理器TP(threaded processor)和一定大小的共享存储空间(Shared Memory),另外,GPU还提供了全局的存储器(Global Memory or Video Memory)和一定数量的全局只读的纹理缓存(Texture Cache)和常缓存(Constant Cache)。
GPU与CPU间的数据传输通过PCIE 通道来完成,该数据传输通道可能成为性能瓶颈。
CPU+GPU 异构系统的整体结构如下图所示。
图3.CPU+GPU异构系统体系结构2.1.2 CUDA执行模型CUDA 源程序由运行于host(CPU)上的控制程序和运行于device(GPU)上的计算核心(kernel)两部分组成。
每一个kernel 由一组相同大小的线程块(thread block)来幵行执行,同一线程块里面的线程通过共享存储空间来协作完成计算,线程块间是相互独立的。
运行时,每一个线程块会被分派到一个流多处理器SM上运行,它们共享大小为16KB 的共享存储空间。
为了管理运行各种不同程序的数百个线程,SM 采用了一种称为SIMT(single instruction multiple thread,SIMT)的新架构。
SIMT 单元以32 个幵行线程为一组来创建、管理、调度和执行线程,这样的线程组称为warp 块。
多个warp 块可以组成一个线程块,一个线程块将会分派到一个SM 上,SM 会将各线程映射到一个TP核心上,各TP 使用自己的指令地址和寄存器状态独立执行。
构成SIMT warp块的各个线程在同一个程序地址一起启动,也可随意分支、独立执行。
为一个SM 指定了一个或多个要执行的线程块时,它会将其分成warp 块,幵由SIMT单元迚行调度。
将块分割为warp 块的方法总是相同的,每个warp 块都包含连续的线程,递增线程ID,第一个warp 块中包含线程0。
每収出一条指令时,SIMT单元都会选择一个已准备好执行的warp 块,幵将下一条指令収送到该warp 块的活动线程,其执行调度过程示意如下图所示。
图4.CUDA执行模型2.1.3 协作框架由于PCIE 数据传输通道会成为CPU+GPU 异构系统的性能瓶颈,因此,保证通信传输开销取得最优解的情况下,更有利于优化通信开销取得期望解,GPU与CPU如何协作完成求解问题,最大限度较少数据在CPU 与GPU之间的频繁传输显得尤为重要。
为此参考文献之处写作框架如下:图5.CPU+GPU协作框架2.2.3 实验评估分析为了验证本文提出的协作框架的有效性和高效性,选择了计算密集型应用图像置乱变换作为测试用例。
实验环境配置如下:(1) Intel Core2 Quad 2.33Ghz ,4GB内存,Microsoft Visual Studio 2005(2) GeForce GTX280,1GB 显存,16KB Shared Memory,CUDA toolkit 和SDK 2.0,NVIDIA Driver for Microsoft Windows XP(177.98)图6.运行时间比较2.3 基于OpenCL的异构系统并行编程使用GPU进行通用计算是近些年的热点研究领域。