毕业设计论文模板基于GPU二维可分离卷积运算_第1页
毕业设计论文模板基于GPU二维可分离卷积运算_第2页
毕业设计论文模板基于GPU二维可分离卷积运算_第3页
毕业设计论文模板基于GPU二维可分离卷积运算_第4页
毕业设计论文模板基于GPU二维可分离卷积运算_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE摘要图像滤波器是当前绝大多数图像处理软件中的重要组成部分,然而,图像滤波对于计算量的要求是巨大的,为了加强图像处理软件的人机交互性能,使用GPU来加速图像滤波,是一个很好的选择。NVIDIA新近推出的GPU计算平台采用距阵型的计算架构,特别适合二维图像信号的处理,且相对CPU有着更高的算法可并行性和计算效率。本文力图基于GPU的CUDA开发环境,利用GP-GPU的计算特性,实现二维可分离卷积运算,以提高算法的运行效率。最后,本文模拟了二维可分离卷积在C语言中的实现,并分别在NVIDIAGPU并行计算平台和Intel及AMDCPU计算平台上加以运行,同时进行了两种计算平台上算法实现的性能比较。关键字:可分离卷积滤波;卷积;可编程图形处理器;GPU;CUDA

AbstractImage-filteringisanimportantpartofmanycontemporaryimage-processingtools.Sinceimage-filteringapproachesareverycomputationallydemanding,topreserveinteractivityofthosetool,usingGPUtoacceleratetheimagefilteringmaybeagoodwayout.TheGPUcomputingplatforms,recentlylaunchedbyNVIDIA,adoptsthematrix-typecomputingarchitecture,especiallysuitablefortheprocessingofthetwo-dimensionalimagesignalandhavehigherparallelismofthealgorithmsandcomputationalefficiencyaccordingtoCPU.BasedontheCUDAdevelopmentenvironmentofGPU,byutilizingthecomputingcharacteristicofGP-GPU,thispaperaimsattherealizationandtheefficiencyimprovementofthedetachabletwo-dimensionalconvolutionoperation.Therefore,realizationandtestingofadetachabletwo-dimensionalconvolutionintheClanguageareimplementedonbothNVIDIAGPUparallelcomputingplatformsandIntel(orAMD)CPUcomputingplatform.Then,thealgorithmperformanceofthetwocomputingplatformsarecomparedandanalyzedinthisdissertation.Keywords:detachableconvolutionfiltering;convolution;programmablegraphicsprocessor;GPU;CUDA目录第一章绪论 11.1引言 11.2研究背景 21.3研究目的和意义 31.4论文主要研究内容及论文结构安排 4第二章图像处理基础理论 52.1图像处理的概念 52.2图像的格式 63.2图像处理中常用的几种变换 83.2.1傅立叶变换 83.2.2离散傅立叶变换 83.2.3快速傅立叶变换 83.2.4离散余弦变换 9第三章图像处理单元GPU 103.1GPU的简介 103.2GPU与CPU的比较 113.2.1GPU与CPU的性能比较 113.2.2GPU与CPU内部结构比较 123.3NVIDIACUDA 133.4GPU的发展前景 15第四章可分离卷积技术 164.1卷积 164.2图像滤波 184.3可分离卷积的原理 19第五章基于GPU的二维图像卷积实现 205.1GPU的编程模型 205.1.1高度多线程协处理器 205.1.2线程批处理 205.1.3存储器模型 215.2硬件实现 235.2.1在片共享存储器(SIMD单指令多数据)多处理器组 235.2.2执行模型 245.2.3计算能力 255.2.4多设备 255.2.5状态转换 265.3图像卷积 275.3.1分离滤波 275.3.2一个Naive的执行 275.3.3公共存储器和外围 285.3.4避免空闲的线程 295.3.5可分离滤波增加效率 315.3.6行滤波 315.3.7列滤波 325.4可分离卷积核的心算法 345.4.1GPU可分离卷积核心算法 345.4.2CPU可分离卷积核心算法 345.5具体算法实现方法 365.5.1算法主流程图 365.5.2结果分析 36第六章总结 41致谢 42参考文献 43附录A相关的数学变换公式 44附录B可分离卷积的部分代码 48毕业设计说明书(论文)第42页第一章绪论1.1引言现代数字图像处理包括很多技术,从简单的图像模糊、边缘检测、雾化到复杂的高动态范围(HDR)图像的色调映射,基本上都使用了一种或者多种图像滤波器的组合。因此可以说图像滤波器是现代计算机图形学中的关键要素之一。图像滤波中,又分为两种不同的基本方式:在空间域中的滤波和在频域中的滤波。在空间域中的滤波很简单,只需要将待滤波的图像和滤波器核进行卷积运算;而在频域的滤波则需要先将图像通过傅立叶变换转换到频域上,然后乘以适当的滤波器,最后,通过傅立叶反变换转换到空间域中。这两种方式在不同的情况下有着各自的缺点和优点,而且在CPU上的实现已经是成熟通用的方法广为人们熟知。然而由于这两种方法都存在计算量巨大的特点,当待处理的图像比较大的时候,CPU的结构特点决定了其的性能往往不能满足图像滤波的实时性要求。图形处理器(GPU)为SIMD(SingleInstructionMultipleData,单指令多数据流)架构,决定了它非常适合处理大量数据诸如图像、音频的这类任务。由于早期的GPU是固定管线结构,自由度非常小,人们难以利用其进行3D图形运算之外的工作。自从Microsoft推出DirectX8以后,GPU工作管线中加入了可编程单元,使得人们可以使用GPU进行一些通用的计算,同样,也给使用GPU进行图像滤波处理提供了可能[1]。在GPU上实现可分离图像卷积滤波算法,可以有效的提高图像处理的效率和速率。本文主要讨论如何在GPU上实现可分离卷积滤波算法,并将其与CPU下卷积滤波算法作性能比较。

