CUDA Review

1.  GPU硬件特性

1.1 存储层次

1.1.1 Global memory

1) 大小一般为几GB

2)  chip-offDRAM介质存储器

3) 访问速度慢(是shared memory的上百倍)

4)  对于是否对齐和连续访问敏感(由DRAM的性质决定)(Remember:When using global memory to read and write a large matrix/array, errors occurred sometimes.)

5) 可以被所有的线程访问

1.1.2 Shared memory

1) 每个SM中一般几十KB

2) chip-onSRAM介质存储器

3) 访问速度快(与register相当)

4) 对于是否对其和连续访问不敏感,但是对bank conflict敏感(由bank设计决定)

5) 只对自身block中的线程可见

1.1.3 Register

1) 每个SM中一般为几千个(约30K

2) Chip-on的寄存器

3) 访问速度最快

4) 只对每个thread本身可见

1.1.4 Other

 Local memory

1) 每个线程有512KB(计算能力2.x),或者16KB(计算能力1.x

2) Chip-off的存储器,与global memory类似

3) 访问速度慢(与global memory类似)

4) 由编译器控制,存放寄存器溢出的自动变量

5) 只对每个thread本身可见

 Texture memory

 大小为6-8KB

 Constant memory

 大小为64KB

1.2 执行层次

1.2.1 逻辑

1) Grid:由block构成,维数及维度可以设置,所有的blockGrid中并行执行

2) Block:由thread够层,维数及维度可以设置,同一个block中的thread并行执行

3) Thread:由threadId识别,每个thread有自己的寄存器,私有变量,共享同一个block中的shared memory

1.2.2 物理

1) SM:由多个流处理器组成,每个SM有独立的资源,包括:block槽,warp槽,thread槽,shared memoryregister

2) Warp:由32thread组成,每次执行的时候,32thread动作一致,如果有分支,则串行执行

3) Thread:物理上属于warp,与其他thread一同,组成最小的执行单元warp,拥有自己的寄存器

1.3 GPU优化原则

1.3.1 访存方式

1) Global memory尽量让一个warp中的线程访问连续的一个内存块,实现级联访问(合并访问)

2) Shared memory尽量减少bank conflict,让同一个warp中的线程访问不同的bank

1.3.2 数据分块

1) Shared memory block:在SM能够支持的情况下,尽量多地利用此资源提高局部重用性

2) Register memory:在shared memory之上可以多加一层寄存器层,进一步提高重用性(寄存器的带宽和延迟都优于共享内存)

1.3.3 限制分支

1) Warp divergence尽量减少分支判断,将同一个分支中的thread尽量放在同一个warp

1.3.4 提高计算密度

1) Instruction throughput一方面提高warp的效率,让warp充分用到function unit,尽量接近理论峰值;另一方面可以降低非运算类的比例,使得指令更多地用于计算

1.4 GPU优化策略

1.4.1级联访存

1) Global memory:将线程组织称为可以一次性访问一个warp中内容的形式

1.4.2 共享内存

2) Shared memory:减少bank conflict来加快对shared memory的访问

1.4.3 重组线程

1) 将各个分支中的线程进行重组,让同一个warp中的线程尽量地走同一个分支

1.4.4 指令流水线

1) 对指令进行分类,分析每一类指令的吞吐量,减少混合指令

1.4.5 指令调度

1) 将长延迟的指令插入到与该指令独立的计算密集点处,使用计算来隐藏延迟(一般为访存造成的延迟)

1.5 GPU优化实现

1.5.1 CGMAcompute to global memory access

1) 计算:浮点数操作/访存操作,能够比较准确地体现kernel的性能,在访存性能一定的时候,通过提高CGMA的值可以使得浮点操作的性能大幅提升(浮点操作的峰值性能远远超过访存的峰值带宽)

2) 例子:CGMA=1.0,则浮点操作的性能最好的时候也就跟访存性能一致,而G80global memory的带宽为86.4GB/s,但是其浮点计算的峰值性能却为367Gflops,这样,性能将被访存速度所约束

