基于CUDA平台的GPU并行计算技术研究终稿.docx
《基于CUDA平台的GPU并行计算技术研究终稿.docx》由会员分享,可在线阅读,更多相关《基于CUDA平台的GPU并行计算技术研究终稿.docx(34页珍藏版)》请在冰豆网上搜索。
![基于CUDA平台的GPU并行计算技术研究终稿.docx](https://file1.bdocx.com/fileroot1/2023-2/10/538499ea-f7ae-4ec6-97e0-c52235f0a2fb/538499ea-f7ae-4ec6-97e0-c52235f0a2fb1.gif)
基于CUDA平台的GPU并行计算技术研究终稿
HUNANUNIVERSITY
毕业论文
论文题目:
基于CUDA平台的GPU并行
计算技术研究
学生姓名:
蒋悦孟
学生学号:
20100730212
专业班级:
自动化1002班
学院名称:
电气与信息工程学院
指导老师:
张小刚
学院院长:
王耀南
2014年5月20日
基于CUDA平台的GPU并行计算技术研究
摘要
近年来,随着GPU(GraphicProcessingUnit,图形处理器)技术的持续发展创新,GPU的并行运算能力越来越受到人的重视。
由于GPU的应用普及,NVIDIA公司推出了基于CUDA架构的廉价高性能并行运算平台。
本文基于NVIDIA公司推出的CUDA平台,对相应的GPU架构体系及CUDA软件体系进行了深入的分析,对CPU+GPU异构平台基础上的并行操作及算法优化方法进行了研究总结。
同时,本文利用图像搜索技术作为切入点,介绍了当今基于内容的图像搜索技术原理,使用CUDA并行运算加速感知哈希算法,探讨CUDA并行运算在算法及优化方法在通用运算中的结合方式,在使用Opencv的前提下,对比仅在CPU中的图像搜索程序,获得了3.66倍的运算收益。
关键字:
并行运算,图形处理器,统一设备计算架构,图像搜索
GPUParallelComputingTechnologyResearch
BasedOnCUDAPlatform
ABSTRACT
Inrecentyears,astheGPU(GraphicProcessingUnit)technologycontinuingtodevelopandinnovative,GPUparallelcomputingdrawsmoreandmorepeople'sattention.DuetoGPU’suniversalapplication,NVIDIAhaslaunchedacheaperandmoreefficientparallelcomputingplatformwhichisbasedonCUDA.
BasedonCUDA,whichislaunchedbyNVIDIA,thisarticlehaveadepthanalysisontheGPUarchitectureandCUDAsoftwaresystem,andwealsodiscussandconcludeaboutthemethodsofalgorithmoptimizationandtherealizationofparallelcomputing.
Atthesametime,thisarticleusestheimagesearchtechnologyasabreakthroughpoint,Introducingtheprincipleofcontent-basedimageretrieval,usingCUDAtoacceleratethePerceptionofHashi,exploringthejuncturebetweentheCUDAparallelcomputingalgorithmandoptimizationmethodingeneralarithmetic.OnthepremiseofusingOpenCV,wecomparedtheoperationspeedofparallelcomputingprogramandserialcomputingprogram,andgained3.66timesspeed-up ratio.
KeyWords:
ParallelComputing,GraphicProcessingUnit(GPU),ComputeUnifiedDeviceArchitecture(CUDA),ImageSearching
目录
1.绪论1
1.1.课题研究背景及目的1
1.2.CUDA概述2
1.3.CUDA并行运算技术研究现状及范例2
1.4.论文构成及研究内容4
2.CUDA架构及编程模式6
2.1.CUDA架构下GPU硬件结构6
2.2.CUDA软件体系7
2.2.1.CUDA的存储器模型7
2.2.2.CUDA编程模型9
2.3.CUDA并行运算的优化13
3.基于内容的图像搜索16
3.1.图像检索概况16
3.2.CBIR的结果评价17
4.CUDA与CBIR的结合实验过程19
4.1.感知哈希算法19
4.2.CUDA并行运算在图像搜索中的应用21
5.结论24
6.结束语28
6.1.工作总结28
6.2.展望29
致谢30
参考文献31
绪论
课题研究背景及目的
并行运算作为现今科技创新发展的重要支撑方式之一,已然成为突破摩尔定理局限性的重要研究手段,而在大系统、大数据时代下,科技不断进步,计算机计算能力的飞速提升,在处理大数据、大系统事件中处相对优势的并行运算技术迅速得到了全球各行各业尤其高新科技行业的研究兴趣。
近年来,已经迈进并行计算时代的计算机行业,在并行运算的研究发展中起着很重要的作用,多核CPU技术也在这整个过程中扮演重要角色,业内领先的CPU制造商先后宣布计划推出更多计算核的CPU,这足以证明并行运算已经为人类带来了不可忽视的好处。
然而,在微处理器系统和大型高性能计算系统都是异构的大环境下,多核CPU技术面临的问题和挑战仍然很多,例如并行运算的速度、质量受数据移动的影响、开发软件随硬件的更新存在严重滞后、集成电路元器件存在种种严重限制等等,这些情况都制约着多核CPU技术并行运算的发展。
早期的GPU(GraphicProcessingUnit,图形处理器)并行运算方式如OpenGL与DirectX在GPU技术迅速发展壮大的前提下也得到了为数不少的技术研究人员的青睐,但是早期的GPU并行运算技术对内存的写入方式和写入位置有严格限制,代码调试不方便,且开发人员必须对着色语言(ShadingLanguage)十分熟练,其对并行运算的互斥性、同步性以及原子性多方面存在不支持缺陷等等,这些都限制着其发展壮大,并不能成为较大众接受的通用并行运算方式。
自2006年11月NVIDIA公司发布了第一款DirectX10GPU以来,该公司引进了新系列的GPU架构,并且开发出相对应的GPU通用计算技术(即CUDA),大众化并行运算得到了很好的发展。
采用的是工业标准C语言的CUDA架构,更为方便快速开发人员去解决运用、调试的问题,运行应用程序的单位成本、单位消耗要低很多。
综合其以上特点,CUDA并行运算平台逐渐成为了更为大众化的并行运算平台,得到更多人使用,并在各个领域得到成功的应用,其不断发展壮大的技术被广泛地应用到医学图像处理、环境科学、流体动力学、金融虚拟货币挖掘等领域。
本课题研究的目的基于CUDA运算平台的大众化,在PC端加装NVIDIA公司高性能GPU图卡后,构建基于CUDA架构的编程环境,对比CUDA架构下的并行运算与CPU上的串行运算时间复杂度,探讨CUDA架构在并行运算加速中的优劣,并尝试结合Opencv(OpenSourceComputerVisionLibrary)在C环境下对图像进行并行快速处理。
在已然成熟的图像搜索原理下,运用感知哈希(pHash)检索方式,实现以“图”搜“图”的检索方式,对图像信息进行整合处理,比较得出并行运算对图像搜索引擎的加速效果。
CUDA概述
CUDA将GPU作为一个数据并行计算设备,传统的图像处理架构下,顶点着色器以及像素着色器构成其计算的资源,而CUDA架构与其不一样,增加了一个统一的着色器流水线,使得每个ALU(ArithmeticLogicUnit,数学逻辑单元)能在运行通用运算程序的过程中进行排列。
NVIDIA能够保障ALU符合IEEE单精度浮点数计算的需求,不局限于图形运算执行过程,而且可执行通用运算。
CUDA构架下的GPU提供访问由软件管理缓存功能,即共享内存,执行单元可任意读取/写入内存,同时CUDA提供原子性操作功能,使得GPU在执行通用运算过程中更高效。
CUDA不依赖于传统图形处理API,使用更方便通用、开发门槛更低的C语言库进行开发,能够让更多的程序开发人员更方便迅速地使用通用的并行运算技术。
CUDA并行运算技术研究现状及范例
随着GPU技术以及PC设备的性能提升,在加装或者本身就具备NVIDIA公司CUDA架构GPU的普通电脑上实现并行运算算法并不是一个新颖、神秘的技术。
CUDA并行运算技术自2006年首次发布以来,得到了很大程度的研究关注。
自身层面,NVIDIA公司作为发布该开发平台的直接唯一主体,在游戏产业及某些相关专业性产业的发展推动下,它不断发布性能更优越、更符合市场需求的GPU以满足消费者、研发人员的不同需求,同时在软件方面,自发行首款CUDASDK到如今最新的5.5版本,NVIDIA公司对软件进行更加完善、更加人性化的更新维护,使CUDA架构能吸引越来越多的人对此项技术进行研究。
在消费者及研究开发人员层面,因CUDA在并行运算技术中传承了早期GPU并行运算的优点,同时因采用C语言的举措更大程度降低了并行运算的研究门槛,CUDA在使用时更加方便快速,无论是对资深开发者还是初学者、专业领域研究人员还是普通通用运算使用者来说,他们对CUDA的使用及研究亦在不断推动着这项技术发展。
就国内而言,中国计算机用户协会、新疆石油学会2008年度信息技术交流会上,林茂、董玉敏、邹杰三人在会上作名为“GPGPU编程技术初探”的报告,开启了中国学术界CUDA技术研究的元年。
据统计,2008年国内学术论文关于CUDA技术的仅为个位数,2009年则达到了超过50篇的数目,自此之后CUDA技术在国内的研究达到了小高潮,从遥感图像处理到地理气象分析系统,从视频解码编码加速到数字信号处理领域,从医疗科学到社会学数据处理,CUDA在国内各个领域都有不同程度的应用,或者说已经渗透到超出CPU强大实力的各个领域。
在国际上,技术发达国家因计算机及CPU、GPU技术暂时领先国内,对CUDA的研究、应用则比国内相对较早,在2008年时,国外关于CUDA研究、技术应用的论文就已经达到国内2009年同期水平,各领域内方便有效的专业应用软件不断出现,专业级的大规模数据计算得到了很大的速率提升。
以下则为CUDA技术在专业级领域的应用实例:
洗涤用品、清洁用品在人们的日常生活中被大量使用,但在使用的同时对生活的水体环境、图环境等都会造成很大的破坏,所以,越来越多的科学家及研究人员开始关注在不降低此类消费品的使用效果前提下,研究能降低环境污染程度的方法。
表面活性因子是洗涤用品、清洁用品在使用过程中起主要作用的成分,决定这些用品的去污能力也是表面活性因子,同时对环境的破坏也是这些表面活性因子。
在传统的方式里面,对新型的表面活性因子清洁能力的测试都是建立在大量的实验上,而这大量的实验包括对不同材质的清洗能力评估,所以这种方式成本高且速度缓慢。
宝洁公司与美国天普大学在该课题上进行合作,对表面活性因子与实验材料的相互作用进行分子模拟。
天普大学的科学家们使用了一款由美国Ames国家实验室开发的模拟软件,该软件根据GPU加速,名为HOOMD(HighlyOptimizedObject-OrientedMany-particleDynamics),该模拟软件将计算任务分配到两个NVIDIATeslaCPU上,其性能可以与128个CPU核的CrayXT3相匹敌,由于性能上的大提升,HOOMD模拟在解决相同问题上所耗费的时间成本大大低于之前的普通模拟平台,而性能上也是提升为之前平台的16倍。
因为对表面活性因子分子交互效率的巨大提升,市面上将会出现清洗能力更好、环境破坏力更小的洗涤用品、清洗产品。
论文构成及研究内容
本文的研究理论基础为NVIDIA公司提供的CUDAC,在已有成熟的并行运算算法基础上,主要研究CUDA的并行运算能力对数字图像处理的加速效果,以及CUDA与Opencv的在C环境下对数字图像处理过程中的结合使用,包括数字图像写入内存、数字图像的基本数据阵列操作、CUDA平台运行的调试及性能评价。
本文共有五章,其具体内容提要如下:
第一章:
本章节为全文的绪论,介绍了并行运算的研究背景、研究目的,分析并行运算发展过程中诸多技术的优缺点,综述了CUDA平台的发展历程,阐明了CUDA架构的基本情况、对比前期的GPU并行运算技术所占的优势等等。
第二章:
介绍CUDA平台的基本原理,包括GPU运行结构原理、GPU的内存结构分布、CUDAC代码结构组成、CUDAC程序优化等等。
第三章:
介绍图像检索的研究现状,包括基于内容的图像检索技术和基于文本的图像搜索技术的原理,比较优缺点,并给出图像检索结果的评价方式。
第四章:
本章节内容主要阐述了图像搜索的基本原理,在这里使用的是哈希感知搜索图片,介绍本文研究的哈希感知搜索图片的基本原理、图片搜索具体实现方式、CUDA与Opencv在本课题中的具体结合方式、以及程序运行的优化等。
第五章:
利用VS2010编译平台运行程序作验证,得出实验结果,通过结果验证CUDA与Opencv结合的可行性、CUDA并行运算对数据处理的加速效果并关注CUDA在数据处理过程中出现的问题、优缺点等等。
第六章:
综合论述本文所做的主要工作,认真对待本文中工作存在的不足之处,分析课题研究过程中存在的客观问题,并指出算法的优缺点,对本文研究的课题进行合理展望,提出合适的思路建议为后续的研究工作得以顺利进行。
当然,本文末尾亦包含了作者对课题研究及论文形成过程中帮助过作者的师长、同窗的感谢之情,最后,课题研究过程中的C语言程序实现源码也以附录形式出现在文章最末尾,包括核函数程序段、主函数程序段、数据库形成代码程序段等。
CUDA架构及编程模式
CUDA架构下GPU硬件结构
GPU与CPU的最大不同点在于硬件结构自身,而硬件结构不同是由于晶体管用途分布造成的,如图2.1所示。
GPU比CPU在数据计算能力和存储器带框上有相对大的优势,在能耗和价格上付出的代价也相对较小,从而在异构操作协同处理运算上占领并行运算的一席之地。
GPU作为图形渲染的主要硬件,因图像渲染运算的高度并行性,它可以采用添加ALU和ControlCache(存储器控制单元)的方式提高运算能力和存储器带宽。
CPU的制造厂家是把更多的晶体管用于复杂的控制单元以及缓冲区,而GPU的晶体管作为ALU的居多,从何提高GPU的总体执行单元效率。
图2.1CPU与GPU硬件结构比较
在传统的CPU+GPU异构并行的系统中,复杂逻辑的事务计算由CPU完成,这样的要求,也促使CPU采用分配大量缓存、分支预测以及复杂控制逻辑的方式较快得获取数据和指令,以此提高CPU的运算速率;而GPU负责的是计算高度密集的图像渲染工作,它通过分配更多的ALU来运行量大但相对简单的线程(Thread),且要求较高的存储器带宽以保证整体的数据传输速率。
CPU和GPU的不同设计理念造就了这两个处理器的架构差异及性能差异,具体如下:
1)线程差异,CPU的多线程是一种软件粗粒度多线程,在执行的线程中断后,需要保存中断线程前后数据同时装载下一个线程的数据,这个过程需要很大的时间成本;GPU的多线则不存在这样的数据交换过程,因此在并行执行过程中省去更多时间,提高效率。
2)计算核心差异,主流CPU采用多核技术,3到6条执行流水线在每个计算核心中,乱序执行、预测执行和大容量缓存技术都被采用到CPU核心中意达到提高指令级并行的目的,这些技术的加入也限制了更多核心数量的集成。
而GPU集成了多个流多处理器,因此每个GPU可被看成1到30个SIMD处理器,其中每个SIMD处理器包含8个ID流处理器,GPU的并行则是利用了多个流处理器间的粗粒度并行及流多处理器内的细粒度数据并行。
ALU较同时期CPU多的主流GPU在单精度浮点处理能力比CPU高大约15倍。
3)带宽差异,因GDDR存储器存在相对位置不一致导致CPU内存的信号完整性问题考虑比GPU显存严谨,故而同等条件下显存的工作效率比内存高;其次,多存储器控制单元的GPU比存储器控制单元为双通道或者单通道的CPU在同时访问的存储器粒数量要高。
图2.2为2007年以前GPU与CPU带宽比较。
4)缓存差异,为降低访存延迟并节约带宽,CPU存在使用大量晶体颗粒的缓存,为了保持缓存与内存数据一致,还添加了复杂的缓存逻辑控制单元;GPU则没有如此复杂的缓存机制和替换体系,因GPU缓存只读,减少显存带宽,从而控制单元相对简单些。
CUDA软件体系
CUDA的存储器模型
CUDA架构下的GPU是一种多层存储空间复杂结构体,这是GPU自身的发展历史和GPU原本的设计理念决定的。
如图2.3所示[],该图表明了CUDA的存储器结构包括六种存储器:
全局存储器(GlobalMemory)、寄存器(Registers)、本地存储器(LocalMemory)、共享存储器(SharedMemory)、常量存储器(ConstantMemory)、纹理存储器(TextureMemory),其中前三者支持读/写操作,而后两者只具备读操作。
这些存储器在性能上存在较大差别,它们的结构各异、运算速度不同、大小及存储规模不一样,也决定了CUDA在并行运算过程中存在相同并行运算过程有不同的运算加速收益。
共享存储器、寄存器以其独特的结构组成方式在这些存储器中在数据流访问操作速度方面是相对较快的。
对于每个并行的运算线程来说,寄存器、局部存储器都是私有的,也就是说每个线程单独存在使用各自的寄存器及局部寄存器。
之中,作为GPU上的高速缓存区,寄存器能够在极低延迟的情况下别每个线程的ALU所读取。
数量客观的寄存器文件(RegisterFile)构成了寄存器的基础单元,并且被分配给每个正在执行的并行线程,因此,在并行执行的过程中每个线程所拥有的寄存器大小及其有限,在编程过程中应尽量为每个线程分配足够且较少的的私有变量。
局部存储器是寄存器在线程执行过程中的补充,当寄存器使用过多,或者并行使用到结构体、数组这样的大数据变量,局部寄存器就充当暂时的收容所,为这些私有数据分配必要的存储空间,其区别就在于,分配到局部存储器的数据是存在于显卡显存中,而不是像寄存器在边上或者缓冲区中,所以局部存储器对数据的访问操作会比寄存器慢很多。
与寄存器类似,共享存储器同样也是GPU上的高速存储器,但如同名字一样,存在于共享存储器的数据是被同一个线程块(Block)中的所有线程共享的。
分配这样一种存储器的目的在于解决线程块内各个线程的通信问题,这个也是CUDA的创新之处,以往的GPU并行运算技术在执行过程中线程之间的通行总是难以解决,各个线程之间的通行过程总是会存在很长的延迟,而CUDA因为共享寄存器的存在,其在保存共用计数器或者线程块内的公共结果时,省去大量时间进行线程间通行,所以相应的速率会提升很多。
占有显存很大一块的全局存储器,GPU、CPU可以直接访问操作其中的全局数据,也就是说执行并行运算的任意一个线程、串行运算的部分都可以读写当中的任意区域的数据,但访问操作过程有很高的延迟。
全局存储器带宽很高,在遵守访问要求前提下,避免分区冲突,如此高的带宽才能被充分的利用好。
同样位于显存的常数存储器拥有缓存加速,且为只读存储器。
GPU分配给常数存储器的空间只有64K,可用于存储并行运算执行过程中需要多次读取的只读变量。
由于它的缓存机制,常量存储器节约了带宽,提高了读取的速率,同时也因为数据只读,因此不存在缓存不一的问题。
特殊的只读存储器还有纹理存储器,开辟这样的一块存储器也是由于GPU纹理渲染功能的特殊性。
与常量内存类似,纹理内存存在缓存从而减少了对内存的请求并提供更高的带宽。
图2.4为纹理内存原理的示意图,图中的地址并不连续,普通的CPU缓存机制下这类地址得不到缓存,而GPU就可以在该种模式下进行缓存加速,获取并行程序性能的提升。
CUDA编程模型
CUDA软件体系主要包括了CUDAC编译器NVCC以及与相关显卡关联的各类硬件开发工具。
整个的CUDA软件开发体系由运行期环境(Runtime)、开发库模板(Library)、配套驱动(Drvier)三个部分组成,如图2.5所示。
正如CUDA名字一样,为了更好地利用GPU及CPU上的运算单元,CUDA在数据执行并行过程中采用了统一的处理架构进行处理操作。
统一架构下,任意写入功能及共享存储器的存在确保了线程之间能更快速地通信。
CUDA的编程模式下,程序将CPU作为主机(host),将能用于CUDA并行运算的GPU作为设备(device),随着CPU+GPU异构的发展,在CUDA并行运算中可存在多个设备,但主机只能有一个。
用于cuda开发应用的程序段在程序执行运算过程中也相应地分为两类,运行在CPU上的程序代码为主机(host)代码,运行在GPU上的程序代码为设备(device)代码,kernel即为后者运行的并行程序段。
并行运算研究人员以CUDAC对GPU编程,CUDAC是工业标准C的一个简单的扩展。
一般情况下,C函数为串行执行一次,而在调用kernel函数时,函数执行的过程在GPU上是重复的,也就是说GPU上分配了N个线程执行并行加速,则kernel就被平行地切不相依靠执行N次,这个也是并行运算的基本原理,可以理解为kernel函数只是CUDA程序中被并行执行的一个步骤,如图2.6所示,线程中执行过程对存储空间的操作及关系在2.2.1节已阐述,GUP在执行的处理器层次与CUDA线程数目相对应。
Kernel函数存在双层次的并行,一个是线程格(Grid)中线程块间的并行,另一个则是线程块中线程间的并行,这个双层次的并行也是CUDA重要创新之一。
在对GPU进行编程前,首先要考虑的是要对程序中哪部分的运算进行并行加速。
主机端对CPU的数据操作及串行处理部分代码和设备端对GPU执行并行运算的一系列操作代码构成了完整的CUDA程序,这些代码执行顺序与语句的顺序有关,执行与语句满足顺序一致性。
Kernel函数启动前的数据准备及GPU设备初始化工作、kernel与kernel之间的串行操作都由CPU端代码完成。
就目前看来,最理想的CPU串行代码一定程度上说是为kernel函数服务的,即体现处理并行上下文的作用。
核函数Kernel的定义必须通过__global__函数类型限定符定义,通知CPU这段函数执行时是在GPU上执行,且仅能在CPU端代码代用该函数,调用过程中通过<<>>运算符对kernel函数的执行参数进行声明,其中grid表示执行并行运算的线程格中线程块的数量,block表示执行并行运算的线程块中线程的数量。
这两个参数的配置对执行并行运算的效率收益也有重要的影响,并行执行所操作数据量大,则着重考虑block大小,但当数据吞吐量很小的时候就要同时考虑grid和block之间的大小关系了。
这个问题也是并行程序优化的一个重要内容。
执行并行运算的线程总数可以由上述两个参数grid和block计算得出,等于两个参数的乘积。
在线程块中,每个线程在线程块内都有自己相应身份标识索引,这些索引由线程在线程块中的相对位置以及线程与线程块的维