在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → GPU计算高级优化技术精简手册

GPU计算高级优化技术精简手册

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:2.89M
  • 下载次数:21
  • 浏览次数:109
  • 发布时间:2020-08-09
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.pdf
  • 所需积分:2
 

实例介绍

【实例简介】
一步一步,由浅入深,CUDA进阶的好资源!
41卷积层的高效计算 41基于矩阵乘法的卷积 4L2改进-无需额外存储空间的矩阵乘法卷积 4.3高效的F实现 414基于理的快速卷积 42采样层的高效计算 4.21下采样 422上采样 43梯度更新的高效实现 4.31偏置的更新 4.32激活值的更新 第五章多设备编程建议 第六章閒P编程优化技术总结 610CUDB设备上的优化技术 6l访存优化 62指令优化 63内核调用优化 6206CN设备上的优化技术 621访存优化 6.2指令优化 6.3内核调用优化 6.3构建性能可移植的程序 小结 参考资料 第一章设备微架构 前言 第一章我们介绍吣UD设备和:设备的微架构做。对设备微架构的了解可以在深度优化时提供 理论依据和方向指导,对微架构方面细节的掌握有时甚至是帮助某些应用达到最优性能必须要 的。当然,对底层架构细节的了解并不是必须的,若读者对这些内容没有兴趣,可以跳过本章 10CUD设备微架构 kepler架构包含了数组SM每个SM有以下功能单元构成 1指令预取单元和微指令缓冲区 24个wa调度器每个war调度器对应两个指令分派单元 3192个 CUDA Core利64或8个双精度计算单元 432个超越函数计算单元(FU 5分支逻辑控制单元 632个動/霾存储器访问单元 片上缓存结构,包括共享内存,Ⅵ缓存,纹理缓存,常量内存以及只读缓存,不同的设备 大小可能不同 kepler设备S微架构图 SMX Instruction Cacho Warp Scheduler Warp Scheduler Warp Scheduler Warp Scheduler Dispatch Dis patch Dispatch Dispatch Dispatch Dispatch Dispatch Dispatch Register File(65, 536 x 32-bit GK110)I(131, 072 x32-bit GK210) Core Core Core DP unit Core CoreCore DP Unit LD/ST SFU CoreCore Core Dp unit Core CoreCore DP Unit LD/STSFU Core CoreCore DP Unit CoreCoreCore DP Unit LD/ST SFU CoreCore Core DP Unit Core CoreCore DP Unit LD/ SFU Core Core Core DP Unit Core Core Core Dr Unit LD/CT SFU Core Core Core DP Unit Core Core Core DP Unit LDVeTSFU Core Core Core Dp Unit Core Core Core DP Unit LDIST SFU Core Core Core DP Unit Core Core Core DP Unit LDSTSFU CoreCore Core DP Unit CoreCoreCore DP Unit LO/ST SFU CoreCore Core DP Unit CoreCore Core DP Unit LDIST SFU Core Core Core DP Unit Core Core Core DP Unit LD/er SFU Core Core Core DP Unit Core core Core DP Unit LD/STSFU Coro Coro Coro DP Unit Core Coro Core DP Unit LD/ST SFU Core Coro Coro DP Unit Coro Coro Core DP Unit LD/STSFU Core CoreCore DP Unit CoreCoreCore DP Unit LD/ST SFU CoreCore Core DP Unit Core CoreCore DP Unit LD/STSFU Core Core Core DP Unit Core Core Core DP Unit LO/ST SFU CoreCore Core DP Unit CoreCoreCore DP Unit LD/ST SFU Core Core Coro DP Unit CoreCoreCore DP Unit LD/ST SFU CoreCore Core DP Unit Core CoreCore DP Unit LDISTSFU Core Core Core DP Unit Core CoroCoro DP Unit LD/ST SFU Core Core Core DP Unit CoreCore Core DP Unit LD/ST SFU Care Core Core DP Unit Core Core CoreDP U LD/ST SFU Core Core Core DP Unit Core Core Core DP Unit LD/ST SFU Core CoreCore DP Unit CoreCore Core DP Unit LD/ST SFU Core Core Core DP Unit Core CoreCore DP Unit LD/ST SFU Core CoreCore P Unit CoreCore Core BP Unit I n/sT SFU Core Coro Coro DP Unit CoreCore Core DP Unit LD/ST SFU Core CoreCore DP Unit CoreCoreCore DP Uni LD/ST SFU Core Core Core DP unit Core CoreCore DP Unit LDIST SFU Core Core Core DP Unit Core Core Core DP Unit LD/ST SFU Core Core CoreDP Unit Core Cone Core DP Unit LDISTSFU Interconnect Network (64 KB Shared Memory / L1 Cache GK110)I(128 KB Shared Memory /L1 Cache GK210) 48 KB Read-Only Data Cache T T Tex Tex Tex Tex Tex Tex Tex Tex Tex Tex Tex Tex Tex Tex 各种指令的在不同的功能单元上执行,人致可分为四类:简单计算指令,复杂计算指令,分 支指令和访存指令,下面是各个单元所支持的操作(仅以 kepler:和maxe设备为例) CUDA Core :3位单精度浮点加法,乘法,积和融加运算;32位整数加法;32位数据的比铰操作,最小和 最大操作:3位数据的位逻辑操作(and, or xor)3位,16位数据和32位数据之间的转换操作。 双精度计算单元:双精度浮点加法,乘法,积和融加运算。 SU:整数乘法,除法;单精度浮点数除法以及基本的数学函数如正弦,余弦和指数等操作;pp C,dlz, brey,bfe和hf操作。 分支逻辑控制单元:分支,跳转等逻辑操作 /霾单元:全局内存,共享内存,局部内存,常量内存,纹理加载等存储器访问操作。 warp vote和 warp shuffle操作时在是专门的组合逻辑单元上完成的。 max设备和 i kepler:似,但是每个SM里包含了四组独立的wa计算单元,每个Wa单元包含 个微指令缓冲区,两个指令分派单元,1个wa调度器,32个CUDn Core,1个双精度计算单元,8个单精度SFU,个纹理单元,16k个32位寄存器组成的寄存器文件以及纹 理缓存。所有四个Wam单元共享一个指令缓存以及64-96k的共享/山缓存。虽然每个SM中的CUD Cure数量少于SMX,但是每个计算单元具有更高的性能功耗比。相对来说, maxwel具有更优秀的单精度 计算效能,但为∫平衡性能功耗比,所有计算能力的 maxwel设备对双精度计算的支持都十分有限,而 kepler更适合那些需要双精度计算的专业领域。每三个SM或每四个SMM组成一个6PC,所有GPC共享5l2k~ aM的二级缓存。 缓存小结 对于计算能力2x的设备,纹理管线完全独立于M/2缓存结构 对于计算能力3的设备,纹理和山缓存是各自独立的,但都通过12缓存加载全局内存数据。 对于计算能力5x的设备,共享内存,纹理缓存都属于缓存的一部分,所有对全局数据的访问 都通过1缓存路径,除非米川直写策略。 maxw!设备微架构图 SMM D vertex Fetch Tessellator rt ranson Attnbute setup stream Outout Instru ction Cache Instruction Buffer Instruction Buffer Varp Scheduler Warp Scheduler 口 ispatch Urit Dispatch umit Dis patch Unit Dispatch Unit Register Filc(16, 384 x 32-bit) Rcgistor Filc (16, 384 x 32-bit) Core Core Core LDJE Core Core c Corc Corc Core LDIST SFU Core LEST SEU Core LIST SFU Come LAST SEU Core Core Core Core LD/S SFU 己ore Core LEST one Core Core LDIST SEU Core 己ore LDST SEU core LUISI SFU Core/ST core Come LEST SFU Core CorE Cd core LDIST SFU Core Core LEST Texture I L1 Cache To Tex Te> Te Instruction Buffer Instruction suffer Warp Scheduler Warp Scheduler Dispatch Unit Dispatch Un就 Dispatch unit Dispatch Unit Register File (16, 384 x 32-bit Register File(16, 384 x 32-bit Core LDIST SFU Core Core c c LD,ST F Corre CoreC LDST SFU Core core‖care LD,GT SFU Cor c Core Core LDIST SFU Core core Core LOST SFU Core Core LDIST SFU Core C。re LD.ST SFU cone LD.ST SFU Core core LDYST SFU Core Core cCore Core LD.ST SFU Cone c。r Lms下 SFU Core Core c。re Core LST SFU Texture L1 Cache E2c 96KB Shared Memor L0.1寄存器文件结构 正因为寄存器索引包含在指令编码中的,且距离计算单元最近,因此其延迟比其它任何类型的内 存都要低,带宽也要远高于其它类型的内存,这也正是为什么充分使用寄存器是某些应用达到峰值 性能所必须且唯一的原因。在计算能力3.5+的 kepler设备和 maxwell设备上的每个SM中的6个3- ht寄存器文件被划分为4个han每个han中的16k个3 劢t寄存器共享32个通道(ane,每个通道3位宽。出于每个线程最多可使用25个寄存器,那么如果使用 单个ban的话,每个源或目标寄存器在指令编码中需要占用8位;如果使用4个bank,那么每个目标寄 存器或是源寄存器只需占用6位,剩下的位数可以留作它用。比如对与四操作数指令(比如FMA), 如果采用单个加a结构的寄存器文件,那么寄存器索引在指令编码中需要占用32位;而采用4 har结构的寄存器文件的话,寄存器索引在指令编码中以需要占用24位,节省∫8位。在3位操作数的 情况下,寄存器文件和4个bank的映射关系为 banko: ro. r4, r8 r12 bankl, R1 R5, R9 R13 hank2:R2,R6,R10,R14, bank 3: R3, R7. R11 R15.,. 因此每个源或目标寄存器在指令编码中无需额外的2位表示寄存器的hank,否则将无任何节省。了解 设备的寄存器文件结构对于性能分析以及深度优化具有至关重要的作用,因为不合理的寄存器分配 会造成hank冲突(hank conflict,类似于共亨内存的ha冲突;在没有han冲突的情况下,指令同时从多个ban存取寄存器数据 由于源操作数最多为3个,所以寄存器的han冲突分为-way,2 way两种情况;日标寄存器和元寄存器之间不存在hank冲突的问题,因为取源操作数和写结果操作是 在不同的时钟次序下进行的,。每增加一路冲突,就会增加一个时钟周期的延迟。比如 FMA RI, Rl, R3, R 具有1路ban冲突(R和R3)。如果调整寄存的分配如下 FMA RI, RO, R3, R1 则可以消除bn冲突。 使用向量加载可以保证寄存器分配对齐到避免hank冲突的边界上,比如 DE128R0,[R3]1 R0,R1,R2,R3四个寄存器分别对应于hank,hank,hank bank3。注意到R位于hank1中,但是这并不会和上面代码中的R1产生冲突,因为功/T单元会首先取出R 13中的数据作为地址发送到数据总线上,然后(一定的数据传输延迟后)才将数据加载到hank0中的R 寄存器。使用向量类型吋寄存器的分配需要对其到偶数编码的奇存器边界上,因此冇吋候使用向量 类型会增加寄存器的使用数量,这有点类似于在分配对齐内存时(比如使用BVX2356指令时最好将数据 首地址对其到32字节边芥上),实际分配的内存空间会比通常的内存分配大一点。 奇存器文件分配需要注意的另一个问题是操作数端口对齐,简单来说就是在为指令分配寄存 器时,相邻的指令中位于同一个bank中的寄存器最好是具有相同的位置,例如 FMA R2. RO. RI. R2 FMA R6. R1. R4. R6 R0R4}/R1位于同一个bank中,但是在指令中的次序却不同,如果调整为 FMA R2, RO, R1, R2 FMA R6, R4, RI, R6 则可以对齐到操作数端凵上,编译器也往往在在指令间插入M0V操作来达到操作数端凵对齐的目的 FADD R2. RO. RI FADD R2. R1 R2 FADD R2. RO. RI MOV R4. R2 FADD R2 R4. RI 在64位操作数的情况下,寄存器和4个bank的块射关系为 bank0:R0:1]l,I8:9,, bankl R(2:3], R[10 11] hank2:R[45],R[1:13], bank 3: R[6: 7], R[14: 15] 你可能会奇怪,为什么对于32位操作数和64位操作数寄存器和ban之间的映射关系不同。这是因 为hank和寄存器之间并不是隶属关系,hank仪仪相当于数据通道,寄存器文件中的任何数据都可以从 任何一个hank“进出”。可以将设想成地铁站的多个出入口,将每个wap中的ha对应的32个通道比作 地铁的各个门,而将人比作数据。那么,人们首先从地铁站的各个出入口进站,然后再从各个地铁 的门进入地铁;反向的情况则是人们从地铁的各个门离开地铁,然后从各个出入口离站。注意,“进 出的不是寄存器木身,而是寄存器中所包含的数据,寄存器文件木身是一组固定在芯片上的门电路 阼列,是无法移动的;而我们在编程中所说的寄存器指的仅是物理寄存器的标示符;所以为了区分 ,常将两种情况分称为物理寄饣器和逻辑寄饣器,以下若无特别说明,指的均是逻辑寄存器。 由于每个wap中的32个线程共享四个han每个hank有32个32位通道,因此对于64位操作数需要连 续的两个通道或是根据高低32位分两次存取数据,所以每个Wa调度器为对应的wap中所有的线程发 射指令需要两个时钟的延迟(或者说每个wap调度器在l个时钟周期只能为16个双精度单元发射指令 这样在没有han冲突的情况下,4个wam调度器在单个时钟周期内可以以全吞吐率为SM内的全部6个 双精度单元进行指令译码),下面以]遡操作说眀wa中32个线程通过3路通道存取寄存器文件的操作 MA R4, RO, R2, R4 第一个时钟周期: lane 0 hank0R0,R0,R0,…,0 hank1R2,R2,R2,…,R2 bank2 R4r4R4. r4 第二个时钟周期 lane 0 bank0R1,R1,R,…,R1 R3,R3,R3,,,R3 bank2 R5 R5R5,. R5 山缓,常量内存,共享内存以及纹理缓存的信息在很多资料中都有详细的叙述,这里不再多说 ,有兴趣的读者可查阅本章后面的参考瓷料。 .2指令流水线 首先指令预取单元从指令缓存(片上的缓存,物理存储介质和缓存相同)中取出多条指令进行 译码,然后将译码后的指令存储在隶属wa调度器的微指令缓冲区中。指令发射单元从微指令缓冲区 中取岀两条指令分派给wap调度器选定的wa指令管线中,两条同类指令是顺序进入管线的,指令管 线通过将一条指令的发射,取操作数吋钟和另一·条指令的取操作数和在功能单元上的执行吋钟重叠 来流水线化指令的操作,这样可以有效降低整个指令流水期间所有指令的总时钟数。流水线化在多 个层次都同时存在,如不同功能单元之间的流水化,wan单元和warp单元之间的流水化以及指令和指 令之间的流水化。不同功能单元之间的流水化,比如将计算单元上的操作和/T单元上的操作重叠 进行来隐藏数据访问的延迟。通过多个Wap之间的切换让处于停顿延迟中的wa和正在执行的wamp的 吋钟重叠隐藏wa中的计算或是访存延迟,亦即将wa流水化。单条指令在管线中的过程分为发射, 执行和写回。发射阶段从寄冇器文件中取操作数;在执行阶段根据指令中的操作码在相应的单元上. 执行特定的操作;写回阶段则将计算结果写入日标寄存器。因此,指令之间的流水化正是通过将前 条指令的执行和写回与下一条指令的发射和执行的时钟重叠来减少整个管线中所有指令的操作延 迟。在指令译码阶段完成数据的存取后指令的计算结果并非立即可用,而是需要数个时钟的延迟。 般来说指令管线的深度至少不应小于指令的计算延迟,才足以保证指令流过管线后已经完成计算 。理想情况下,每当一条指令从指令管线末端沇岀(完成计算)时,管线的前端就会流入一条新的 指令,这样指令管线中的多条指令通过时钟重叠的方式有效的隐臧计算延迟。不同的指令可能具有 不同的指令发射周期,亦即当发射一条指令后,需要几个时钟的停顿后才会发射下一条同类指令。 我们偎设一个指令管线的深度和指令的执行延迟均为4个时钟周期,每周期均可发射1条指令,那么 指令流水线情况如下 i clock io 2 clock l1 1o 3 clock ie l1 io 4 clock 12 I I0 5 clock 13 12 11 10 6 clock 312I11 i clock 13 2 I1 I0 8 clock I3I110 流水线化红色部分是从管线末端流出的以完成操作 如果没有采用流水线化,那么 5 clock io 6-10 clock 11-15 clock 12 16-20 clock 13 可以看出,采用流水线化的操作完成四条指令的译码和执行只需要8个时钟周期,而不采用流水线化 的操作则需要20个时钟周期。 11设备微架构 Message Bus SIMDO Branch a IB Unit 10 Wave Export/GDs Decode EIMD1 豆→ Vector Memory Decode pC IB 10 Wave 9星 scalar Scalar Unit SIMDO SIMD1 SIMD2 SIMs Bus 是 KE REGisters SIMD2 Registers Register Registers Re PC& lB Integer ALU Data 10 Wave yELLEN Cache L2 Cache Decode ALl ALU LLU SIN 16KB PC IB 10 Wave LDS 64 KB LDS Memory 4 cU Shared 16KB Scalar Read Only L1 Cache ReCuRe Write bite 4 CU Shared 32KB Instruction L1 Cache L Cache GCN设备山多组 Compute Uni简称CU每组C中包含组4个16路向量SIMD单元,一个标量单元和一个分支通信单元。每个ImD单元 配备6的向量寄存器(寄存器粒度是3位),每个线程最多可以使用255个寄存器;向量单元主要执 行简单浮点和整数计算,如3位和6位的浮点加法,浮点乘法M以及32位整数加减法以及24位整数乘 法和乘加操作。标量单元配备8的标量寄存器以及一个整数计算单元,寄存器的粒度同样是32位大小 标量单元负责流控制等操作,而整数单元则负责全精度的整数运算。每个郎中的 wavefront调度器每 个时钟周期可以发射5条指令,包括4条向量指令(每个SIMD单元一条)和一条标量指令。多个SIMD单 元可以运行同一个work 【实例截图】
【核心代码】

标签:

实例下载地址

GPU计算高级优化技术精简手册

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警