论文阅读笔记1

论文一摘要

题目:a quantitative performance analysis model for GPU architecturesGPU架构上的一个定量的性能分析模型)

摘要:

提出了一个吞吐量模型(5-15%错误率),用于衡量三个主要组成部分:指令流水线,共享内存访问,全局内存访问

测试的实验例子:稠密矩阵乘法,三对角线性方程组求解(优化60%),稀疏矩阵向量乘(优化18%

展望:对硬件资源分配提出建议,避免bank conflict,块调度,内存传输粒度

内容:

介绍

目前的GPU编程工具中能够用于测试性能的太少,只有ATIStream ProfileNVIDIAParallel Nsight,只能够测试程序的统计数字,无法跟程序性能联系起来,本文将提出一个小的标准性能测试模型,有助于分析分析性能,给硬件设计者提供建议。

使用到的工具:barra simulator(输入:cubin文件,收集GPU相关的统计数据,用于掌握数据依赖的应用,计算动态指令数目)

GPU架构和编程模型

GPU分成两个层次:顶层的向量化处理器,底层的具体实现(N卡的SMA卡的SIMD cores

CUDAOpenCL接口对应一致,NVIDIAwarpAMDwavefront,性能模型将对所有的GPU结构都适用(尽管实验用的是N卡)

性能建模和分析方法

分析传统性能分析的弱点:分成“内存限制/计算限制”两类计算过程,忽略了指令的类型,片上共享内存和bank conflict,可以用“指令吞吐量限制/内存层次限制”代替,将性能分析的层次从模糊的高层(算法,计算量等)降为清晰的底层(指令吞吐量,内存分层等)

新模型的组成部分:指令流水线,global memoryshared memory

指令:对指令按照执行代价的高低进行分类,然后将一般化的代码在不同数量的warp并行层次上进行测试,估算每一类指令的流水线吞吐量

Shared memory:对一般化的代码,利用bank conflict信息更正内存事务的数量,然后在一定数量的warp并行层次上利用吞吐量估算时间

Global memory:使用一个内存事务模拟器来计算硬件层次上的事务数目

总过程:Barra生成一个关于指令执行次数的动态程序执行信息,然后使用这个信息来生成每一类动态指令的数目,共享内存事务的数目,全局内存事务的数目,被同步所分开的阶段数目

模型的作用

能够定量地分析每一种部分性能如何,找出性能瓶颈,检测瓶颈是否消除,新的瓶颈是什么,给出确切的瓶颈原因

指令:计算密集度低,高代价的指令,低效的warp并行

Shared memorybank conflict,簿记指令引起的内存拥堵,低效的warp并行

Global memory:并行化隐藏延迟的效率过低,非级联的内存访问和内存事务粒度大

数据展示

指令分成四类,图形展示每一类随着单个SMwarp数目增长所呈现出的吞吐量变化趋势,图形展示共享内存随着单个SMwarp数目增长所呈现出的带宽变化趋势

性能建模过程

使用到的工具:decudacubin反编译软件)

模型的处理过程:内建一个工具来修改原有的二进制指令,将修改后的指令重新编译成二进制代码,最后将修改后的二进制代码嵌入到执行文件中

指令流水线:

指令的低效来源于warp的低效,warp的低效来源于资源的限制(每个SM):16384 Registers16KB shared memory512 threads8 blocks32 warps

指令的执行峰值取决于该类指令有多少个Function Unit可用,FU可用的越多,则峰值越高(四类指令,峰值可由公式算出)

调整block的大小和数目可以决定warp的个数,从而影响指令的吞吐量,FU越多的指令,吞吐饱和所要求的warp数也越高

Shared memory

每个SM16Kshared memory,其峰值吞吐量可以达到1420GB/s,通过调整SMwarp的数目,能够找出带宽饱和最少需要多少warp(内存流水线更长)

Bank conflict4B/bank16bank/SM):写一个自动程序来导出不同程度bank conflict所对应的有效内存事务数目

Global memory:与三个因素有关(block个数,blockthread个数,每个thread的内存事务数目),其中每个thread在指令级别的内存事务可能在硬件级别上被分成几个内存事务(由于内存的级联访问规则)

内存的级联访问规则:

在每个内存事件中,找出(最小线程)被要求的内存段

找出其他相关线程(该线程的地址请求也在上述的内存段中)

尽可能压缩内存段的大小

重复上述过程直到所有同一个half-warp中的线程都被处理过

案例研究

稠密矩阵乘法(使用volkov Demmel算法)

目的:体现性能模型中检测瓶颈的功能,并且对硬件设计提出建议

为什么16*16的块大小是最优的

32*32warp数目方面降低了,8*8shared memory方面降低了

为什么性能只能达到峰值的56%

指令吞吐只有峰值的80%(有其他控制,取址,内存操作)

硬件建议

增大每个SMblock插槽,将有更多的并行warp束,达到更好的指令和shared memory吞吐量

增加每个SMregistershared memory,将能够使32*32的情形达到更高的计算密度(warp数目不会因为前面两个因素而降低)

三对角线性方程组求解

目的:体现了性能模型对于shared memory吞吐量的改进,量化了bank conflict的影响,估算消除bank conflict的潜在收益,提出硬件设计的建议

使用了cyclic reduction

为了减少bank conflict,使用了padding technique,将shared memory的限制转换成了instruction的限制(更复杂的寻址方式)

存在的问题:在warp层次的并行度不足

硬件建议

bank数目改为质数,避免bank conflict

当一个块使用的线程越来越少的时候,引入一个机制来释放未使用的硬件资源

利用以上两个改进,可以增加warp层次的并行度

稀疏矩阵向量乘法

体现性能模型预估硬件事务数目的能力,小的事件粒度有利于提高性能

稀疏矩阵的存储方式和线程的映射方式

存储元素以列为主,线程分配元素以行为主,使得连续的线程访问连续的内存

Straightforward ELL & Interleave ELLuncoalesced memory access & coalesced memory access

SpMV性能的关键因素:

Global memory access

Interleaved stored way of vector entryshould be decided by the interleaved stored of the matrix

Texture cache:加速

总结

模型优点:找出GPU程序或者结构上潜在的改进之处,定位瓶颈,提出建议,优化程序

模型扩展:考虑内存模型;一般化的bank conflict检测;对同步栅栏的影响进行建模;对指令执行中的不完善重叠,shared memoryglobal memory进行建模

关键点:

定位瓶颈,改进程序,提出硬件设计建议

对三个主要考虑因素进行建模:instruction pipelineshared memoryglobal memory

对三个案例进行分析:稠密矩阵乘法,三对角求解,稀疏矩阵向量乘法

提出进一步可以拓展的工作

能否扩展:

memory model的进一步研究(global memorytexture memoryconstant memoryshared memory等)

对栅栏同步的影响建模(synchronization barrier,一般化bank conflict的检测

warp数目与block数目还有register数目之间关系的建模

疑问:

完全没有对warp divergence进行,这样的性能衡量可靠么?如何联系起来?

你可能感兴趣的:(CUDA)