1.5.2 减少global memory的流量

1) 将具有局部重用性的数据块加载到每个block中的shared memory中,减少对global memory的频繁访问,提高读取数据的性能

2) 例子:矩阵乘法的分块实现,利用shared memory来存储每一小块所需的数据及结果

1.5.3 存储器的使用需要谨慎

1) 如果每个线程使用得存储器过多,将会直接导致每个SM上可以驻留的线程数减少,造成并行度不足的问题

2) 例子:G80中每个SM8K的寄存器,16Kshared memory,如果每个块分配的shared memory超过了2K,则SM中驻留的块将无法达到全部的8个,降低并行度,寄存器也是同样的道理

1.5.4 Warp divergence的问题

1) 一个warp中的线程存在分支的时候,会造成串行执行不同分支,降低性能,可以通过调整线程执行内容来减少warp中存在的分支,提高性能

2) 例子:tid 2造成了每个warp中都有分支,换成了tid stride后,将直接消除了几乎所有分支

1.5.5 Global memory带宽

1) 由于global memory是有DRAM组成,所以,访问的速度慢,而每次访问将会返回连续的一段数据(硬件设计决定),所以,为了接近峰值,应该坚持每次访问都对连续的单元进行访问(即合并访问)

2) 例子:矩阵的行优先转换成列优先,可以一次性读取连续的单元,提高效率;如果warp访问的是global memory中的连续单元,则该访问将会被合并成一次性访问

1.5.6 SM资源的动态划分(分块大小的策略)

1) GT200中,每个SM最多驻留1024个线程,8个块,可以划分为4*256,也可以划分成8*128,但是后者更能充分地利用线程槽和块槽,效率将会更高

2) 寄存器数目可能造成的性能悬崖:GT200种每个SM8192个寄存器,对于16*16的线程块,如果每个线程用到的寄存器为10个,那么可以容纳3个块,如果每个线程用到的寄存器为11个,则只能容纳2个块,这种情况可能极大地降低并行度,造成性能退化

3) 说明:上面描述的情况也不一定降低性能,如果一个寄存器能够使得独立的浮点操作数大幅提高,那么,就算少了一个块,也能够有充分的warp来隐藏延迟

4) 问题:寄存器溢出是在寄存器不够用的情况下出现的,按照上面的说法,寄存器如果不够用,会减少块的个数来避免这个问题,那么什么时候将会溢出?另一方面,寄存器溢出会造成对local memory的访问,降低性能,但是没有想象中的低,因为Fermi已经为local memory提供了缓冲

1.5.7 数据预取

1) 当所有的线程都在等待存储器访问结果的时候,延迟将没有办法被隐藏,这个时候,可以调整处理过程为:使用当前元素时,预取下一个元素,隐藏延迟(书中观点是:在读取global memoryshared memory中的这个过程中间,插入了独立的计算指令,有效地隐藏延迟)

2) 例子:将原来读取global memoryshared memory的过程拆分成global memoryregister,再从registershared memory,这样,从global memory读取下一块到register的时候,就可以同时计算当前块,隐藏延迟了

1.5.8 混合指令的消除

1) 对于循环,往往混合了多种指令:取址,分支,计数,运算,而指令的混合将会降低执行效率,可以通过消除这种混合来提高指令的执行效率

2) 例子:将循环次数不多的循环体直接展开称为长的表达式,消除指令的混合

1.5.9 线程粒度调整

1) 提高线程的粒度有时候能够降低访存的次数,因为其提高了数据的重用性,当然,期间不可避免.


In a word, latency is the key word of CUDA. How to cover the latency is difficult to all CUDAers.

Learning CUDA is easy while learning it well is difficult.


related URL:

http://tech.it168.com/a2011/0706/1213/000001213855.shtml

http://blog.youkuaiyun.com/ouczoe/article/details/5137063

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值