l GPU硬件特性
n 存储层次
u Global memory:
l 大小一般为几GB
l chip-off的DRAM介质存储器
l 访问速度慢(是shared memory的上百倍)
l 对于是否对齐和连续访问敏感(由DRAM的性质决定)
l 可以被所有的线程访问
u Shared memory:
l 每个SM中一般几十KB
l chip-on的SRAM介质存储器
l 访问速度快(与register相当)
l 对于是否对其和连续访问不敏感,但是对bank conflict敏感(由bank设计决定)
l 只对自身block中的线程可见
u Register
l 每个SM中一般为几千个(约30K)
l Chip-on的寄存器
l 访问速度最快
l 只对每个thread本身可见
u Other
l Local memory
n 每个线程有512KB(计算能力2.x),或者16KB(计算能力1.x)
n Chip-off的存储器,与global memory类似
n 访问速度慢(与global memory类似)
n 由编译器控制,存放寄存器溢出的自动变量
n 只对每个thread本身可见
l Texture memory
n 大小为6-8KB
l Constant memory
n 大小为64KB
n 执行层次
u 逻辑
l Grid:由block构成,维数及维度可以设置,所有的block在Grid中并行执行
l Block:由thread够层,维数及维度可以设置,同一个block中的thread并行执行
l Thread:由threadId识别,每个thread有自己的寄存器,私有变量,共享同一个block中的shared memory
u 物理
l SM:由多个流处理器组成,每个SM有独立的资源,包括:block槽,warp槽,thread槽,shared memory,register
l Warp:由32个thread组成,每次执行的时候,32个thread动作一致,如果有分支,则串行执行
l Thread:物理上属于warp,与其他thread一同,组成最小的执行单元warp,拥有自己的寄存器
l GPU优化原则
n 访存方式
u Global memory:尽量让一个warp中的线程访问连续的一个内存块,实现级联访问(合并访问)
u Shared memory:尽量减少bank conflict,让同一个warp中的线程访问不同的bank
n 数据分块
u Shared memory block:在SM能够支持的情况下,尽量多地利用此资源提高局部重用性
u Register memory:在shared memory之上可以多加一层寄存器层,进一步提高重用性(寄存器的带宽和延迟都优于共享内存)
n 限制分支
u Warp divergence:尽量减少分支判断,将同一个分支中的thread尽量放在同一个warp中
n 提高计算密度
u Instruction throughput:一方面提高warp的效率,让