学术阅读 – SAGE笔记

1. Introduction

本文总结了Sage: Self-tuning approximation for graphics engines一文的主要观点,记录部分自己的思考。

作者是密歇根大学Mehrzad Samadi,发表在MICRO 2013上。

SAGE主要实现自动生成多种近似级别CUDA kernel函数的编译器,并在运行时选择可行的kernel函数来达到用户设定的目标输出质量(Target output quality, TOQ)。

它使用了三种优化技术:

  1. selective discarding of atomic operations
  2. data packing
  3. thread fusion

SAGE达到了10%以内的质量损失内2.5x加速。

2. 研究背景

GPU的瓶颈:

  • 串行化的高代价
  • 内存带宽限制
  • 线程数量过多导致的性能下降

2.1 子操作的串行化(冲突)对性能有巨大的影响

比如NVIDIA SDK的Histogram应用。

2.2 有效利用带宽很重要

优化global memory的带宽利用率非常重要。SAGE打包了输入的元素来减少memory accesses。

2.3 随着线程数量增多,对性能的影响程度逐渐下降

 

3. SAGE设计

离线编译和运行时的Kernel管理。离线编译时,产生多个不同近似程度的kernel函数,而运行时则使用贪婪算法调整近似kernel函数的参数,同时,SAGE也会定期检查output的质量和性能来配置不同的kernel参数。

3.1 离线编译

利用下面的三种方法产生不同近似级别的kernel函数,每个方法都有不同级别的优化参数。

3.1.1针对atomic operation的优化

选择性的跳过部分造成频繁的冲突和性能降低的atomic操作。

SAGE会查找所有input kernel里的循环内的原子操作并对他们进行分类。它追踪控制和数据依赖图,检查是否有分支依赖这个数组,如果有,则不进行优化。同时还运行了个watch dog防止产生死循环。

预处理操作来预测在下次调用这个kernel时访问次数可能最多的地址。SAGE用了MCUDA将CUDA代码转换成C代码,在CPU上进行profile。

生成两种近似激进程度不同的kernel。

3.1.2 data packing

减少需要放在输入数组里数据的位数。打包只读的数据并存储到global memory,每个线程要获取这个数据之前,需要先unpack。这个优化更针对迭代应用(每次迭代读相同的数组),大多数机器学习应用都符合这个特点。在unpack之后的所有计算都是全精确度的。当然memory access pattern需要编译阶段可知的才适用这个方法。可能会出现除0的错误,但是GPU不会报错,而是会返回一个很大的数。

它首先将输入的矩阵数据标准化到[0,1)上去,

sage把float的有效位数从16到2划分多个不同程度的等级近似。

3.1.3 Thread fusion

默认的假设是相邻线程的输出是相似的。

合并相邻线程的计算,并复制其输出到合并的部分结果上去来减少线程的数量。适用于没有使用shared memory的kernel函数。

减少Kernel的blocks数量,增加单独的fuses blocks来copy data from active threads to inactive threads。

实际上和perforation目的一致,减少线程数量。

3.2 运行时kernel管理

包括三个部分:tuning、preprocessing和optimization calibration。

3.2.1 Tuning

pass

3.2.2 Preprocessing

对于原子操作的优化,preprocessor预测输入数据会产生多少冲突。这个操作在CPU上运行,以便和GPU并行起来

3.2.3 optimization calibration

每N次Kernel的迭代,就运行原始和近似Kernel来检查output的quality和性能。如果达不到TOQ,则降低近似程度。

4. 方法

SAGE的编译阶段利用Centus compiler实现。Output Quality利用现有的标准比如图片的PSNR or MSE。而Loop perforation,正常的是dropping Nth results 会造成divergence,因此他们使用的是drop last N iterations

文章版权归 FindHao 所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明作者 FindHao 和本文原始地址:
https://www.findhao.net/easycoding/2314

你可能喜欢:

Find

新浪微博(FindHaoX86)QQ群:不安分的Coder(375670127)不安分的Coder 微信公众号(findhao-net)

发表评论

电子邮件地址不会被公开。 必填项已用*标注