1.2研究背景20世纪六、七十年代,受硬件条件的限制,图形显示器只是计算机输出的一种工具。限于硬件发展水平,人们只是纯粹从软件实现的角度来考虑图形用户界面的规范问题。图形用户界面国际标准GKS(GKS3D),PHIGS(三维图形系统)就是其中的典型代表。20世纪80年代初期,出现GE(GeometryEngine)为标志的图形处理器。GE芯片的出现使得计算机图形学的发展进入图形处理器引导其发展的年代。GE的核心是四位向量的浮点运算。它可由一个寄存器定制码定制出不同功能,分别用于图形渲染流水线中,实现矩阵,裁剪,投影等运算。12个这样的GE单元可以完整地实现三维图形流水线的功能。芯片设计者JamesClark以此为核心技术建立的SGI公司,对图形学和图形工业发展产生巨大影响。基于SGI图形处理器功能的图形界面GL及其后的OpenGL,成为图形用户界面事实上的工业标准。20世纪80年代和90年代。GE及其图形处理器功能不断增强和完善,使得图形处理功能逐渐从CPU向GPU转移。此前计算机图形特别是三维图形的应用主要集中在工作站以上的处理器上,图形处理流水线的大部分功能是由CPU完成的。现代图形处理的流水线主要功能分为顺序处理的两个部分。第一部分对图元实施几何变化以及对图元属性进行处理(含部分光照计算)。第二部分则是扫描转换进行光栅化以后完成一系列的图形绘制处理,包含各种光照效果和合成、纹理映射、遮挡处理、反混淆处理等。当越来越高级的图形绘制功能需要在光栅一级实现时,可以利用SIMD(单指令多数据)结构进行处理。20世纪90年代,NVIDIA进入个人电脑3D市场。1999年推出具有标志意义的图形处理器,GeForce256。第一次在图形芯片上实现了3D几何变换和光照计算。此后GPU进入高速发展时期,平均每隔6个月就出现性能翻番的新的GPU。从SGI的GE到NVIDIA的GeForceGPU经历了20年,芯片的线宽从3μm缩小到0.13μm(2004年的GeForce6800集成了2.2亿晶体管),集成电路的逻辑设计能力提高300倍,但处理器数据通道接口带宽仅提高十几倍。同时对图形处理器计算能力的需求不断增长,出现了可编程的图形处理器。以NVIDIA和ATI为代表的GPU技术正是适应这种趋势。1.3研究目的和意义数字信息处理技术广泛应用于通信、计算机、广播电视等领域,带来了会议电视、可视电话及数字电视、媒体存储等一系列应用,促使了许多图像和视频编码标准和算法的产生。随着这些图像、信号处理技术的不断发展,它对计算机的计算性能要求也越来越高,在此基础上产生了一种新型图形处理器GPU,它不但极大的提高了计算机图形处理的速度和质量,而且也促进了图像处理、虚拟现实、计算机仿真等相关应用领域的快速发展。图像卷积是一种技术,可用于各种各样的图像处理任务,如在图像滤波、图像增强、图像分析、模糊过滤器、边缘检测等处理时都要用到卷积计算。图像卷积运算实质是一种矩阵运算,其特点是运算量大,并且数据复用率高,用软件计算图像卷积很难达到实时性的要求。NVIDIACUDA技术是一种新的基础性计算处理架构技术,这种架构技术可使消费者、企业和技术应用软件利用GPU(图形处理器)解决复杂的运算处理问题。这里我们可以用CUDA工具包(工具箱)来解决图像卷积运算问题。因此在NVIDIACUDA的技术支持下运用可分离卷积滤波算法可以实现图像卷积的性能优化,减少图像处理时间和运算量,从而将增强了图像处理中人机交互性能。

1.4论文主要研究内容及论文结构安排本论文通过使用可分离卷积滤波算法实现对图像数据处理,并将卷积算法在GPU和CPU两种计算平台下的性能进行比较,从而得出GPU下进行可分离卷积所具有的优越性。论文的结构安排如下:第一章绪论介绍研究背景、目的和意义等;第二章图像处理相关知识的简介,主要对本论文中使用到的一些图像处理知识进行简要的介绍;第三章GPU的相关介绍,主要介绍GPU的发展和CPU的区别及其重要性;第四章可分离卷积滤波技术,主要介绍卷积、滤波及可分离卷积原理的相关技术;第五章具体介绍如何在GPU下实现可分离图像卷积,并对其与CPU下卷积速率作性能分析;第六章总结与展望,主要对论文进行总结和今后研究设想。最后是参考文献和附录的相关内容。

