图形处理器CUDA编程模型的应用研究

2009-7-7 作者: 钱悦

关键字: 图形处理器 通用计算 计算机统一设备架构 去块滤波 

由于图形处理器(GPU)最近几年的快速发展,基于GPU的通用计算已经成为一个新的研究领域。通过对nVIDIA公司最新的通用计算GPU编程模型一CⅥ)A的研究,阐明了CUDA应用程序的结构和它本身特征,讨论和分析了CUDA编程方法与普通CPU编程的差别,并以H.264数字视频编解码中,以消除宏块边界锯齿为主要目的的去块滤波模块为实例.详细描述了CUDA编程的方法和特点,最后通过与CPU编程实现的去块滤波模块的性能比较,揭示了CUDA在计算能力上的优势。为进一步优化编解码器性能和GPU通用计算提供了新的方法和思路。

  1、引言

  近年来,计算机显卡的运算单元速度越来越快,在某些应用上,甚至已经大幅的超越CPU。因此,很多研究人员开创了一个新的研究领域:基于GPU的通用计算(简称GPGPU--General—purpose computing on graphics processing units),其主要研究内容是,除了在图形处理以外,如何利用GPU来进行更为广泛的应用计算。与此同时,nVIDIA公司近期推出了类似C++语法的CUDA编程模型来支持图形处理器的通用计算,为GPGPU提供了便捷的开发研究平台。

  GPU本身是一种高度并行化的流式处理器,对所有像素进行并行的操作。有理由相信,进行某些通用计算的时候GPU比CPU更具优势。2007年,nVIDIA G80GL的性能可达到350GigaflopsEs](1个gigaflop意味每秒可处理10亿次浮点运算作业),而Intel Core2 3.0GHz的性能只能达到50Gigaflops。从2004年以来,GPU的性能增长速度更是惊人,而且估计还可以维持这一增长速度5年左右。现在每隔半年左右,新一代的GPU便会诞生。

  GPU的可编程特性更使得GIbPU成为可能。所谓GPU的可编程特性,指的是程序员通过自己写的程序,并行处理传人GPU的数据。这样程序员不一定非要使用GI)U来处理图形,还町以实现某些通用计算。另外,对通朋计算来说,最关键的功能是浮点数的精度。目前GPU已经提供IEEE单精度浮点标准,这在很大程度上已能满足相当一部分通用计算的需求。但是,如果要真正满足许多应用领域计算的需求。IEEE双精度浮点运算是必须的条件。很难说GPU在近期会达到这一条件。

  目前,国外在将GPU用于通用汁算方面的研究已具规模。这些研究涉及的范f翻很广,从刚形输出流水线以外的非绘制处理,到几何汁算、碰撞检测、运动规划、优化计算、偏微分方程数值求解、代数汁算及流体模拟、数据库操作、频谱变换和滤波等,不一而足。而国内对这方面的研究却相对比较少。在H.264视频压缩解码器领域,去块滤波(deblocking filter)是相对比较简单但却非常耗时的部分,本文将以CUDA实现的去块滤波为例,介绍将GPU用于通用汁算的方法和技术原理,并与传统的CPU实现的去块滤波相比较。

  2、GPU通用编程模型及CUDA

  2.1 数据并行化处理的GPU

  GPU在速度上之所以会有如此巨大的变革主要是因为它本身的设计原理。GPU使用更多的晶体管来用于数据处理,其数量远大于数据缓存和流控制。GPU特别适合处理那些并行数据计算一即同一程序并行地在许多数据元素上执行。这样一来,它对于流控制的要求就不是很高,而且运算将代替大数据缓存来隐藏内存存取延迟。

  数据元素通过数据并行处理机制映射到每个并行处理线程上。许多处理大数据集的应用程序,如数组,可以通过使用一个数据并行处理模型来加速计算。在3D渲染中,像素和顶点集可以映射到并行线程。同样,图形图像处理程序,如视频编解码,图像缩放和模式识别等,可以映射块和像素到并行处理线程上。事实上,除了图像渲染和处理领域,其他领域的许多计算也可以通过数据并行处理得以加速,例如信号处理,物理仿真,金融工程以及生物信息学。

  然而,直到现在,GPU要实现这样的应用还是存在许多困难的:

  1)GPU只能通过一个图形的API来编程,这不仅加重了学习负担更造成那些非图像应用程序处理这些API的额外开销。

  2)由于DRAM内存带宽,一些程序会遇到瓶颈。

  3)无法在DRAM上进行通用写操作。

  2.2 CUDA

  CUDA(Compute Unified Device Architecture,计算机统一设备架构)是一种新的处理和管理GPU计篼的硬件和软件架构,它将GPU视作一个数据并行计算没备,并且无需把这些计算映射到图形API。GeForce 8,Tesla解决方案和一些Quadro解决方案已经提供了CUDA。操作系统的多任务机制可以同时管理CUDA访问GPU和图形程序的运行时刻。

  CUDA在软件方面组成有:一个硬件驱动,一个应用程序接口和运行时,两个通用算术库一CUFFT和CUBI。AS。CUDA改进了DRAM的读写灵活性,使得GPU与CPU的机制相吻合。另一方面,CUDA提供了片上共享内存,使得线程之间可以共享数据。应用程序可以利用共享内存来减DRAM的数据传送,更少的依赖DRAM的内存带宽。

  2.3 CUDA编程模型

  CUDA程序构架分为两部分:Host和Device。一般而言,Host指的是CPU,Device指的是GPU。在CUDA程序构架中,主程序还是由CPU来执行,而当遇到数据并行处理的部分,CUDA就会将程序编译成GPU能执行的程序,并传送到GPU。而这个程序在CUDA里叫做内核。

  在实际运行时,CUDA会产生许多在GPU上执行的线程,每一个线程都会去执行内核这个程序虽然程序是同一份,但是因为索引不同,而取得不同的数据来进行计算。

  在GPU中要执行的线程,根据最有效的数据共享来创建块(Block),其类型有一维、二维或三维。在同一个块里的线程,使用同一个共享内存。另外,块的大小是有限制的,所以不能把所有的线程都塞到同一个块里(一般GPGPU程序线程数目是很多的);这时,可以用同样维度和大小的块(需同一个内核),来组成一个网格(Grid)做批处理(在同一个网格里的块,GPU只需编泽一次)。具体框架如图1所示。

  3、去块滤波




<<首页 <上一页  1  2  3  下一页>  末页>>  
责任编辑:熊东旭