l 论文一摘要
n 题目:a quantitative performance analysis model for GPU architectures(GPU架构上的一个定量的性能分析模型)
n 摘要:
u 提出了一个吞吐量模型(5-15%错误率),用于衡量三个主要组成部分:指令流水线,共享内存访问,全局内存访问
u 测试的实验例子:稠密矩阵乘法,三对角线性方程组求解(优化60%),稀疏矩阵向量乘(优化18%)
u 展望:对硬件资源分配提出建议,避免bank conflict,块调度,内存传输粒度
n 内容:
u 介绍
l 目前的GPU编程工具中能够用于测试性能的太少,只有ATI的Stream Profile和NVIDIA的Parallel Nsight,只能够测试程序的统计数字,无法跟程序性能联系起来,本文将提出一个小的标准性能测试模型,有助于分析分析性能,给硬件设计者提供建议。
l 使用到的工具:barra simulator(输入:cubin文件,收集GPU相关的统计数据,用于掌握数据依赖的应用,计算动态指令数目)
u GPU架构和编程模型
l GPU分成两个层次:顶层的向量化处理器,底层的具体实现(N卡的SM,A卡的SIMD cores)
l CUDA和OpenCL接口对应一致,NVIDIA的warp和AMD的wavefront,性能模型将对所有的GPU结构都适用(尽管实验用的是N卡)
u 性能建模和分析方法
l 分析传统性能分析的弱点:分成“内存限制/计算限制”两类计算过程,忽略了指令的类型,片上共享内存和bank conflict,可以用“指令吞吐量限制/内存层次限制”代替,将性能分析的层次从模糊的高层(算法,计算量等)降为清晰的底层(指令吞吐量,内存分层等)
l 新模型的组成部分:指令流水线,global memory,shared memory
n 指令:对指令按照执行代价的高低进行分类,然后将一般化的代码在不同数量的warp并行层次上进行测试,估算每一类指令的流水线吞吐量
n Shared memory:对一般化的代码,利用bank conflict信息更正内存事务的数量,然后在一定数量的warp并行层次上利用吞吐量估算时间
n Global memory:使用一个内存事务模拟器来计算硬件层次上的事务数目
n 总过程:Barra生成一个关于指令执行次数的动态程序执行信息,然后使用这个信息来生成每一类动态指令的数目,共享内存事务的数目,全局内存事务的数目,被同步所分开的阶段数目
l 模型的作用
n 能够定量地分析每一种部分性能如何,找出性能瓶颈,检测瓶颈是否消除,新的瓶颈是什么,给出确切的瓶颈原因
n 指令:计算密集度低,高代价的指令,低效的warp并行
n Shared memory:bank conflict,簿记指令引起的内存拥堵,低效的warp并行
n Global memory:并行化隐藏延迟的效率过低,非级联的内存访问和内存事务粒度大
l 数据展示
n 指令分成四类,图形展示每一类随着单个SM中warp数目增长所呈现出的吞吐量变化趋势,图形展示共享内存随着单个SM中warp数目增长所呈现出的带宽变化趋势
u 性能建模过程
l 使用到的工具:decuda(cubin反编译软件)
l 模型的处理过程:内建一个工具来修改原有的二进制指令,将修改后的指令重新编译成二进制代码,最后将修改后的二进制代码嵌入到执行文件中
l 指令流水线:
n 指令的低效来源于warp的低效,warp的低效来源于资源的限制(每个SM):16384 Registers,16KB shared memory,512 threads,8 blocks,32 warps
n 指令的执行峰值取决于该类指令有多少个Function Unit可用,FU可用的越多,则峰值越高(四类指令,峰值可由公式算出)
n 调整block的大小和数目可以决定warp的个数,从而影响指令的吞吐量,FU越多的指令,吞吐饱和所要求的warp数也越高
l Shared memory
n 每个SM有16K的shared memory,其峰值吞吐量可以达到1420GB/s,通过调整SM中warp的数目,能够找出带宽饱和最少需要多少warp(内存流水线更长)
n Bank conflict(4B/bank,16bank/SM):写一个自动程序来导出不同程度bank conflict所对应的有效内存事务数目
l Global memory:与三个因素有关(block个数,block中thread个数,每个thread的内存事务数目),其中每个thread在指令级别的内存事务可能在硬件级别上被分成几个内存事务(由于内存的级联访问规则)
n 内存的级联访问规则:
u 在每个内存事件中,找出(最小线程)被要求的内存段
u 找出其他相关线程(该线程的地址请求也在上述的内存段中)
u 尽可能压缩内存段的大小
u 重复上述过程直到所有同一个half-warp中的线程都被处理过
u 案例研究
l 稠密矩阵乘法(使用volkov Demmel算法)
n 目的:体现性能模型中检测瓶颈的功能,并且对硬件设计提出建议
n 为什么16*16的块大小是最优的
u 32*32在warp数目方面降低了,8*8在shared memory方面降低了
n 为什么性能只能达到峰值的56%
u 指令吞吐只有峰值的80%(有其他控制,取址,内存操作)
n 硬件建议
u 增大每个SM的block插槽,将有更多的并行warp束,达到更好的指令和shared memory吞吐量
u 增加每个SM的register和shared memory,将能够使32*32的情形达到更高的计算密度(warp数目不会因为前面两个因素而降低)
l 三对角线性方程组求解
n 目的:体现了性能模型对于shared memory吞吐量的改进,量化了bank conflict的影响,估算消除bank conflict的潜在收益,提出硬件设计的建议
n 使用了cyclic reduction
u 为了减少bank conflict,使用了padding technique,将shared memory的限制转换成了instruction的限制(更复杂的寻址方式)
u 存在的问题:在warp层次的并行度不足
n 硬件建议
u 将bank数目改为质数,避免bank conflict
u 当一个块使用的线程越来越少的时候,引入一个机制来释放未使用的硬件资源
u 利用以上两个改进,可以增加warp层次的并行度
l 稀疏矩阵向量乘法
n 体现性能模型预估硬件事务数目的能力,小的事件粒度有利于提高性能
n 稀疏矩阵的存储方式和线程的映射方式
u 存储元素以列为主,线程分配元素以行为主,使得连续的线程访问连续的内存
u Straightforward ELL & Interleave ELL(uncoalesced memory access & coalesced memory access)
n SpMV性能的关键因素:
u Global memory access
u Interleaved stored way of vector entry(should be decided by the interleaved stored of the matrix)
u Texture cache:加速
u 总结
l 模型优点:找出GPU程序或者结构上潜在的改进之处,定位瓶颈,提出建议,优化程序
l 模型扩展:考虑内存模型;一般化的bank conflict检测;对同步栅栏的影响进行建模;对指令执行中的不完善重叠,shared memory,global memory进行建模
n 关键点:
u 定位瓶颈,改进程序,提出硬件设计建议
u 对三个主要考虑因素进行建模:instruction pipeline,shared memory,global memory
u 对三个案例进行分析:稠密矩阵乘法,三对角求解,稀疏矩阵向量乘法
u 提出进一步可以拓展的工作
n 能否扩展:
u 对memory model的进一步研究(global memory,texture memory,constant memory,shared memory等)
u 对栅栏同步的影响建模(synchronization barrier),一般化bank conflict的检测
u 对warp数目与block数目还有register数目之间关系的建模
n 疑问:
u 完全没有对warp divergence进行,这样的性能衡量可靠么?如何联系起来?