Page 333 - 《软件学报》2020年第9期
P. 333
2954 Journal of Software 软件学报 Vol.31, No.9, September 2020
元素的列号被单独存储在一个数组 colIdx 中,同时,每一行对应的非 0 元素在 values 数组中的起始位置被记录
在数组 rowPtr 中.公式(2)计算了采用 CSR 格式时,位置信息占用的空间 S location :
S location =S colIdx +S rowPtr =K×C×R×S×(1−p)×sizeof(T colIdx )+(m+1)×sizeof(S rowPtr ) (2)
其中,m 表示稀疏矩阵的行数,具体取值取决于将 Weight 展开成矩阵的方式.非 0 元素取值所占空间 S value 可用公
式(3)计算:
S value =K×C×R×S×(1−p)×sizeof(T value ) (3)
为了衡量位置信息所占用空间的比重,我们计算 S location 与 S value 的比值,如公式(4)所示:
1) sizeof
S sizeof (T ) (m +× (T )
location = colIdx + rowPtr (4)
−
×× ×
S sizeof (T ) K C R S × (1 p × (T )
) sizeof
value value value
第 1 项取决于存储非 0 元素列号与存储非 0 元素取值所使用的数据类型.在实际的神经网络模型中,稀疏
矩阵的列的宽度可能超过 256,所以非 0 元素列号至少需要 16 比特才能表示.对于每行的起始位置,其类型取决
于整个矩阵中非 0 元素的数目,即(1−p)×K×C×R×S,一般也至少需要 16 比特表示.对于非 0 元素的取值,我们一般
使用 32 比特单精度浮点数表示,则公式(4)中的第 1 项取值至少为 0.5.因此,与非 0 元素取值所占用的空间相比,
位置信息所占用的空间至少会超出其一半的大小.而在当前 GPU 上的稀疏计算库 [23] 中,这一项的值为 1.因此,
非零元素位置信息所占用的空间是不能忽略的.在文献[25,26]中也提到了存储稀疏模型时,位置信息会带来额
外的开销,并对性能造成负面影响.
我们生成的稀疏算子程序能够避免位置信息的访存开销.由于在编译时我们展开了与模型参数相关的循
环,并在稀疏代码生成阶段将真实的稀疏模型参数取值编码到了指令中,在生成的代码中,每个参数已经按照自
己的位置与对应的输入数据进行计算,所以生成的稀疏程序不再需要额外的位置信息,避免了程序运行时对位
置信息的访问,降低了访存需求.
3 实验分析
在本节中,我们希望通过实验回答与本文所提出的稀疏感知的代码生成方法相关的 3 个关键问题.
• 首先是该方法的有效性如何,即:本文的方法是否能够改进稀疏卷积的计算性能?
• 第 2 个问题与该方法的稀疏适应性相关,即:在不同稀疏程度下,本文方法生成的稀疏卷积代码性能如
何变化?
• 最后一个问题关注本方法的开销.为了进行冗余指令删除以及使用常量内存等优化,我们对代码进行
了循环展开,使得指令数目显著增加.我们希望通过实验确定,指令数目膨胀对代码体积和指令访问产
生了什么样的影响.
我们通过实验逐一回答上面的问题.在第 3.1 节中,我们首先介绍实验配置,包括对比方法、实验使用的卷
积算子信息以及实验平台等.第 3.2 节~第 3.5 节从不同角度说明本文方法的有效性.其中,第 3.2 节和第 3.3 节通
过在实验卷积算子上的性能对比和分析,展示相对其他方法的性能优势.第 3.2 节主要关注稠密计算方法和其
他非结构化稀疏优化方法,而第 3.3 节探索了与结构化剪枝方法的性能对比问题.第 3.4 节和第 3.5 节分别对冗
余指令删除和访存路径优化这两个主要的优化技术的直接效果进行了分析.第 3.6 节回答稀疏适应性的问题,
我们评估了不同稀疏程度下本方法生成代码的性能,并与其他方法进行了对比分析.第 3.7 节针对开销问题,具
体分析了生成代码体积的变化和对指令访问的影响.
3.1 实验配置
我们在一台配有英伟达 Tesla K40m 的服务器上进行实验.Tesla K40m 具有 15 个流多处理器,显存容量为
12GB.默认情况下,每个流多处理器上有 16KB 的一级高速缓存和 48KB 的共享内存.另外,每个流多处理器还有
8KB 的常量缓存,用于缓存对卷积参数的访问.所有流多处理器共享容量为 1536KB 的二级高速缓存.
为了尽可能覆盖在卷积神经网络中使用的各种参数规模和计算量不同的卷积算子,我们从流行的卷积神
经网络中选择了 10 个有代表性的算子,作为实验中进行优化的对象.实验中使用的算子的具体信息见表 2,我们