GPU通用计算(GPGPU)——将图形处理器用于高性能计算领域

1.1 研究背景和意义
随着当前计算机性能的不断提高,应用范围越来越广泛,不同的计算任务和计算需求都在快速增长,这就决定了处理器朝着通用化和专用化两个方向飞速发展。一方面,以CPU为代表的通用处理器是现代计算机的核心部件,经过多次器件换代的变迁,不仅集成度大大提高,性能和功能也大为改善,除了负责解释、执行指令和完成各种算术逻辑运算外,还控制并协调计算机各部分的执行。另一方面,处理器在特定领域应用的专用化程度也越来越高,例如在视频、图像和音频处理等领域,都出现了相应的专用处理器(如VPU、GPU、APU等)。在针对特定应用方面与通用处理器相比,专用处理器能够更加高效的满足特定的计算任务和需求。
近年来,计算机图形处理器(GPU,Graphics Processing Unit)正在以大大超过摩尔定律的速度高速发展,极大的提高了计算机图形处理的速度和质量,不但促进了图像处理、虚拟现实、计算机仿真等相关应用领域的快速发展,同时也为人们利用GPU进行图形处理以外的通用计算提供了良好的运行平台[1]。
GPU应用领域的拓宽与其硬件发展有着极大关系。GPU自1999年首先由NVIDIA公司提出后,就其发展的速度而言,是CPU更新速度的三倍。从1993年开始,GPU的性能以每年2.8倍的速度增长。目前,图形处理器已经经历了五代发展,平均每半年就有新一代的GPU问世。
2004年,NVIDIA GeForce 6800 Ultra处理器峰值速度可达40GFLOPS,对比Intel Pentium 4 3.0GHz,采用SSE2指令集也只能达到6 GFLOPS[3]。NVIDIA最新发布的GeForce 8800图形处理器集成了6.8亿个晶体管,拥有128个流处理单元,其峰值运算能力超过340GFLOPS,而Intel最新的Pentium4 Core 2 Extreme X6800只有46.88GFLOPS。

