论文阅读笔记2

来源:互联网 发布:mysql数据库被攻击 编辑:程序博客网 时间:2024/06/11 17:09

论文二摘要

题目:An Accurate GPU Performance Model for Effective Control Flow Divergence Optimization

摘要:

指出GPU的执行特点:大批量线程,SIMD执行模式,divergence的不良影响

论文工作内容:提出一个简单而准确的衡量标准,用于估算以计算为主的GPU kernel的性能;对不同的线程重组算法,这个标准表现为一个值函数;通过对一个实际的GPU进行了测试,证实了所提出的标准与实际的表现是一致的;最后,通过使用这个标准对线程重组进行指导,可以是的性能提升到3.19

内容:

介绍

Flow divergence的问题:SIMD情况下一个指令被一个warp执行可能只需要一个时钟,也可能需要32个时钟,相差很大

Flow divergence的解决技术:hardwaresoftware

Hardware方面:regrouping threadsdynamic warp sub-division

Software方面:thread reorganization

解决方向:

减少flow divergence对性能的影响(表现为最小化没有用到计算资源的那些时钟周期)

本文为减少flow divergence影响作出的工作

提出一个标准

证实标准在预测方面的正确性

对标准的组成机器影响进行系统的探索,说明对组成进行单独测评的重要性

Flow divergence控制问题

CUDA编程模型和flow divergence控制CUDA的编程模型要求每个block中的线程按照warp为单位进行SIMD操作,这样可能造成divergence,此时可以使用重组的方式将同一个分支的线程组成一个warp,另一个分支的线程组成另一个warp,达到消除divergence的目的;对于哪些divergence才是影响最大的,需要精确地找出来,但是查找过程消耗交大,需要平衡。

Flow divergence控制淘汰机制

Reference redirection:将tid映射为ntid,线程执行的时候同一个warp的线程将进入同一个分支

Data layout transformation:将数据在进入GPU之前重新安排,保证同一个warp自然对其到同一个分支的数据(本文尽量使用这个技术)

Flow divergence控制淘汰机制的局限性:重组线程可能导致同步失效,破坏线程之间的依赖,从而使得kernel功能丧失,本文使用的是CPU/GPU处理上的流水线来掩盖数据重排的延迟

性能建模

介绍两个常用的metricsdivergent branchesdivergent warps ratio,前者记录每个warp中的分支数,后者记录存在分支的warp数目占总warp数目的百分比

考虑三种代表性的类型:BBVbasic block vector),EVedge vector),PVpath vector),其精确性递增

本文选择了BBV作为标准的基础

找出每个basic block中执行次数最多的thread,记录其次数,将所有的次数加起来作为metric,可以衡量一个warp中的basic block的执行次数,但是无法对执行次数相同的basic block进行区分

增加了每个basic block执行的指令数目,乘上上一个式子中的次数,再执行加法,可以衡量更为精细的线程性能

融入了block的动态调度,最终形成的标准为:BBV-weighted-scheduled,测试的结果说明了不同的线程组成的操作之间的性能差别

选取的metric和真实的性能之间有一些差异,本文讨论的时候忽略这些差异

Flow divergence控制优

优化框架

程序控制流程分析

线程重组分析

核函数代码修改

重组算法

简单排序算法:简单排序,按照顺序连续分组

贪婪算法:迭代计算两个group合并的收益,合并最大收益的group直到生成Kgroup

K-均值聚集算法:迭代计算线程之间的距离,将相互之间距离最近的线程聚集成一个group直到没有次过程没有产生变化为止

试验

度量精度:BBV-Weighted(几乎与BBV-Weighted-Scheduled一样)更精确

重组算法比较:sorting&greedy K-mean存储为主的banchmarks;设置阈值,提高不明显的不用重组

访存为主的标准测试:无法使用现有的标准准确地预测出来,留待进一步提出模型

总结和展望

本文给出了一个控制流程分支的标准,能精确地对计算为主的GPU kernel中分支对性能造成的影响进行衡量

使用这个标准之后,用户可以不用真正地进行转换就能够准确预测优化所带来的潜在性能提升

本文提出了三个线程重组算法,并且使用一个值函数来衡量性能的提升

对于访存为主的kernel,这些标准并不适用

关键点:

提出衡量的候选标准:BBVEVPV,其敏感程度递增,负责程度也递增,本文使用BBV标准

BBV的收集,每个thread的执行BBV的次数的收集,每个BBV执行指令的个数

改进的方式:线程重组,数据转换(优先数据转换,其次使用线程重组)

提出了衡量重组收益的函数,预测潜在的性能提升程度

能否扩展:

可以考虑EV的实现(BBV的实现很简单),稍复杂,但是更加精确,只是效果不一定比BBV

拓展到对访存为主的kernel进行性能建模

疑问:

本文中表达的是优先考虑data transformation,但是提出的三种算法都是thread regrouping的,其中的联系在哪里?

原创粉丝点击