[论文笔记][GPU Modeling] PPT-GPU: Scalable GPU Performance Modeling

今天分享的这篇Paper来自Los Alamos National Laboratory(LANL), Los Alamos国家实验室的项目, 他们提出了新的GPU model, 也是开源项目, PPT-GPU (Performance Prediction Toolkit) GPU model. 预测误差在10%以内, 可扩展, 比GPGPU-Sim快450倍, 而且更精确.

Background

GPU 一开始是用来渲染图片的, 然后逐渐发展为强力的co-processor来做复杂计算. 因此, 大家对GPU model就有了迫切需求, 需要它来评估各种应用下的性能, 各种GPU 架构下的性能. 但是因为架构太复杂, modeling和predicting runtime 都变得很难, 也被研究了很长一段时间.
在期间, 有人提出analytical途径的model. 优点在于速度快, 但是准确性不高. 另外, 大家广泛接受的是cycle-accurate simulators, 主要因为对这种建模方式的认可并且使用简单. 比如GPGPU-Sim 就是个标准cycle-accurate simulator. 这种simulator通常更加精确, 但是仿真速度慢, 数据量有限制.
本文提出的PPT-GPU是为了解决上述困难, 它是个可扩展, 准确的性能预测GPU框架. PPT-GPU属于analytical 和 cycle-accurate 的混合模型, 能针对各种GPU架构和workloads预测runtime behavior. 它能处理大很多的dataset(不用牺牲准确度, 扩展性和模拟速度). 对于源码, 我们(指作者团队, 下同)把计算类的workload都分成更小的并行sub-workload, 这些sub-workload可以同时在SM上运行, 我们通过预测sub-workload在一个SM上的runtime 来获取整个workload的performance.
PPT-GPU是开源项目(PPT)的一部分, [G. Chennupati et al., Performance Prediction Toolkit(PPT), Los Alamos National Laboratory (LANL), 2017,
https://github.com/lanl/PPT.] PPT已经把硬件和中间件建模成了带参数的模型, 可以直接吃source code, 预测runtime. PPT需要靠Simian, Simian 是个并行离散事件仿真引擎. [N. Santhi et al., “The simian concept: Parallel discrete event simulationwith interpreted languages and just-in-time compilation,” in 2015 Winter Sim Conf., 2015.]

之前用PPT概念提出的旧GPU model预测的runtime忽略了一些现代GPU里常用的东西, 所以结果不准确. 本次为了提升旧model的表现, 考虑了以下因素:

  1. 现代GPU的各种memory hierarchies
  2. GPU指令的latency, 这些指令的latency仅与指令本身和GPU family有关.
  3. 与真实GPU和GPGPU-Sim验证, 使用一组10个kernel 的RODINIA, Parboil benchmark
    结果显示新的PPT-GPU 大幅提升了准确性, 而且还可扩展.
    这个model 假设global memory instruction 绕过L1, L2 cache, 从memory 取data. 由于考虑到cache也会很大程度影响性能, 我们也展示出增加L2 cache带来的影响(准确性方面). 如果说要建个预测L1/L2cache性能的模型那就超过本文范畴了, 不过正在进行中. 对于L2cache, 我们用了NVDIA Visual Profiler tool来预测L2 cache hit rate, 然后把结果输入到PPT-GPU里, 这样的话我们能控制L2的影响, 使预测结果不会偏离的太多.

GPU Architecture

通常一块GPU包括一些SM(streaming multiprocessors), 每个SM可以认为是一个单独的处理器. 再说仔细点, 每个SM有自己的指令buffer, scheduler, 和dispatch单元. 而且, 每个SM有一些计算资源处理算术运算. 所有SM都共用一个芯片之外的global memory. 但太经常访问global memory 会造成性能下降, 因为延迟太大. 然后架构师们就提出了on-chip L1 & L2 cache. 一般一个SM有一个L1 cache, 所有SM共用一个L2cache. 除此之外每个SM还有共有shared memory里的一小部分以便线程交互.
以CUDA的术语来说, 所有thread都由同一个kernel产生, 组成一个grid, 这些grid使用同一个global memory. grid是由很多thread block组成的, 每个block是由多个group(32 thread)组成的, 这个group也叫做warp. Grid 和 block 属于一种CUDA kernel里的logic view. warp采用SIMD方式, 意思是所有thread(同一个warp里的)任何时候都执行同一个指令, 这也是为了使并行效率达到最高. 每个SM都包含一些warp schedulers, 它们的作用是把单个或多个指令派给指定warp. CUDA的程序员有一些额外的优化性能的手段: 可以查看grid/block的数量对某个app的影响.

PPT-GPU

在PPT-GPU model里, 预测runtime被分为两步来做: 1. Static Pre-Characterization, 这时 PPT-GPU 和app源码交互得到tasklist(与architecture无关). 2. Prediction Model, 一个带参数的GPU model 预测这个tasklist下的runtime.
在这里插入图片描述

STATIC PRE-CHARACTERIZATION

(笔者称之为)预特征化阶段, 不需要运行app在真实的GPU上, 就可以静态的完成这个过程. 其过程是这样: 先让app的中间表示和 Parallel Thread Execution (PTX) 作为输入, 因为PTX是个独立于机器的ISA, 它把application转变为对应的PTX, 不管有多少种GPU架构, PTX也只需做一次.
然后这个PTX文件被自动解析为tasklist(针对每个kernel). 这个tasklist 就是PPT-GPU与application互动的方式, 因为它代表了code的序列. 选择这种简单的表示形式是因为它与架构无关. 下表显示了tasklist里PTX和tasklist一对一的对应情况.
在这里插入图片描述
tasklist里的一行内容代表了一个ALU指令或者是个memory指令. ALU指令(比如add, sub, mul等) 被表示为iALU或fALU, 取决于是针对整数还是浮点数. 这一行内容被派给一个SP unit (双精度操作除外), 然后被派给一个DP unit. 如果这个指令是特殊功能指令(比如cosine, sqrt等), 那么在tasklist里标记成SFU. memory指令是这么表示的: 被访问的memory类型(global, local, texture, shared, constant) 加上访问类型(read, write). 如果后一条指令和之前某条指令有相关性, 那么之前那条指令需要写上数据ready需要的时间. 如果两条或以上的连续指令互相独立, 那第二条就可以在第一条完成之前被派发出去. 打个比方, 上表第三条指令需要第一第二条指令的结果, 所以不能提前issue. 但是第二条指令和第一条没有相关性, 因此可以提前issue. 在GPU里指令派发是打包成warp, 因此同一时间可以派发多条指令(互相独立的).
由于不同的ALU指令需要的cycle数不一样, 所以要在tasklist里加上各个指令的latency. 其实所有PTX ISA在建模时都附上了对应的latency. 下图是各个指令的latency的例子.
在这里插入图片描述
这张表里的latency之后就会在计算时被用到, 比如说, table1里的程序, 如果跑在Maxwell GPU上, 第一个ALU操作(add整数)需要6个cycle来完成, 第二个mul(整数)的指令需要13个cycle.

Prediction Model

我们把grid/block size作为vector size的函数 (grid/block size = f(vector size)), PPT-GPU 会计算出一个SM里能并行run的最大block数, 也会计算出分配给每个block的warp数. 根据GPU architecture的不同, CUDA其实会限制并行block和warp的数量, 但是这个限制太理想了, 实际上这个数量取决于launch configuration, 和空闲资源情况(比如 共享memory size, reg数量, thread个数等). 最终一整个workload被切成并行的sub-workload. 所以我们只需预测一个sub-workload的runtime, 预测的时候, tasklist里的instruction被派发到某个warp, 然后一个warp以此只能issue一条tasklist的指令. 然后, 我们使用并行和调度时间的技术处理warp的指令. 计算资源收到各种请求, 来并行处理这些指令, 如果计算资源不能接受新指令了, 那这条指令就会等待直到某个计算资源重新开始接受, 然后这条指令的latency就是占用resource的时间.
memory的操作也是每个warp派发, 为简化处理, 假设一个warp里的所有memory访问都是串行的, 对齐的(多个warp同时), 也叫coalesced. 而且还要假设load/store访问是绕过L1/L2的, 是个最差情况. 然后根据配置文件里的很多因素计算出memory访问的时间, 比如memory ports数量, bandwidth等. 由于cache的影响很大, 我们用oracle来预测L2 hit rate, 然后喂给model, 然后用这个hit rate计算出average memory access time(AMAT), 所有指令要访问memory都要用到这个AMAT.
PPT-GPU并没有考虑branch分支, 因此我们让nvcc编译器通过插入固定判断指令来优化内核里的短条件分支. 对于长条件分支, 我们就假设最差情况, 即两条路径都分析, 并加入到tasklist中, 然后被不同的warp执行.

Prediction Result

实验中使用了GeForce GTX TITAN X 和 Tesla K40m 显卡. 我们收集了这两张卡的spec: 如下图
在这里插入图片描述
为了和别的simulator比较, 我们把TITAN X的配置加入了GPGPU-Sim里, Version 3.2.2. 因为本来GPGPU-Sim只能model Fermi GPU. Hall能让GPGPU-Sim适配新的GPU架构, 使用类似的配置. [P. Hall, ”Adaptation of a GPU simulator for modern architectures”, 2016, mSc. Thesis. [Online]. Available: https://lib.dr.iastate.edu/etd/15712]

application是从RODINIA和Parboil 这两个benchmark组来的, 下表详细列出了使用到的benchmark.
P指 Parboil, R指RODINIA在这里插入图片描述
我们配置了其中的kernel, 让它只跑一次, 如果有多个kernel, 我们就分别report. 我们使用的dataset是从benchmark里自带的, 如果有多种size, 总使用最大的.
Performance是用IPC(number of instriction per cycle) 来表示的. 为了验证PPT-GPU和真实GPU的差距, 我们用了NVIDIA Visual Profiler tool. 跑了十遍application, 然后取中值. 我们把L1关了, 只用L2, 得出了一次结果, 然后L1, L2 都打开, 得出一次结果.
下图就是TITAN X GPU预测结果.
在这里插入图片描述
以仅开L2的真实GPU作为1. 可以发现L1的影响其实很小, 而且跟app有关. 上图表明, PPT-GPU的表现要比GPGPU-Sim好, 也比old circa 2015 model好. 也说明了对memory system建模, 并考虑指令latency对于提升预测表现效果很好, 几乎接近真实测量了. 比如, old model 高估了HOTSPOT, PATHFINDER 和 GAUSSIAN, 因为没有对各种指令的latency建模.

加入了L2 hit rate 之后, PPT-GPU 的预测结果进一步提升. 平均看来, 误差在10%以内. 而且比GPGPU-Sim精度更高, 扩展性更好. 上图的线表示PPT-GPU比GPGPU-Sim 在仿真时间上快多少倍(右边y轴), 对于SGEMM和 NN, PPT-GPU就快了29倍, 对于HOTSPOT和LUD, PPT-GPU快了450倍, 在所有的10个benchmark里, PPT-GPU 平均快了160倍.

在这里插入图片描述
上图是Tesla K40m GPU的结果, 说明PPT-GPU的预测结果也在容忍范围内.

Related work

Lee 等人提出了COMPASS model, 这是个参数化的performance model, 需要静态分析源码. 虽然PPT-GPU也是这样, 但是PPT-GPU 对GPU的各个部分建模而不牺牲易用性, 精确性, 扩展性
S. Lee et al., “Compass: A framework for automated performance modeling and prediction,” in ICS, 2015.
COMPASS model 依赖于 Aspen :
K. L. Spafford and J. S. Vetter, “Aspen: A domain specific language for performance modeling,” in SC, 2012.

Conclusion

本文提出了一种快速可扩展的GPU性能预测框架: PPT-GPU, PPT-GPU是一个全参数化的工具, 依靠PTX ISA 和GPU配置来预测app的runtime, 不用真正的去run. 我们用了RODINIA和Parboil benchmark来验证PPT-GPU和真实GPU, GPGPU-Sim的差别. 结果显示, PPT-GPU和真实GPU只有10%误差. 总之, PPT-GPU预测结果精确, 高度可扩展性, 速度很快.
目前正在对GPU caches建模, 而且也要考虑对branch, power consumption 建模, 并且要使用更多最近的GPU来测试, 然后把PPT-GPU整合进普通PPT, 以便model CPU-GPU交互.

读后评语

  1. 本文的建模方式中规中矩, 符合一般认知, 先把code抽出来做instruction + latency, 然后用GPU model预测runtime. 视野很广阔, 站的很高, 学术水平很高, 还把源码开源了, 一定拜读.
  2. 其实存在的问题作者最后也说了, 并且在改进中, 一是没有考虑cache建模, 二是对branch的处理不够好, 三是没有验证扩展性, 测试数据不够.
  3. 看了模型预测的结果, 觉得oracle这个模型的精度反而更高些, 个人认为PPT-GPU模型的准确性还有进一步提升的空间.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值