《2021OpenCL中文教程AMD版本.docx》由会员分享,可在线阅读,更多相关《2021OpenCL中文教程AMD版本.docx(86页珍藏版)》请在三一办公上搜索。
1、OPenC1.中文教程(AMD)第一百GPU计算与OPenC1.1.1什么是QPenC1.112为什么要使用OPenC1.1121利用OPenC1.可以充分利用设备的并行特性11.2.2OPenC1.为程序员提供了平台独立性213AMD与流计算31.4本文的结构4第二章OPenC1.架构2.1平台模型P1.atfOrmMOdeI522内存帙5?MemoryMOdeI623执行模型ExecutiOnMOde1.72,4编程模型PrOgrammingMode1.9第三妾OPenC1.编程32OPenC1.平台初始化1933OPenC1.运行时模块213.4 QPenC1.内存管理模块273.5 O
2、PenC1.内核模块333.6 OPenC1.的可选扩展44第四章OPene1.优化编程4.1AMDGPU架构4742暴本优化策珞4743数据传输优化484.4内存访何的优化技术494.4.1 G1.oba1.Memory访存494.4.2 1.oca1.Memory访存5245计算及控制流优化5845.1控制流584.6其他优化技术594.6.1 内建数学函数59第五章实例之一M1.R-FHD和MiR-Q的优化5.1M1.R-FHD和M1.R-Q的优化61第六章实例之二:KD-Tree创建算法并行化1 .1KD-Tree简介6962 KDTree的创建兑法改进6963 并行创建KDTree算
3、法细节7363.1 求元素的包悟维合73632元案的空间分割策略7463.3 KD-Tree节点的内存管理756.4 利用OPenC1.所能带来的潜在优势756.5 本章小结76第七章实例之三:稀疏矩阵-向量乘法(SPMV)7.1 相关的基本概念771.1 .1稀跋地阵777.12 稀疏矩阵的CSR格式7812SPMV算法设计和优化79721SPMV基本算法及其并行化79722基本并行算法的优化80723Itt步改进的方法827.3本章小站86附录AAMDOPenC1.开发环境A.1如何组建AMD流计算环境87A.2AMDopenC1.profiIerXK88附录B常用术语B.1中英文术语对照
4、表91B2名词解择92第一章GPU计算与OPene1.U什么是OPenC1.OpenC1.fOpenComputing1.anguage即开放:SmOPenC1.为异构平台提供了一个第写理T,尤共是并行程序的开放的框架标准OpenC1.所支持的升构平台可由多核CPU、GPU或其他类型的处理器组成.OPenC1.由两部分组成.-足用于编写内核程序(在OPenC1.设备上运行的代用)的语;.二是定义并控制平台的AP1.oPenC1.提供基于任务和基于数据两种并行计算机制,它极大地扩展fGPU的应用范用,使之不再局限国形领域.OPenC1.由KhrO1.WSGrOUP维护.KhronoSGrOUP企
5、个非盈利性技术组织.维妒售多个开放的1:火标准.例加QPenG1.和OPenA1.这两个标准分别用于潍图形和计算机音蜘力叽OPenc1.源程序既可以在名核CpU上也可以在GPU上编课执行,这大大提倡了代磷性能和可移构性,OPenC1.标准由相应的标准委员会IWiT,委员会的成员来自业界各个重要厂商2.作为用户相程序员期待已久的东西,OPme1.芾来两个重要变化:一个跨厂商的IE专仃软件解决方案:一个跨平台的异构框架以同时发挥系统中所存计算单元的能力.12为什么要使用OPenC1.1.Z1.利用C)PenC1.可以充分利用设备的并行特性现代处理器的架构己经籽并行计兜作为J*提高性能的个段市更途径
6、.高性能CPU的由于很难克眼提高时钟频率后的放热问题转而使刖增加运郎核心的方法加速,作为图形渲染5用的处理器,GPU具有淘度的井行特性,由于相关应用的霜要,GFU也从他的图形渲染设备转化为作为通用计W的协处理器,相对于CpU.GPU行很多自己独行的特点。 GPU的运。核心数法较远远超过高端CPU的核心Jf%GPU的每个运算核心并没有CPU的运灯核心工作频率醺,但是其总体性能-芯片面积比和性能-功任比都很离,在处理并行计。的相关任务中有很大优势. GPU是通过火盘并行线程之间交织运行物戚全局访问的妊迟,同时GPU逐棚有大量的寄存、局部存储涔及CaChe等来提升外部存储的访问性能,.UOHDSMW
7、ftrtMeU46MAMDsWXttne.NVMi*WJ*fcIYwC1.UfeAM.除以上两点.GPUH对于CPU还在很多其他将性。这些特性决定了GPU的计算模式是以种并行的方式进行计灯的.蛙干GPU或者其他并行运尊设法的算法与传统的1CPU的举行算法有很大差别:,并行算法中要行大驻维稗在运行,而一般的串行律法都乂忏-个线程在运行。,并行算法中的旬个浅程的行为需要尽城保持一致,如果分支很多,各战程乂选报不同路径执行,会严五肾低GPU运喇效率.在CPU中,邺使有两个线程的行为而慢不一效.也不会非御河件能.在拜并不加特殊约束的情况下,并行运算泄各是不保证每个段程看到的全局内存是一致的。程I?员有
8、曲任维护浅程同步以及内存管理等任务,在传统的举行运算设备中,例如CPU,线程之间切换的开ffi是比较大的.所以般来说,是不奴励阳予员为个完法开启大衣线程的.而在类似于GPU的并行运版设备中.线程之间的切换是非常廉价的,这些设备也正是通过她理之间切换来胞藏一些内存访问延迟的,IJCPU相反,并行设备股是不鼓励设备运行具有很少殴程的独法.OpenC1.为程序员提供了控制并行计算设备的一些接口以及一些拄制运翼单元行为的类C编程语言.用户可以种HOPenC1.按1.J开发井1被很高的程序.并且将其运行在GPU或者其他处理设番匕122OPenC1.为程序员提供了平台独立性如今大部分的离端的计算机系统葩本
9、上都引入了i性健的CPU.GPU和我它契里的处理器.这就为软件开发提出一个内在的要求.即必须保证域写的软件能够在各种异旃平台上自由移桢,并I1.能充分而合理的利用到整个计灯机系统的所有计算资源,OPenC1.正是为了满足用户的这个要求而设计的.它创U范阳广泛,从嵌入式消费及软件的开发到高性能计算解决方案.称可以通过共完成OpenC1.具有一个朕层程序接【】.和一个高性能可移植的抽象层.它为并行计剌龈U个月效的开发环埸一个平台独立的工具和丰京的中间软件层。通过传统的方法开发个运行在异质平台,例如包括多核CPU和GPU的平台,并行运算程序是十分困难的.传统的基于多核CPU架椅的并行计算程序会假设地
10、址空间在计算过程中心始终共享的.GPU并行计算模型则有芾非常焚杂的内存层次和矢盘猱作,并乩不同平台,不同厂商,不同产品型号的GPU往往有薪不同的架构,这些限制使得软件开发人员很难开发出出能高效的运用各种异质平台计灯资源的软件.OPenC1.标准的诞生为状件开发人员能够高效利用各种异构处理平台提供了充分保眼.从而性能计口威务器,到家用计舞机系统,冉到手持设备,从高端GPU.fif标多核CPUMDSP,和Ce1.1./B.E.PrOe出SOr.OPenC1.支持叶咯样的并行处理器的祖台平台,13AMD与流计匏早在推出OpenC1.标准之前.AMD/ATI从事流计整模型的研究和开发已经有很长段时间了
11、,流计”(StreamCOmPUting)见基于SIMD模式的并行计见模型.用户将处理的数据看位流(Stream).W此称之为流计算粮期。AMD为流计城专门开发一个接近硬件的g励接U,CA1.(ComputeAbstraction1.ayer),程序员通过CA1.可以访问硬件所提供的儿乎所行特性.其中包括, 设备管理 资源哲理 内核的读取与执行 多核GPU的支持CA1.支持用I1.(Intermedia1.anguage)漏号的内核函数,也I,僻可以接受IH硬件指令R直接来编写Kerne1.fiCA1.的内核编写十分繁琐I1.又是一种先以Jv箱的语吉,就卿)试,因此对fC程序员来i.学习起来也
12、不是特别快,也不适合快速开发大型程序。为了克版这蝌点AMD推出/上层的应用稗序接I1.Brook+.BroOk+为开发并梃供了一个简便快槌的漉计算开发接口.用户可以通过Brook+花AMD/AT1.的赞件进行流计算开发,BroOk+的内核程序是由种类C语;;编与的,所以善常适合传统的C以及C+程序员。Brook+诺言中引入/液-即数楙流和内核程序的概念用来处理流计克,Brook,的内核函数通过BrCC(BroOkCodeComPi1.er)Si译.然后Brookruntime可舔编译好的kerne1.程序提交GPU或CPU执行.BrOOk,的内核程序的可调试性婴远远高于CA1.H前,最新的Bm
13、ok+的版本为1.4BetaAMD1.1.经停止了对它的开发和维护,BroOk开发时间不久,有很多限制,并且!因为过多的封装,效率也不高.开发接于GPU小的测试程序还可以,但是如果开发复杂的项目.BroOk+就有些力不从心了.AMDr2009年10“中旬,发布/基于GPU和CPU的OPenC1.解决方案,用于常决BrOOk+中遇Ii1.的诸多不足,随着OPenC1.标准的不断完善和推广它必将成为并行计算领域中的个血要规范。ADM一直在x86处理器、GPU和高性能计算等领域保持自身的优势.它是OPenC1.标准的例导者和支持本在标准委员会中占在用姿一陆,也是目前唯能同时棍供高性瞰86和GPU技术
14、的企业。U本书的结构木书第京概述了OPenC1.的基本概念,用途和结构.第二章详细描述了OpenC1.的平台模型,内存模型,执行模型和编程模型的架构,弟:章评细介绍OPenC1.编程方法的各个方面,包括平台初始化.运行时API和OPenC1.C温拜诺吉等第四章将很介绍了OpenC1.用程存在AMD高端GPU上的优化方法,第五、第六、第匕然通过实例屉示了OPCnC1.在几种。法中的应用以及耳休的并行优化技巧,1录中介绍了搭建AMDGPU开发环境的方法,AMDGPU性能调试工具的韭本用法,以及常用术语的中英文对照及解择.第二章OPenC1.架构IOPenC1.是,个用于弁构平台上编程的开放性行业标
15、准.这个平台可以包括CPUGPU和其他各类计算设备,如DSP和CewBE等等,OPmc1.会构分类计算设备组织成一个统一的平台.OpenC1.不仅仅是种期仁诺吉.更是一个完整的并行揭程桩架,它包括编程培吉,API,由数库以及运行时系统来支持软件在整个平台上的开发.OPenC1.是为那些想要纲写出可移植高效程序的程序开发人员JS身定做的.包括软件库开发人员.中间商和以提升性能为导向的程序开发行,OpenC1.为他们提供一个低媛制硬件抽象层和一个用译fit次来支持编程,OpeneU与许多并行硬件设招行为抽象为API来比导开发者进步加速他们的程序。本地拘通过对以下OPenC1.中各个模型的介绍使读不
16、了解OPenC1.所包含的核心思想:平台模型PIatformMode1.内存模型MemOryM(XkI11rW5?ExecutionMode1.编程模型PrOgrammingMode1.21平台模型P1.a1.fQ门nMode1.S1.MD模式或KSPMD模式,CompvitUMCrvpuHDrc平台模型如图2.1所示.由个主机(host)连接,个或多个OPenC1.设备构成.其中材个OpenC1.设番又可以分割成一个或多个HW单元(CU.每个计算单元又可以进一步分斛成一个或多个处理单元(FE).各种计枕操作都是在处理电元中完成的,所有由OPenC1.级。的应用程序都是从host启动并在hos
17、t上结束的,h峭泞理器整个平台上的所有计口费源.应用程序会从hostS向各个OPenC1.设备的处理单元发送计匏命令.在个计算单元内的所有处理单元会执行完全相同的套指令流程.指令流可以是2.1:P1.dtformmode】QnChottp1.uoneQrrwreco11u1.cdevKeKhWithoocormorveomputeUnitsrdchwithontformOTeprocvwingdcnients.K0”网QM分工字内容;XMzGro”KoC%ECtSPNCCME22 内存模型MCInOryMode1.Openc1.角内核程序中用到的内存分为了四类不同的类型:全历内存(g1.oba
18、1.memory):工作空间内所有的工作节点都可以读写此类内存中的任意元素.OpenC1.CIJitIt缓石g1.oba1.buRer的内建函数“常状内存(ConStantmemory):工作空间内所有的工作11点诃以只读此类内存中的(E怠兀案.host负我分配和初始化constantbuRer,在内核执行过程中保持不变.局部内存(1.oca1.memory):从蟠JJ个工作组的内存,问一个I:作组中所有的.作节点即可以共学使用该类内存.其实现既可以为OPene1.执行为其分配一块专的.内存空间,也有可能直接将其映射到一块g1.oba1.buRer匕私力内存(PriVatememory):只从
19、期当前的I:作节点-个I:作节点内部的PriYatebuRer其他节点是完全不可见的.表2.1描述了host和kerne1.是如何管理和使用各类内存的。生同Ux小网HOSt端处配动态动态动态小可分配访问可读写可读写不可访问不可访问Keme闹分也不可分也静态静态怜态访问可读写只读可读写可读写2.1MemoryKion-A1.1.ocationandMemoryAvesQipbi1.i1.iee图2.2描述了各类内存区域的作用空间即其在平台中的位置.图2.2:Covpca1.1D).OPene1.规范中使用NDRang来定义N-雉噱引空间。它由一个长度为N的整数数蛆构成(N为1.2或3对应一维:维
20、或三维空间该数组中的元素指定了工作空间怔个维度的上工作节点的个数Z作节点的g1.oba1.ID和IoCaIID以及工作组ID都是N维,每个雄度都是从。开始依次加1.让我们通过以下的例子进一步了解I:作空间的结构.如图2.3所示,给定一个二维工作空间NDRang(G,.Q.对应工作如NDRang(S、.S0.由于每个维度上工作空何都必须能恰好等分成若干个工作练则笠求G、必须为只的然效体G必须为导的整数倍,假设工作空间中*个节点的g1.oba1.!D(g,.gy).工作如ID为(w*.wy),在缸作设内的IOca1.ID为信,80则作为工作空间内的有效节点,其g1.oba1.ID,1.oca1.I
21、D,WOrkgrOUPID必须满足:0=gG,O=gyGy.(2.1)OVfV5“O三s,.(2.2)0三w,GxSx.O三WyeC1.第三章OPenC1.编程aiHe1.ioOpenC1.让我们从HeUOd这个荷单的实例开始学习。PCne1.的景程。这里假定程序运行在AMDOpenC1.1#inc1.ude2j#fdefined_APP1.E_)defined(_MACOSX)#inc1.udefde#inc1.udefcndifffdefineKERNE1.(.)%.VAARCScconMcharikerneiSourceCode=KERNE1.(23-kerne1.voidhe!1.oc
22、1.(_g1.oba1.uint*buRer)Idy三(1gidx)(0x1.dy为在第二维度上的gbba1.1.D,每一个节点枷IRer的第gidx+4gidy个元素按相应规则赋优程i1.下:*Mycrcrk33Arm中C6c1.uintnumP1.atforms;c1._p)atform_idp1.atformNU1.1.;status=c1.GetP1.atform1.Ds(OzNU1.1.r&numP1.atforms);if(statusNC1.SUCCESS)(printf(Error:CettinfFUtforae.(C1.GetPhtfornviIDs)n);returnEXn
23、1.FA【1.URE;Iif(numP1.atformsO)(c1.atforn.id*p1.atforms三(C1.PbtfQrEJd*)ma1.1.oc(numP1.atformssizf(C1.PIi10rmJd);status三C1.GetPIatform1.Ds(numP1.atforms,p1.atforms,NU1.1.);if(status!-C1.SUCCESS)ItrUtf(*Error:CttinffP1.atforiId.(C)GetP1.atforms1.Ds)nr);return1;Ifor(unsignedinti=0;i*yc,cf,Te4;22.7c1._co
24、ntcxt_propcrtic?iCPS3)-(C1.CONTEXT.P1.ATFORM(C1.contex1.properties)p1.atform,01;c1.context.propertiescprops=(NU1.1.PkIHorm)?NU1.1.:cp5;/.7/Hc6DI1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.inifIHfIHfIHfI.7/c1.-contextcontext=CICreateCOnteXtFrOmType(CPrOP5rC1.DEVICE_TYPE_CPU,NU1.1.,NU1
25、.1.,6ce1.i*uSF(sUtu!-C1.fUCCESS)(print!(Error:Bai1.41nffFrorraa(c1.Bui1.dProgram)na);returnEXIT.FAI1.URE;)yn5,svC1.kcmdkerne1.-c1.CrrtcK:returnEXn1.FAI1.URE;)I1.ini1.1.1.1.H1.1.1.1.1.1.1.1.H1.Hninni1.1.iniIiniIinmi/eSjk3OpenCmandqueue/C1.CommanC1.qUeUeCommandQueue=演VAWtUWGP1.711731746II力IRIZ1in1WIM喉
26、1*7IM18IV1.roFMEFMIs1.dCreaBeCom11undQeue(context,devices0.ft&5t1.t1.1.S);if(status!-C1.SUCCESS)prIntf(*CrtIncCa1.MadQmu(C1.CreateCommandQueue)Xn);returnEXIT.FA!1.UKE;Iiiiihihiiiiiiihiiiiiiiiiiiiihiiiiihiiiii1.11SCpcnC1.buR*O/;unsignedi11toutbu1.n,);returnEXIT.FAI1.URE;w/上3kc11x1.口COEmndqueue7sizetg1.oba1.ftreads(4,4);size