第二章图像处理基础理论2.1图像处理的概念数子图像处理(DigitalImageProcessing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于20世纪60年代初期。早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等[2]。一般而言,对图像进行加工和分析主要有如下三方面的目的:提高图像的视感质量,以达到赏心悦目的目的。如去除图像中的噪声,改变图像的亮度、颜色,增强图像中的某些成份、抑制某些成份,对图像进行几何变换等,从而改善图像的质量,以达到或真实的、或清晰的、或色彩丰富的、或意想不到的艺术效果。提取图像中所包含的某些特征或特殊信息,以便于计算机分析。例如,常用作模式识别、计算机视觉的预处理等。这些特征包括很多方面,如频域特性、灰度/颜色特性、边界/区域特性、纹理特性、形状/拓扑特性以及关系结构等。对图像数据进行变换、编码和压缩,以便于图像的存储和传输。

2.2图像的格式目前各种计算机软件支持的图像格式很多,其中主流的图像格式有:BMP、PCX、TGA、TIFF、JPG、GIF等,此外还有其它非主流的图像格式,如:DXF、WMF、EMF、LIC(FLI/FLC)、EPS、TGA等等。可以预知,随着图像处理技术的发展,还将出现新的图像文件格式。无论是何种操作系统下的图像应用程序都可以接受一种或多种图像文件格式作为输入或输出。然而,到目前为止,还没有一种软件可以支持所有的图像文件格式,现在能够支持图像格式最多的一种图像格式转换软件可以达到七十多种[3]。本论文只对常用的几种文件处理格式进行简要说明。BMP格式:BMP是英文Bitmap(位图)的简写,是一种与设备无关的图像文件,是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。例如BMP文件用于作为Windows系统的图标和背景。BMP是一种典型的位映射存储形式,可达24位全彩色模式。为了处理方便,BMP文件都不压缩。由此导致了它与生俱生来的缺点——占用磁盘空间过大。所以,目前BMP在单机上比较流行。TIFF(TagImageFileFormat)称为标记图像文件格式。它是Alaus和Microsoft公司为扫描仪和桌面出版系统研制开发的较为通用的图像文件格式。TIFF的存储格式可以压缩也可不压缩,压缩的方法也不只一种。TIFF不依赖于操作环境,具有可移植性。它不仅作为图像信息交换的有效媒介,更可作为图像编辑程序的基本内部数据格式,具有多用性。由于PC机和苹果MAC机同时支持TIFF格式,所以如果制作的图像同时要在PC机及苹果MAC机系统上应用的话,TIFF格式是个很好的选择。GIF(GraphicsInterchangeFormat)是由CompuServe公司为了制定彩色图像传输协议而开发的图像格式文件。它具有支持64000像素的图像,256到16M颜色的调色板,单个文件的多重图像,按行扫描迅速解码,有效地压缩以及与硬件无关等特性。GIF文件在存储时都经LZW压缩,可以将文件的大小压缩至一半。GIF可用于压缩复杂并极富变化的图像,因此适合于需要高效率的图像处理。目前,在因特网上,GIF格式已成为主页图片的标准格式。JPEG也是常见的一种图像格式。它是按图像专家联合组制订的压缩标准DCT来压缩储存的图像文件格式。JPEG文件的扩展名为.jpg或.jpeg,它使用一种有损压缩算法,无损压缩算法能在解压后准确再现压缩前的图像,而有损压缩则牺牲了一部分的图像数据来达到较高的压缩率。但是这种损失很小以至于人们很难察觉。同时JPEG还是一种很灵活的格式,具有调节图像质量的功能,允许你用不同的压缩比例对这种文件压缩,比如我们最高可以把1.37MB的BMP位图文件压缩至20.3KB。当然我们完全可以在图像质量和文件尺寸之间找到平衡点。由于JPEG优异的品质和杰出的表现,它的应用也非常广泛,特别是在网络和光盘读物上,肯定都能找到它的影子。目前各类浏览器均支持JPEG这种图像格式,因为JPEG格式的文件尺寸较小,下载速度快,使得Web页有可能以较短的下载时间提供大量美观的图像,JPEG同时也就顺理成章地成为网络上最受欢迎的图像格式。JPEG2000同样是由JPEG组织负责制定的,它有一个正式名称叫做"ISO15444",与JPEG相比,它具备更高压缩率以及更多新功能的新一代静态影像压缩技术。JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右。与JPEG不同的是,JPEG2000同时支持有损和无损压缩,而JPEG只能支持有损压缩。无损压缩对保存一些重要图片是十分有用的。JPEG2000的一个极其重要的特征在于它能实现渐进传输,这一点与GIF的"渐显"有异曲同工之妙,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示,而不必是像现在的JPEG一样,由上到下慢慢显示[6]。此外,JPEG2000还支持所谓的"感兴趣区域"特性,你可以任意指定影像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。JPEG2000和JPEG相比优势明显,且向下兼容,因此取代传统的JPEG格式指日可待。

3.2图像处理中常用的几种变换3.2.1傅立叶变换傅立叶变换是一种常见的正交变换,它是数字图像处理技术的基础。原始的多媒体数据一般为时空信号,在时空上有最大的分辨率,并可利用时空上的相关性进行数据压缩,傅立叶变换可将时空域中的多媒体信号映射到频率域来研究,即更符合人的感觉特征,也可以利用信号在频率域中的冗余进行数据压缩,傅立叶变换所得的频率信号在频率上有最大的分辨率,尤其本身并不包含时空信息,简单的说就是傅立叶变换主要是通过在空间域和频率域来回切换图像,对图像的信息特征进行提取和分析,简化计算的工作量,而且可以化复杂的卷积运算为简单的乘积运算,被喻为描述图像信息的第二种语言,广泛应用于图像变换、图像编码与压缩、图像分割和图像重建等[7]。傅立叶变换主要的性质有:可分性、线性、对称性、尺度变换特性、平移特性、共轭性、旋转特性、能量保持定理、相关定理、卷积定理。主要公式见附录A。3.2.2离散傅立叶变换随着计算机的普及和计算技术的快速发展,为了适应数字化的发展而在数字图像处理中应用傅立叶变换,必须引入离散傅立叶变换的概念,目前离散傅立叶变换已经成为数字信号处理和图像处理的一种重要的手段。它与傅立叶变换最大的不同在于,傅立叶变换是以连续的频域为变换基础的,而离散傅立叶变换的变换基础为有限个等间频频率,由于离散傅立叶变换中其信号与频谱都是离散的,尤其频谱是离散的,相对于傅立叶变换的连续频谱来说,离散的频谱更容易被现在的数字设备所处理[7][4]。离散傅立叶变换主要的性质有:可分性、线性、对称性、尺度变换特性、平移特性、周期性、共恶性、旋转特性、平均性、微分特性、相关定理、卷积定理。主要公式见附录A。3.2.3快速傅立叶变换随着计算机技术和数字电路的迅速发展,离散傅立叶变换已经成为数字信号处理和图像处理的一种重要的手段。然而离散傅立叶变换需要的计算量太大,运行时间长,在某种程度上限制了它的使用。例如计算一个长度为N的一维离散傅立叶变换,公式为:对于k的每一个值需要做N次复数乘法和次复数加法。那么对与N个k,需要N2次复数乘法和次复数加法。很显然当N很大时,计算量很大。1965年,库里和图基首先提出了一种快速傅立叶变换(FFT)算法,采用该算法进行离散傅立叶变换,复数乘法和加法次数正比于,当N很大时计算量也会大大减少。它不是一种新的算法,只是离散傅立叶变换的一种改进算法,它分析了傅立叶变换中重复的计算量,并最大可能使之减少,从而达到快速计算目的[7][4]。主要公式见附录A。3.2.4离散余弦变换离散余弦变换(DCT)是正交变换中的一种,是把空间域上的图像变换到频率域上的一种方法。由于离散傅立叶变换DFT存在有复数运算和运算量大的缺点,常常使实时处理发生困难。因此在寻求快速算法的同时,构造一种实数域的变换―离散余弦变换(DCT)。由于DCT变换核构成的基向量于图像内容无关,且变换核是可分离的,即二维DCT变换可以用两次一维DCT完成。同时,由于DCT的变换矩阵的基向量近似于T矩阵的特征向量。而T矩阵体现了人类语言及图像信号的相关性,因此DCT常被认为是对语言与图像信号压缩处理的准最佳变换,其变换特性接近于K-L变换。经DCT处理后,图像的能量集中在少数系数上,及这些系数不为零,其余的大部分系数都为零。因此只需对不为零的变换系数编码后传输,即可达到压缩的目的。DCT提出的各种快速算法比较容易实时实现,所以DCT得到广泛应用,很多图像压缩的标准都采用DCT变换[7][4][3]。主要公式见附录A。

第三章图像处理单元GPU3.1GPU的简介 随着当前计算机性能的不断提高,应用范围越来越广泛,不同的计算任务和计算需求都在快速增长,这就决定了处理器朝着通用化和专用化两个方向飞速发展。一方面,以CPU为代表的通用处理器是现代计算机的核心部件,经过多次器件换代的变迁,不仅集成度大大提高,性能和功能也大为改善,除了负责解释、执行指令和完成各种算术逻辑运算外,还控制并协调计算机各部分的执行。另一方面,处理器在特定领域应用的专用化程度也越来越高,例如在视频、图像和音频处理等领域,都出现了相应的专用处理器(如VPU、GPU、APU等)。在针对特定应用方面与通用处理器相比,专用处理器能够更加高效的满足特定的计算任务和需求。近年来,计算机图形处理器(GPU)正在以大大超过摩尔定律的速度高速发展,极大的提高了计算机图形处理的速度和质量,不但促进了图像处理、虚拟现实、计算机仿真等相关应用领域的快速发展,同时也为人们利用GPU进行图形处理以外的通用计算提供了良好的运行平台。GPU应用领域的拓宽与其硬件发展有着极大关系。GPU自1999年首先由NVIDIA公司提出后,就其发展的速度而言,是CPU更新速度的三倍。从1993年开始,GPU的性能以每年2.8倍的速度增长。目前,图形处理器已经经历了五代发展,平均每半年就有新一代的GPU问世。目前,以NVIDIA和ATI为代表的GPU产品正处于快速发展的过程当中,每隔半年左右新一代的产品便会诞生。GPU在增加更多功能的同时,也提供了更强的处理能力。随着科学计算可视化、医疗图像、虚拟现实等学科的发展和娱乐产业的推动,需要高性能计算的一些领域和计算机图形领域越来越紧密的结合起来。2003年,世界图形学硬件年会(SIGGRAPH/EUROGRAPHICSGraphicsHardware2003)迅速将其重点转向了计算机图形处理器的非图形应用。之后,IEEE、SIGGRAPH、SUPERCOMPUTING等国际会议每年都设立了GPU相关专题的讨论组。越来越多的科研机构开始利用GPU的处理能力进行非图形绘制方面的科学计算研究[13]。3.2GPU与CPU的比较3.2.1GPU与CPU的性能比较 图形处理器技术的迅速发展带来的并不只是速度的提高,还产生了很多全新的图形硬件技术,使GPU具有流处理、高密集并行运算、可编程流水线等特性,从而极大的拓展了GPU的处理能力和应用范围。正是由于GPU具有高效的并行性和灵活的可编程性等特点,越来越多的研究人员和商业组织开始利用GPU完成一些非图形绘制方面的计算,并开创了一个新的研究领域:基于GPU的通用计算(GPGPU,General-PurposecomputationonGPU),其主要研究内容是如何利用GPU在图形处理之外的其它领域进行更为广泛的科学计算。目前已成功应用于代数计算、流体模拟、数据库应用、频谱分析等非图形应用领域,甚至包括智能信息处理系统和数据挖掘工具等商业化应用。同时,也产生了一些针对GPU开发的通用计算工具包,能够基于GPU平台对FFT、BLAS、排序及线性方程组求解等科学计算进行优化实现。基于GPU的通用计算已成为近几年人们关注的一个研究热点。将GPU用于通用计算的主要目的是为了加速计算,加速的动力来自GPU在高性能计算方面所具有的优势:高效的并行性。这一功能主要是通过GPU多条绘制流水线的并行计算来体现的。在目前主流的GPU中,配置多达16个片段处理流水线,6个顶点处理流水线。多条流水线可以在单一控制部件的集中控制下运行,也可以独立运行。GPU的顶点处理流水线使用MIMD方式控制,片段处理流水线使用SIMD结构。相对于并行机而言,GPU提供的并行性在十分廉价的基础上,为很多适合于在GPU上进行处理的应用提供了一个很好的并行方案。高密集的运算。GPU通常具有128位或256位的内存位宽,因此GPU在计算密集型应用方面具有很好的性能。超长图形流水线。GPU超长图形流水线的设计以吞吐量的最大化为目标(如NVIDIAGeForce3流水线有800个阶段),因此GPU作为数据流并行处理器,在对大规模的数据流并行处理方面具有明显的优势。CPU中的大部分晶体管主要用于构建控制电路(如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。GPU与CPU的设计目标不同,其控制电路相对简单,而且对Cache的需求较小,所以大部分晶体管可以组成各类专用电路和多条流水线,使GPU的计算速度有了突破性的飞跃,拥有惊人的处理浮点运算的能力。3.2.2GPU与CPU内部结构比较 正是由于GPU在并行处理和计算密集型问题求解等方面所具有的诸多优势,GPU已成为目前普通PC机所拥有的强大、高效的计算资源。从系统架构上看,GPU是针对向量计算进行了优化的高度并行的数据流处理器。这种以数据流作为处理单元的处理器,在对数据流的处理上可以获得很高的效率。根据NVIDIA公司开发的GPU工具包CUDA(ComputeUnifiedDeviceArchitecture)的测试结果显示,利用GPU实现图像卷积、FFT、BLAS、排序及线性方程组求解等科学计算,与单纯依靠CPU实现的算法相比,平均性能提高了近20倍。 由此可见,GPU的发展速度(包括集成度、计算密集型问题的处理能力等)已远远超过通用处理器,特别是随着可编程能力、并行处理能力和应用范围方面得到不断提升和扩展,使得GPU已成为当前计算机系统中具备高性能处理能力的部件。因此,充分利用现有计算资源,发挥GPU的高性能计算能力,在GPU与CPU的协作模式、GPU通用计算的计算模式以及性能优化等方面进行深入研究,将对进一步拓展目前高性能计算体系结构,为科学计算和工程应用提供新型的计算资源具有重要意义。

3.3NVIDIACUDA CUDA是统一计算设备架构,是一种新的硬件和软件的架构,它使用数据并行计算模型来处理和管理GPU上的计算问题,而不需要映射到一个图形API上。这种架构技术可使消费者、企业和技术应用软件利用GPU解决复杂的运算处理问题。CUDA(统一设备计算处理架构)技术可使高强度计算应用软件通过具有创新意义的新程序界面,体验NVIDIAGPU非同凡响的计算处理能力。通过使用标准的C语言,可以更为高效地执行更多批量的命令,并可简化软件开发工作,CUDA技术可使开发人员创建解决海量数据问题的创新性解决方案。CUDA软件的数据栈是有几个层组成的,如图3-1所示:一个硬件驱动程序,一个应用程序接口(API)和运作时序,两个高级共享数据库,以及都被独立文档进行描述的CUFFT和CUBLAS,硬件设备上已经能够支持轻量级驱动和运行,具有较高的性能。图3-1统一计算设备架构的结构图CUDA提供了一般性的DRAM存储器地址,如图3-2所示,为编程带来了很多便利,表现在拆分和合并存储器地址单元。从编程的角度看,在DRAM的任何位置进行读写操作就像是在一个CPU上。图3-2:拆分和合并存储器单元操作CUDA具有以非常快读写访问速度实现并行数据高速缓存或在片共享内存的特征,即线程间共享数据。应用CUDA的优势是:减少了读取DRAM存储空间的往返时间,对DRAM的带宽的依赖就越来越少了。CUDA技术提供的最为重要的创新举措之一就是其赋予NVIDIAGPU的多线程功能,这种功能可在解决问题时实现多线程相互协作。通过多线程通信的方案,CUDA技术可以允许应用软件更为有效地进行运行。CUDA技术为其特性的NVIDIAGPU,装配有一个芯片平行数据高速缓冲存储器,技术开发人员经常可以使用这种芯片平行数据高速缓冲存储器在GPU上直接存储使用过的信息。GPU上存储的信息,可以允许多个计算线程实现信息即时共享,而不必等待速度很慢的非芯片型动态随机存取存储器(DRAM)提供数据。这种技术优势可以使得用户能够更为迅速地找到需要进行复杂运算的问题的相应答案,其运算速度远远超过了使用传统架构或使用有限图形APIGPU的“基于GPU的通用计算”的计算方法。

3.4GPU的发展前景 在过去,GPU的应用主要是针对游戏,GPU的发展也是和游戏的发展密不可分的。不过在近几年,3D的应用范围急速扩大,而且GPU的通用化程度也不断提升,GPU的作用在目前的PC中已经不仅仅限于游戏了。新一代的操作系统Windows

Vista所采用的Aero界面就是一个全3D的界面,所有的元素(包括窗体)都作为一个3D的实体进行处理,可以实现各种效果诸如半透明、3D窗口以及动画动作;很多应用软件诸如Google

Earth、Microsoft

Live

Earth等软件也是3D的,这些都需要一个强有力的GPU以获得更好的性能和显示效果。GPU的强大计算能力也为其它一些非3D应用程序带来了好处,诸如最新的Adobe

Acrobat

8.0可以借助GPU的计算能力协助求解适量图形的方程式,从而大大加快适量图形的显示速度——和没有GPU的情况相比,在显示一些复杂适量图形(如复杂的城市/测绘地图和建筑结构图)的时候,GPU可以使得现实速度提升上十倍,可以做到流畅地实时缩放和拖动;Google

Picasa可以使用GPU加速照片的显示,在对许多照片整理的时候,每张照片都可以做到平滑地缩放和移动,同时保持照片内容的显示;Photoshop

一些新的插件可以使用GPU实现大幅面照片的过滤加速,如降噪、锐化和边沿增强等等;还有些新的软件可以使用GPU加速Flash的显示,这样在观看有几十个Flash动画的页面时显示速度也不会降低。可以说GPU的应用如今已经远远地超出了游戏的范畴。对于追求高品质数字生活的用户来说,使用一个高性能的GPU可以使得工作和娱乐变得更加有趣,具备更高的效率。对于所有的PC用户来说,GPU逐渐从一个选项变成了一种必需。

第四章可分离卷积技术4.1卷积 所谓卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入、输出和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。但是,实际上都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是卷积关系。卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。这里用和分别表示和的傅里叶变换,卷积定理的一部分只是说明和组成的傅里叶变换对。形式为:,双箭头表示左边的表达式(空间域卷积)可以通过对右边表达式(在频率域的乘积)进行反傅里叶变换获得。相反右边表达式可以通过对左边表达式进行正向傅里叶变换获得。类似的结果是频率域的卷积被简化为空间域的乘积,反之亦然;即:这两个结论构成了卷积定理[10]。一维卷积公式为:,卷积积分:,它所具有的特性有交换性、加法的分配律、结合律、求导等。离散一维卷积公式为:对于两个长度分别为m和n的序列和有:上式给出了一个长度为的输出序列。 二维卷积的表达式为: 离散二维卷积表达式为:对一副图像有:在上式中可以把F和G看作两个二维数组,首先把它们扩展到M×N,为了分析的简单起见,令。扩展后的新矩阵为和;用构造一个列向量把的第一行转置之后使其成为的前N个元素,接下来放第二行的转置...将中的每一行都用一维卷积中介绍的方法构成一个的循环矩阵,用来表示,共有N个这样的矩阵。用上面这些循环矩阵构成一个大的块循环矩阵:二维卷积可以表示为:

4.2图像滤波 所谓滤波是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。它是从含有干扰的接收信号中提取有用信号的一种技术。图像滤波总体上讲包括空域滤波和频域滤波。频率滤波需要先进行傅立叶变换至频域处理然后再反变换回空间域还原图像,空域滤波是直接对图像的数据做空间变换达到滤波的目的。它是一种邻域运算,即输出图像中任何像素的值都是通过采用一定的算法,根据输入图像中对用像素周围一定邻域内像素的值得来的。如果输出像素是输入像素邻域像素的线性组合则称为线性滤波(例如最常见的均值滤波和高斯滤波),否则为非线性滤波(中值滤波、边缘保持滤波等)[9]。线性平滑滤波器去除高斯噪声的效果很好,且在大多数情况下,对其它类型的噪声也有很好的效果。线性滤波器使用连续窗函数内像素加权和来实现滤波。特别典型的是,同一模式的权重因子可以作用在每一个窗口内,也就意味着线性滤波器是空间不变的,这样就可以使用卷积模板来实现滤波。如果图像的不同部分使用不同的滤波权重因子,且仍然可以用滤波器完成加权运算,那么线性滤波器就是空间可变的。任何不是像素加权运算的滤波器都属于非线性滤波器.非线性滤波器也可以是空间不变的,也就是说,在图像的任何位置上可以进行相同的运算而不考虑图像位置或空间的变化[11]。 图像卷积滤波是一种可以用于广义的图像处理的方法,可以用于各式各样的图像处理任务,例如有些可能包括滤波和边缘检测。我们这里研究的可分离滤波是卷积滤波中的一种,它可以将二维空间数据分为两个连续的一维空间来经行处理。而我们在NVIDIACUDA中实现可分离卷积滤波可以对图像卷积实现更好的优化,从而可以在图像处理中减少大量的运算,从而加强人机交换性能。

4.3可分离卷积的原理 如果二维离散信号作为输入,那么线性系统的输出可用下式表示,式中称为系统的冲击响应。上式的右端称为二维卷积,该系统可称为二维线性系统或二维滤波器。如果二维滤波器在时,满足条件,则称为可实现的因果系统。在满足下式时此二维滤波器是稳定的。当冲激响应可用下式表示时则此二维滤波器称为可分型(separable),否则称为不可分型。当滤波器的输入也是可分时,即它的输出也可分解为二个一维卷积的乘积,即通过上式的方法可以说明离散二维卷积具有可分离性,它可以将二维卷积转化为两个一维卷积计算,从而减少运算量,提高运算效率。这里我们主要采用高斯核在GUP上来完成可分离卷积滤波。由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现。二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积。因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长。

第五章基于GPU的二维图像卷积实现5.1GPU的编程模型5.1.1高度多线程协处理器当通过CUDA编程时,GPU被视为一个能够并行处理很多线程的一个计算设备。它作为一个CPU或主机的一个主要协处理器,换句话说,当在主机上运行的高密度计算时将数据并行分担到GPU上处理。更确切地讲,部分应用程序针对不同的独立的数据运行很多次就可以被独立出来成为一个新的功能,即该设备的不同线程。这种功能是通过该设备的指令集编译及产生的程序结果,称之为内核,可以下载到设备上。主机和设备都有自己的DRAM,分别称之为主机内存和设备内存。通过适当的API接口利用该设备的高性能直接存储引擎将一个DRAM上的数据拷贝到另一个DRAM上[1][15]。5.1.2线程批处理线程批处理又可以分为线程块和线程块网格。线程块一个线程块是一批可以相互通信、有效共享数据的线程集合,通过某些共享内存同步执行,以协调内存访问。更确切地讲,在内核中可以指定同步点,在线程块中,线程可以随时中止到所有的线程都达到这个同步点。每个线程都由其线程ID标识,即在块中的线程号。有了线程ID就可以很好的处理复杂的定址问题,应用程序用一个有大小的二维或三维数组指定一个线程,用二维或三维下标表示每个线程,例如,一个大小为二维块,线程下标为线程ID为,一个大小为的三维块,线程下标为线程ID为。线程块网格一个块容纳的线程数量是有限的,然而,执行同一个内核的具有相同维数和大小的块聚集成一个网格,这样,执行同一个内核的线程总数量会增大。这样做的代价是减少了线程间的通信,因为在同一网格中不同块中的线程间不能通信与同步。这种模式使得内核高效运行,不需要在并行能力不同的设备上进行重新编译。一个设备如果并行能力较低它会逐一运行网格中的块;如果并行能力较高它会并行运行所有块,通常是这两种情况相结合。在网格中,每个块由块ID标识,块ID是块在网格中的编号。块ID有助于解决复杂的寻址问题。一个应用程序用一个二维数组来指定一个网格,使用二维下标来指定每个块。例如,一个大小为的二维块,块下标为,块ID为。主机分派了一序列的内核运算到设备上。每个内核作为组织成线程块栅格的一堆栅格来执行[1][15]。5.1.3存储器模型在设备上运行的线程能够通过下述的存储空间对设备DRAM以及片上存储器进行读取,如图5-1所示:图5-1存储器模型

5.2硬件实现5.2.1在片共享存储器(SIMD单指令多数据)多处理器组设备的实现如图5-2所示的一组多处理器。每个多处理器都采用单指令多数据体系结构,即在给定的时钟周期,多处理器的每个处理器执行相同的指令,但操作不同的数据[1][15]。每个多处理器的在片存储器有以下4种类型:每个处理器有一组32位局部寄存器。一个并行数据缓冲器或共享存储器,由所有处理器共享从而实现共享存储空间。一个只读常量缓冲器,由所有处理器共享,加速从常量存储空间读取的速度,它可以看作是设备存储器的只读区。一个只读结构缓冲器,由所有存储器共享,加速从结构存储空间的读取速度,它可看作是设备存储器的一个只读区域。局部和全局存储空间被看作设备存储器的读写区域,且不能被存于硬盘。图5-2硬件模型5.2.2执行模型线程块栅格在设备上通过使用时间片执行多处理器上的一个或多个块来执行;每个块被分成SIMD线程组称为warp,每个线程组包含相同数量的线程,线程数量称为线程组大小,并由多处理器以SIMD模式执行;线程调度程序周期的由一个线程组转换至另一个线程组使多处理器的计算资源的使用最大化。半个线程组可以是线程组的第一半也可以是第二半。线程块分成线程组的方法一般是相同的;每个线程组包含连续的线程,线程ID号递增,0号线程包含在第一个线程组中。一个线程块仅由一个多处理器来处理,因此位于在片共享存储器的共享存储空间导致快速存储器访问。多处理器的寄存器都位于块内各线程之间。如果每个线程使用的寄存器数与块内线程数的乘积大于多处理器内寄存器的总数,该进程块不能被执行,相应的核心程序也会被取消。多个块可由同一个多处理器通过分配多处理器的寄存器和块间共享存储器并发处理。块内线程组的分发顺序是不确定的,但它们的执行可以是同步的。使全局或共享存储器的存取相一致。线程块的栅格内的块的分发顺序是不确定的,且块间无同步机制,因此同一栅格内的两个不同块上的线程之间在网格执行期间不能通过全局存储器进行安全通信。若一个非原子指令的执行通过一个线程组写入到位于全局或共享存储器的同一位置的线程组的一个或多个线程,对该位置的连续写的次数和写的顺序是不确定的的,但有一次写保证成功。若原子指令的执行为通过一个线程组对位于全局存储区的同一位置的线程组的不同进程进行读,修改,和写,对该位置的每次读,修改或写都会发生且是连续发生的,但它们发生的顺序是不确定的。5.2.3计算能力设备的计算能力由主版本号和副版本号决定。主版本号相同的设备具有相同的内核体系结构。GeForce8系列,QuadroFX5600/4600,和Teslasolutions的计算能力为1.x(它们的主版本号为1)。副版本号与内核结构的改进次数相一致,可能包含一些新的特征。GeForce8800系列,QuadroFX5600/4600,和Teslasolutions的计算能力是1.0版(它们的副版本号为0)GeForce8600和8500系列的计算能力是1.1版。5.2.4多设备多GPU的使用如CUDA(统一计算设备架构)设备,只有当这些GPU类型都相同时,应用程序才能在多GPU系统上运行。然而若系统在SLI(控制长度指示器)模式下,所有的GPU在驱动栈底层中断,只有一个GPU可用作CUDA设备。为使CUDA能把每个GPU当作一个独立的设备,SLI模式必须在控制面板关闭。5.2.5状态转换GPU把部分DRAM存储器用在所谓的主界面上,主界面用于刷新显示设备,显示设备的输出用户可观察到。当用户通过改变分辨率或显示的位深进行显示模式转换时(用NVIDIA控制面板或Windows的显示控制面板),它所需的存储空间随之改变。例如:若用户把显示器分辨率由1280×1024×32位变为1600×1200×32bit,系统必须把7.68MB用在主界面上而不是5.24MB。(全屏图像反混沌应用软件应用的运行主界面需更大的显示存储器)在Windows操作系统下,可能引起显示模式转换的事件包括进行全屏DirectX应用,按Alt+Tab键退出全屏DirectX显示,或按Ctrl+Alt+Del锁住计算机。若模式转换增加了主界面所需存储器数,系统将拆用专门分配给CUDA使用的存储器,这将引起这些应用的崩溃。

5.3图像卷积 在图像处理中卷积滤波只是一个在围绕输出像素中带有输入像素的滤波权结果。这个数积是一个并行操作它非常适合在高平行硬件上运行,例如GPU。图5-3为卷积滤波方法的基础[14]。图5-3卷积模型基础5.3.1分离滤波通常一个二维卷积滤波需要输出像傃点,n和m分别为滤波器的宽度和高度。可分离滤波是一个特殊的类型的滤波器,它可以表示为两个一维空间的滤波器,一个是图像的行,一个是图像的列。一个可分离卷积滤波器可以将数据分成两个连续的一维空间卷积运算,因此,每个输出像傃只需要个级数。例如,申请一个数组数据就相当于申请两个一个维数组和。可分离滤波器在有着更好的适应性,另外它还可以降低算法的复杂度和每个数据点的带宽的估计。5.3.2一个Naive的执行 在CUDA中简单的执行卷积的方法是将一个图像块导入共用寄存器阵列中,对该块中的像素按照滤波器的大小进行分块点乘,并将这些点乘所得的和写入输出和写入输出图像的设备内存中。每个线程块处理一个图像块。每个线程产生一个输出像傃信号。具体如下图5-4所示。这里来自图像的一个像傃块被导入到公共存储器的队列中。处理和计算一个输出像傃(红色),一个输入图像区域(桔黄色)乘以用滤波核(紫色)的元素返回的值是总和。将结果输出像傃从新写回到图像中。图5-4一个Naive卷积算法5.3.3公共存储器和外围运算法则本身就有些复杂,任何合理的滤波器核心大小,公共存储器中像傃的边缘依赖于像傃而不是共用存储器。在一个线程块中围绕图像块,有一个像傃外围核心宽度用来滤除图像块。因此,每个线程块必须对导入共用存储器的像傃和外围像傃进行滤波。如图5-5。图5-5改进后的Naive卷积算法5.3.4避免空闲的线程 如果一个线程被用于每个像傃导入共用存储器中,于是导入外围像傃的线程在整个滤波过程中将被空闲。随着滤波半径的增加,空闲线程的比率也增加。在可利用的平行,有限的可利用的共用存储器总数上面的浪费非常多,对于较大半径核心的滤波器来说浪费会非常高。 例如:一个的图像块和核心半径是16。每个多处理器中只允许一个活动块,假设4bytes每个像傃,一个块将用9216bytes。在G80GPU上每个多处理器用多于16KB一半的共用存储器。这样,当导入后仅1/9线程能起到作用。如图5-6。图5-6卷积核半径大于图像大小时我们可以通过降低每个块的线程的总数来降低空闲线程的总数或用每个线程导入多倍的像傃到共用存储器中。例如:如果我们用一个垂直的纵列并且和图像块宽度相同来处理,我们在共用存储器上有一个的像傃区域,但只有的线程。我们将分三块读取数据,如图5-7。图5-7如何降低空闲线程数目在滤波计算过程中,一个线程的三分之一是活跃的胜于九分之一。因为导入时带宽有限,执行时不能被接受。这样可以更进一步的降低线程块到,和将图像划分为九个正方形像傃块。这个可以保证在运算阶段所有的线程可以被利用。注意:为了最佳的效率一个块中线程的数目必须是数倍于线程组的大小。如果在导入阶段外围没有线程块一样的宽广,我们将终止一些线程块。如图5-8。图5-8当外围变窄一些线程将被停止导入5.3.5可分离滤波增加效率除了通过分片降低线程空闲数目,我们可以降低多于的数据的导入,通过划分处理成两种方法。一个是完成每个二维的可分离图像滤波;另一个是由于每个块与相邻块之间的交迭在图像外围宽度区域内部的每个像傃将被导入九次。如果我们将计算分离成水平和垂直部分,在每个路径写入一个全局存储器。每个像傃最多被导入六次,用一个小块,这个不能得到任何事情。正真的好处,不再需要导入外围的顶部和底部(水平)像傃。这样允许每个线程块中导入更多的像傃。我们限制线程块的大小更胜于限制共用内存大小。为了完成更高的效率,每个线程必须处理超过一个像素。我们可以增加图像块的宽度处理,通过一个线程块更多的柔和的利用这些可分离的方法,如图5-9。图5-9一个可分离滤波允许每个线程处理多倍于自己的像素5.3.6行滤波在导入和处理阶段中,每个活动线程只导入或输出一个像素点。在计算阶段,每个线程在2倍滤波器半径加1的宽度上循环,将每个像素与常数内存中相应的滤波器系数相乘。每半组(warp)中的每个线程均访问相同的常地址,因此不会有由于常量内存组冲突。同样,连续的线程总是访问连续的共享内存地址,因此同样不会发生共享内存组冲突[14]。如图5-10。 图5-10行滤波 图5-11列滤波5.3.7列滤波列滤波动作的运行与行滤波动作非常相像。主要的区别是,线程ID按照滤波区域的垂直方向递增,而不是沿着滤波区域。如同在行滤波动作中一样,一个半卷中的线程总是访问不同的共享内存组,但是下一个/前一个地址的计算意味着增加/减少COLUMN_TILE_W,而不是仅仅1。在列滤波动作中,导入阶段中我们没有缓慢的“联合校准”线程,因为我们假设瓦片宽度是联合读入大小的倍数。为了减小边缘相对于输出像素点的比例,我们希望图像瓦片(slice)能尽可能高,这样才能得到我们目标的合理的共享内存使用效率,而对于窄图像瓦片则尽可能达到16列[14]。如图5-11。

5.4可分离卷积核的心算法5.4.1GPU可分离卷积核心算法行卷积滤波内部核心循环:for(intk=-KERNEL_RADIUS;k<=KERNEL_RADIUS;k++)sum+=data[smemPos+k]*d_Kernel[KERNEL_RADIUS-k];列卷积滤波内部核心循环:for(intk=-KERNEL_RADIUS;k<=KERNEL_RADIUS;k++)sum+=data[smemPos+IMUL(k,COLUMN_TILE_W)]*d_Kernel[KERNEL_RADIUS-k];5.4.2CPU可分离卷积核心算法行卷积滤波内部核心循环:intx,y,k,d;floatsum;for(y=0;y<dataH;y++)for(x=0;x<dataW;x++){sum=0;for(k=-kernelR;k<=kernelR;k++){d=x+k;if(d>=0&&d<dataW)sum+=h_Data[y*dataW+d]*h_Kernel[kernelR-k];}h_Result[y*dataW+x]=sum;}列卷积滤波内部核心循环:intx,y,k,d;floatsum;for(y=0;y<dataH;y++)for(x=0;x<dataW;x++){sum=0;for(k=-kernelR;k<=kernelR;k++){d=x+k;if(d>=0&&d<dataH)sum+=h_Data[d*dataW+x]*h_Kernel[kernelR-k];}h_Result[y*dataW+x]=sum;}

5.5具体算法实现方法5.5.1算法主流程图返回返回开始读bmp文件GPU上实现行,列卷积计算所画时间t1CPU上实现行,列卷积计算所画时间t2结果比较5.5.2结果分析运行界面数据表格:卷积核半径GPU卷积速率(像素/秒)CPU卷积速率(像素/秒)GPU时间/CPU时间171.1226777.8231099.091357265.7174074.99900113.146109360.1814933.75977116.006690456.7075372.83750719.984985552.1466972.49369620.911407649.4611562.15630122.937964746.2598041.89081924.465485843.5026721.69194525.711641941.5069851.53098427.1113181038.9036921.39111627.9658111137.0809221.26728029.2602521234.4760241.18427329.1115451333.4179041.07330931.1354061431.6925821.01348431.2709271530.3882430.95444231.8387551626.9332800.89760330.0057681725.3587430.84578529.9825111824.3869370.80167630.4199431923.6198880.75064631.4660632022.7987420.70977632.121028表1平台一卷积核半径GPU卷积速率(像素/秒)CPU卷积速率(像素/秒)GPU速率/CPU速率11199.07819013.08435191.64215721446.4110878.652582167.16526531341.2859956.470898207.27973541035.0254555.142137201.28313651184.9147094.265731277.77527461132.4568423.641060311.0239107792.3685743.183201248.92192081019.3563752.824304360.9230549964.5429582.539563379.80666610925.2615292.303536401.67002311882.1004452.102807419.48708712851.7200881.940620438.89078213810.8500691.803733449.54007214785.0017481.683342466.33535015751.9686311.577616476.64858616686.3245881.485354462.06114017646.2051121.403226460.51378818626.2309351.316220475.77974019608.6532441.260671482.80104120591.7808351.203049491.900700表2平台二结果分析: 本次试验采用两种平台环境为:表1平台为:AMDTurionTL-521.6GHz,1GB内存,GPU为GeForce8400GS128MB显存。表2平台为:IntelCore(TM)2CPU1GB内存GPU为GeForce8800GT。我们这里导入十二bmp图片,在GPU和CPU上对其作卷积运算,并将结果一起显示出来。我们只取其中一组数据(图片大小为:800×600)作分析。由表1数据可生成图5-12,表2数据生产图5-13。并对表1和表2中GPU速率与CPU的速率比做了比较,并生成图5-14。由图5-12、5-13可见滤波半径的增加GPU、CPU上执行卷积的效率有所下降。由于平台不同,无论是在CUP还是GPU上执行卷积的速率都与其版本有关,版本越高执行速率越快。由于本实验条件有限,本文只能对GPU的运行速率进行比较。如图可知GeForce8800GT的运行速率远远高于GeForce8400GS,具体可见图5-15。主要原因是GeForce8400GS采用了16个流处理器,而GeForce8800GT采用了112个流处理器。而CPU上卷积运行的速率变化却很小。由图5-17可见随着滤波半径的增加平台二上GPU运行时间与CPU的运行时间的比值却大幅度提升,而GPU上运行卷积效率正常是CPU上运行卷积效率的几十到几百倍,可见在GPU上进行卷积可以节省大量时间,提高运行速率。图5-12平台一上GPU、CPU运行时间图5-13平台二上GPU、CPU运行时间图5-14两个平台下GPU与CPU的速率比图5-15不同版本的GPU运行时间

第六章总结随着计算机软硬件技术的发展,应用范围越来越广泛,当今人们需求也随之提高,需要性能更高更快,使用更方便,效果更逼真的产品。图像处理核心器件的发展成为了必要。本论文主要讨论了在GPU下如何实现可分离卷积滤波算法并与CPU下实现卷积算法作了比较。相关工作总结如下:一、主要工作及结论熟悉VisualStudio2005下编程和运行C程序方式。学习NVIDIACUDA编程指南。翻译文献NVIDIACUDAComputeUnifiedDeviceArchitecture。运用C语言分别编写GPU和CPU下卷积算法,并对其性能作比较。最终结果:由于GPU采用的是SIMD架构,采用并行计算。它非常适合用于处理大量数据诸如图像、音频的这类任务。我们这里在GPU上作可分离卷积运算可以可以图像处理速率,正常是CPU上运行速率的几十到几百倍。二、存在的问题及今后的工作 由于本人时间有限,这里我们没有对图像卷积进行逆变换,没有对其速率做分析比较,需要进一步完善。

致谢本论文是在导师的悉心指导下完成的。老师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。最后,向所有关心和帮助过我的领导、老师、同学和朋友表示由衷的谢意!衷心地感谢在百忙之中评阅我的论文和参加答辩的各位老师!

参考文献[1]NVIDIACUDAComputeUnifiedDeviceArchitecture[M].6/23/2007.[2]RafaelC.Gonzalez&&RichardE.Woods.数字图像处理[M].电子工业出版社,2006.11.[3] 高文.多媒体数据压缩技术[M].电子工业出版社.1994.4.[4] 张旭东.图像编码基础和小波压缩技术:原理、算法和标准[M].清华大学出版社.2004.3.[5] [美]YaoWang.视频处理与通信[M].电子工业出版社.2003.6.[6] 丁玉美,高西全.数字信号处理[M].西安电子科技出版社.2006.7.[7] 求是科技.VisualC++数字图像处理典型算法及实现[M].人民邮电出版社.2006.6.[8] 何斌马天予等编.VisualC++数字图像处理(第二版).人民邮电出版社.2002.12[9] [美]Taubman.JPEG2000图像压缩基础、标准和实践[M].电子工业出版社.2004.4.[10]管致中,夏恭恪等.信号与线性系统[M].高等教育出版社.2005.11.[11]DavidS.Taubman&&MichaelW.Marcellin.JPEG2000图像压缩基础标准和实践[M].电子工业出版社.[12]新一代视频压缩编码标准—H.264/AVC[M].人民邮电出版社.2005.5.[13]RandimaFernando编,姚勇译.GPU精粹-实时图形编程的技术、技巧和技艺[M].人民邮电出版社2006.1.[14]Podlozhnyuk.ImageConvolutionwithCUDA[M].June2007.[15]NVIDIAGPUProgrammingGuideVersion2.2.0[M].2004.11

附录A相关的数学变换公式傅立叶变换公式连续的一维傅立叶变换的定义:一维傅立叶反变换定义:F(u)包含了正弦和余弦项的无限项的和,u称为频率变量,它的每一个值确定了所对应的正弦-余弦对的频率。连续的二维函数的傅立叶正变换:二维函数的傅立叶逆变换:一个二维傅立叶变换可以用二次一维傅立叶变换实现,具体推导如下:离散傅立叶变换公式一维离散傅立叶正变换:一维离散傅立叶逆变换:二维离散傅立叶变换:对于M×N图像:正变换:反变换:。对于像傃正变换:反变换:快速傅立叶变换公式离散余弦变换(DTC)设离散序列,为一离散序列,根据下式延拓成偶对称序列:其中。是关于为中心的偶对称序列以代入在范围内作点的傅立叶变换:余弦变换的变换核为:表示成矩阵形式为:(其中各列模为1)定义偶余弦变换(EDCT)和逆变换为:二维余弦变换:二维余弦变换具有可分离性:表示成矩阵形式:

附录B可分离卷积的部分代码导入bmp图片:#include<stdio.h>#include<stdlib.h>#ifdef_WIN32#pragmawarning(disable:4996)#endif#pragmapack(1)typedefstruct{shorttype;intsize;shortreserved1;shortreserved2;intoffset;}BMPHeader;typedefstruct{intsize;intwidth;intheight;shortplanes;shortbitsPerPixel;unsignedcompression;unsignedimageSize;intxPelsPerMeter;intyPelsPerMeter;intclrUsed;intclrImportant;}BMPInfoHeader;typedefstruct{unsignedcharx,y,z,w;}uchar4;extern"C"voidLoadBMPFile(uchar4**dst,int*width,int*height,constchar*name){BMPHeaderhdr;BMPInfoHeaderinfoHdr;intx,y;FILE*fd;if(sizeof(uchar4)!=4){printf("***Baduchar4size***\n");exit(0);}if(!(fd=fopen(name,"rb"))){printf("***BMPloaderror:fileaccessdenied***\n");exit(0);}fread(&hdr,sizeof(hdr),1,fd);if(hdr.type!=0x4D42){printf("***BMPloaderror:badfileformat***\n");exit(0);}fread(&infoHdr,sizeof(infoHdr),1,fd);if(infoHdr.bitsPerPixel!=24){printf("***BMPloaderror:invalidcolordepth***\n");exit(0);}if(infoHpression){printf("***BMPloaderror:compressedimage***\n");exit(0);}*width=infoHdr.width;*height=infoHdr.height;*dst=(uchar4*)malloc(*width**height*4);fseek(fd,hdr.offset-sizeof(hdr)-sizeof(infoHdr),SEEK_CUR);for(y=0;y<infoHdr.height;y++){for(x=0;x<infoHdr.width;x++){(*dst)[(y*infoHdr.width+x)].z=fgetc(fd);(*dst)[(y*infoHdr.width+x)].y=fgetc(fd);(*dst)[(y*infoHdr.width+x)].x=fgetc(fd);}for(x=0;x<(4-(3*infoHdr.width)%4)%4;x++)fgetc(fd);}if(ferror(fd)){printf("***UnknownBMPloaderror.***\n");free(*dst);exit(0);}elseprintf("图片导入成功!");fclose(fd);}GPU卷积算法:#defineIMUL(a,b)__mul24(a,b)#defineKERNEL_RADIUS8#defineKERNEL_W(2*KERNEL_RADIUS+1)__device____constant__floatd_Kernel[KERNEL_W];#defineROW_TILE_W128#defineKERNEL_RADIUS_ALIGNED16#defineCOLUMN_TILE_W16#defineCOLUMN_TILE_H48template<inti>__device__floatconvolutionRow(float*data){returndata[KERNEL_RADIUS-i]*d_Kernel[i]+convolutionRow<i-1>(data);}template<>__device__floatconvolutionRow<-1>(float*data){return0;}template<inti>__device__floatconvolutionColumn(float*data){returndata[(KERNEL_RADIUS-i)*COLUMN_TILE_W]*d_Kernel[i]+co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论