l 论文二摘要
n 题目:An Accurate GPU Performance Model for Effective Control Flow Divergence Optimization
n 摘要:
u 指出GPU的执行特点:大批量线程,SIMD执行模式,divergence的不良影响
u 论文工作内容:提出一个简单而准确的衡量标准,用于估算以计算为主的GPU kernel的性能;对不同的线程重组算法,这个标准表现为一个值函数;通过对一个实际的GPU进行了测试,证实了所提出的标准与实际的表现是一致的;最后,通过使用这个标准对线程重组进行指导,可以是的性能提升到3.19倍
n 内容:
u 介绍
l Flow divergence的问题:SIMD情况下一个指令被一个warp执行可能只需要一个时钟,也可能需要32个时钟,相差很大
l Flow divergence的解决技术:hardware和software
n Hardware方面:regrouping threads和dynamic warp sub-division
n Software方面:thread reorganization
l 解决方向:
n 减少flow divergence对性能的影响(表现为最小化没有用到计算资源的那些时钟周期)
l 本文为减少flow divergence影响作出的工作
n 提出一个标准
n 证实标准在预测方面的正确性
n 对标准的组成机器影响进行系统的探索,说明对组成进行单独测评的重要性
u Flow divergence控制问题
l CUDA编程模型和flow divergence控制:CUDA的编程模型要求每个block中的线程按照warp为单位进行SIMD操作,这样可能造成divergence,此时可以使用重组的方式将同一个分支的线程组成一个warp,另一个分支的线程组成另一个warp,达到消除divergence的目的;对于哪些divergence才是影响最大的,需要精确地找出来,但是查找过程消耗交大,需要平衡。
l Flow divergence控制淘汰机制
n Reference redirection:将tid映射为ntid,线程执行的时候同一个warp的线程将进入同一个分支
n Data layout transformation:将数据在进入GPU之前重新安排,保证同一个warp自然对其到同一个分支的数据(本文尽量使用这个技术)
l Flow divergence控制淘汰机制的局限性:重组线程可能导致同步失效,破坏线程之间的依赖,从而使得kernel功能丧失,本文使用的是CPU/GPU处理上的流水线来掩盖数据重排的延迟
u 性能建模
l 介绍两个常用的metrics:divergent branches和divergent warps ratio,前者记录每个warp中的分支数,后者记录存在分支的warp数目占总warp数目的百分比
l 考虑三种代表性的类型:BBV(basic block vector),EV(edge vector),PV(path vector),其精确性递增
l 本文选择了BBV作为标准的基础
n 找出每个basic block中执行次数最多的thread,记录其次数,将所有的次数加起来作为metric,可以衡量一个warp中的basic block的执行次数,但是无法对执行次数相同的basic block进行区分
n 增加了每个basic block执行的指令数目,乘上上一个式子中的次数,再执行加法,可以衡量更为精细的线程性能
n 融入了block的动态调度,最终形成的标准为:BBV-weighted-scheduled,测试的结果说明了不同的线程组成的操作之间的性能差别
n 选取的metric和真实的性能之间有一些差异,本文讨论的时候忽略这些差异
u Flow divergence控制优化
l 优化框架
n 程序控制流程分析
n 线程重组分析
n 核函数代码修改
l 重组算法
n 简单排序算法:简单排序,按照顺序连续分组
n 贪婪算法:迭代计算两个group合并的收益,合并最大收益的group直到生成K个group
n K-均值聚集算法:迭代计算线程之间的距离,将相互之间距离最近的线程聚集成一个group直到没有次过程没有产生变化为止
u 试验
l 度量精度:BBV-Weighted(几乎与BBV-Weighted-Scheduled一样)更精确
l 重组算法比较:sorting&greedy > K-mean存储为主的banchmarks;设置阈值,提高不明显的不用重组
l 访存为主的标准测试:无法使用现有的标准准确地预测出来,留待进一步提出模型
u 总结和展望
l 本文给出了一个控制流程分支的标准,能精确地对计算为主的GPU kernel中分支对性能造成的影响进行衡量
l 使用这个标准之后,用户可以不用真正地进行转换就能够准确预测优化所带来的潜在性能提升
l 本文提出了三个线程重组算法,并且使用一个值函数来衡量性能的提升
l 对于访存为主的kernel,这些标准并不适用
n 关键点:
u 提出衡量的候选标准:BBV,EV,PV,其敏感程度递增,负责程度也递增,本文使用BBV标准
u BBV的收集,每个thread的执行BBV的次数的收集,每个BBV执行指令的个数
u 改进的方式:线程重组,数据转换(优先数据转换,其次使用线程重组)
u 提出了衡量重组收益的函数,预测潜在的性能提升程度
n 能否扩展:
u 可以考虑EV的实现(BBV的实现很简单),稍复杂,但是更加精确,只是效果不一定比BBV好
u 拓展到对访存为主的kernel进行性能建模
n 疑问:
u 本文中表达的是优先考虑data transformation,但是提出的三种算法都是thread regrouping的,其中的联系在哪里?