图 1 GPU与CPU的发展与性能比较
图形处理器技术的迅速发展带来的并不只是速度的提高,还产生了很多全新的图形硬件技术,使GPU具有流处理、高密集并行运算、可编程流水线等特性,从而极大的拓展了GPU的处理能力和应用范围[2]。
正是由于GPU具有高效的并行性和灵活的可编程性等特点,越来越多的研究人员和商业组织开始利用GPU完成一些非图形绘制方面的计算,并开创了一个新的研究领域:基于GPU的通用计算(GPGPU,General-Purpose computation on GPU),其主要研究内容是如何利用GPU在图形处理之外的其他领域进行更为广泛的科学计算[4]。目前已成功应用于代数计算、流体模拟、数据库应用、频谱分析等非图形应用领域[5],甚至包括智能信息处理系统和数据挖掘工具等商业化应用。同时,也产生了一些针对GPU开发的通用计算工具包,能够基于GPU平台对FFT、BLAS、排序及线性方程组求解等科学计算进行优化实现。
基于GPU的通用计算已成为近几年人们关注的一个研究热点。将GPU用于通用计算的主要目的是为了加速计算,加速的动力来自GPU在高性能计算方面所具有的优势:
(1)高效的并行性。这一功能主要是通过GPU多条绘制流水线的并行计算来体现的。在目前主流的GPU中,配置多达16个片段处理流水线,6个顶点处理流水线。多条流水线可以在单一控制部件的集中控制下运行,也可以独立运行。GPU的顶点处理流水线使用MIMD方式控制,片段处理流水线使用SIMD结构。相对于并行机而言,GPU提供的并行性在十分廉价的基础上,为很多适合于在GPU上进行处理的应用提供了一个很好的并行方案。
(2)高密集的运算。GPU通常具有128位或256位的内存位宽,因此GPU在计算密集型应用方面具有很好的性能。
(3)超长图形流水线。GPU超长图形流水线的设计以吞吐量的最大化为目标(如NVIDIA GeForce 3流水线有800个阶段),因此GPU作为数据流并行处理机,在对大规模的数据流并行处理方面具有明显的优势。
如图2所示,CPU中的大部分晶体管主要用于构建控制电路(如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。GPU与CPU的设计目标不同,其控制电路相对简单,而且对Cache的需求较小,所以大部分晶体管可以组成各类专用电路和多条流水线,使GPU的计算速度有了突破性的飞跃,拥有惊人的处理浮点运算的能力。

图 2 GPU与CPU内部结构比较
正是由于GPU在并行处理和计算密集型问题求解等方面所具有的诸多优势,GPU已成为目前普通PC机所拥有的强大、高效的计算资源。从系统架构上看,GPU是针对向量计算进行了优化的高度并行的数据流处理机。这种以数据流作为处理单元的处理机,在对数据流的处理上可以获得很高的效率。根据NVIDIA公司开发的GPU工具包CUDA(Compute Unified Device Architecture)的测试结果显示,利用GPU实现FFT、BLAS、排序及线性方程组求解等科学计算,与单纯依靠CPU实现的算法相比,平均性能提高了近20倍[7]。
由此可见,GPU的发展速度(包括集成度、计算密集型问题的处理能力等)已远远超过通用处理器,特别是随着可编程能力、并行处理能力和应用范围方面得到不断提升和扩展,使得GPU已成为当前计算机系统中具备高性能处理能力的部件。因此,充分利用现有计算资源,发挥GPU的高性能计算能力,在GPU与CPU的协作模式、GPU通用计算的计算模式以及性能优化等方面进行深入研究,将对进一步拓展目前高性能计算体系结构,为科学计算和工程应用提供新型的计算资源具有重要意义。

1.2 国内外研究现状
目前,以NVIDIA和ATI为代表的GPU产品正处于快速发展的过程当中,每隔半年左右新一代的产品便会诞生。GPU在增加更多功能的同时,也提供了更强的处理能力。随着科学计算可视化、医疗图像、虚拟现实等学科的发展和娱乐产业的推动,需要高性能计算的一些领域和计算机图形领域越来越紧密的结合起来。2003年,世界图形学硬件年会(SIGGRAPH/EUROGRAPHICS Graphics Hardware 2003)迅速将其重点转向了计算机图形处理器的非图形应用。之后,IEEE、SIGGRAPH、SUPERCOMPUTING等国际会议每年都设立了GPGPU相关专题的讨论组。越来越多的科研机构开始利用GPU的处理能力进行非图形绘制方面的科学计算研究。
在基于GPU通用计算的应用系统方面,主要包括几何计算、碰撞检测、运动规划、代数运算、优化计算、偏微分方程、数值求解等。
在图形处理器出现的早期,Larsen等人在2001年利用多纹理技术实现了矩阵运算操作。2001年后,随着NVIDIA GeForce 3图形处理器的出现,顶点级可编程(Vertex Program)开始普及。虽然这个时候片段级上还只是固定的几条指令,但利用GPU进行通用计算方面的应用已经全面展开。Thompson等人在顶点级实现了一个代数运算的框架系统,其中包括矢量运算和矩阵乘法等[8]。2002年,人们开始利用Texture Shader结合Register Combiner来求解扩散方程[9]。2003年片段级可编程(Fragment Program)出现,大大加速了GPU通用计算方面的研究。很多研究人员开始利用片段程序来求解一般代数问题,包括流体模拟、物理现象仿真、有限差分方程组求解和优化等[10]。
2004年,美国研制的GPU集群系统(The Stony Brook Visual Computing Cluster)[11]运用于城市气流模拟。另外,美国北卡罗莱那大学将GPU计算应用于数据库领域,利用GPU硬件对数据库的关系查询、合取选择、聚集操作等进行加速和优化[2]。GPU 甚至被用来进行声音的合成运算,以使CPU和APU(Audio Processing Unit)达到良好的均衡。同年,美国国防技术情报中心公开发布了《GPU:未来高性能计算引擎》的科技报告,内容包括对GPU通用计算应用于高性能计算领域的发展展望和未来面临的挑战。
2005年10月NVIDIA和ATI公司相继开发基于GPGPU的物理计算API,使得GPU能够利用浮点片段着色器单元处理包含大量并行操作的科学计算任务。
2006年,分布式计算项目Folding@Home在蛋白质折叠的研究中充分发挥了GPU的高性能优势。该项目利用ATI GPU获得了每台计算机100GFLOPS的高性能[12]。另外,ATI公司在SIGGRAPH 2006上做了数据并行虚拟机(Data Parallel Virtual Machine)的演示,并使用了专门为GPU通用计算而设计的“Close to the Metal”API。通过在一个显卡上使用多个GPU来形成数据流处理集群,通过强大的数据并行处理机的性能来解决GPU并行数据加速的问题。
目前,国内在GPU通用计算方面的研究也在一些科研机构和院校逐步开展起来。2004年,清华大学利用GPU的并行计算能力和数据流处理能力,在GPU上实现了一种新的辐射度计算方法,并实现了Jacobi迭代法快速求解线性方程组。另外,中科院计算技术研究所、华中科技大学、西南交通大学等也相继针对特定应用在GPU上进行了实验验证。
在GPU通用计算的软件开发环境方面,OpenGL作为事实上的工业标准已为学术界和工业界所普遍接受,其中包括了GPU厂商以及OpenGL架构委员会(ARB)所扩充的函数,以此来实现GPU厂商提供的新功能[14]。DirectX则根据GPU新产品功能的扩充与进展及时的发布新的版本。二者在实现GPU通用计算方面都需要使用者非常熟悉GPU图形绘制的原理和硬件结构等许多具体问题。
高级绘制语言和实时绘制语言的出现,如NVIDIA的Cg[14],OpenGL Shading Language,High Level Shading Language[21]等,为编程人员提供了直接基于图形API(OpenGL或DirectX)编程的较为方便和高层次的工具。另外,随着Brook、SH等通用绘制语言的出现,允许开发人员在不考虑图形绘制和硬件结构的情况下,充分利用GPU的可编程性编写面向通用计算的绘制程序。
随着时间的推移,GPU通用计算的应用也将越来越广泛。然而,目前在软硬件方面依然存在很多需要克服的问题。首先,GPU是面向图形的,在硬件结构、指令系统、处理流程等方面和真正用于通用计算的CPU有本质差别;其次,在GPU计算的软件环境方面需要进行更多的研究和探索,如制定统一的抽象界面、编程模型、开发环境和工具软件等[2];另外,GPU通用计算需要在计算模式上提出一种能够很好的适应于问题求解的方法。

目前,GPU通用计算在研究领域通过IEEE、SIGGRAPH、SUPERCOMPUTING等国际会议以及GPGPU、Folding@Home等组织的全力支持,已经初现向主流计算的趋势发展。另外在商业化方面,NVIDIA、AMD等公司也计划推出包括GPGPU开发工具、全新的流处理硬件以及GPU+CPU的双核体系结构等一系列新型的高性能计算环境,同时也产生了一些用于信息处理等领域的商业化GPGPU应用。这些都为GPU通用计算提供了良好的平台和发展空间。但GPU通用计算不论是在硬件上,还是在软件上仍然存在很多问题,从研究到实用还要很长的路要走。
在后续的研究工作中,将对本文仍然未解决的一些问题进行研究,包括针对GPU—CPU协作模式的精确模型建立和完整的性能描述,GPU流计算模式对GPU通用计算的具体编程方法上的框架模型,以及对GPU流计算模式的性能建立模型,综合各种因素对性能的影响,对GPU流计算模型进行完整的性能评估和测试等。除此以外,后续的研究工作将围绕以下几个关键问题进行深入研究。
(1)与现实应用紧密结合,充分利用GPU通用计算的优势,进一步拓展GPU通用计算的应用范围。通过对具体问题的加速和优化实现,努力使GPU通用计算有更好的实用性,能够为更多的人所接受和认可。
(2)深入研究GPU-CPU协作计算模式和多GPU体系结构,进一步利用GPU与CPU良好的协作性构建具有高性能的计算环境,最大程度上发挥专用处理器和通用处理器各自的优势。
(3)在基于GPU通用计算的算法构造、优化、实现等方面为建立良好的数据结构组织和优化策略。
(4)针对GPU通用计算的开发工具、调试器、优化策略进行深入的研究,为GPU通用计算设计并实现一个界面友好、可扩展性强的开发环境。

你可能感兴趣的:(技术探讨,图形,gpgpu,编程,优化,processing,开发工具)