Page 340 - 《软件学报》2020年第9期
P. 340

董晓  等:面向稀疏卷积神经网络的 GPU 性能优化方法                                                     2961


         3.7   开销分析
             这一节关注开销问题.由于本文的代码生成方法与稀疏参数的取值紧密相关,稀疏参数的取值被编码在生
         成的 ptx 代码中,并经过 ptxas 汇编器编译为二进制 cubin 文件;同时,由于循环展开,在 ptx 和 cubin 中的指令数
         目会显著增加.这可能导致生成的文件体积较大,并在执行过程中给指令的访问带来压力.我们对生成文件的体
         积进行分析,同时,通过 profiling 分析循环展开后指令数目膨胀对运行时的指令访问造成的影响.
             首先,我们对各个算子在卷积参数稠密、稀疏程度为 0.5 和稀疏程度为 0.9 时,对应的 ptx 代码和编译生成
         的 cubin 二进制文件的体积进行了统计,结果展示在表 4 中.
                         Table 4    Sizes of ptx and cubin files in KB under various sparsity levels
                               表 4   不同稀疏程度下 ptx 与 cubin 文件大小,单位 KB
                   稀疏   alexnet-  alexnet-  alexnet-  lenet-   lenet-   resnet-  resnet-   vgg-   vgg-   vgg-
             类型
                   程度    conv1   conv2   conv3   conv1   conv2   conv1   conv2   conv1   conv2   conv3
                    0   244.19  2670.04  5348.87  55.54  2581.98  4207.35  16156.37  191.94  4070.51  8075.77
              ptx   0.5  135.47  1404.52  2822.49  35.79  1387.26  2386.16  8756.73  114.38  2193.88  4293.33
                   0.9   51.15  421.74  854.96  16.87  448.33  998.64  3023.07  56.27  746.77  1410.06
                    0    63.16  603.23  1205.79  17.29  599.54  958.16  3617.48  53.66  900.41  1775.91
             cubin   0.5  37.35  325.60  651.48  12.41  330.66  557.98  2019.41  34.54  500.04  972.04
                   0.9   16.41  98.54  196.79  7.29  106.79  232.54  709.35  19.16  177.29  333.29

             由于 ptx 是文本形式的文件,因此其体积比 cubin 更大.在 0.9 的稀疏程度下,执行的 cubin 文件大小为
         7.29KB~709.35KB.除了存储开销,我们也考虑循环展开造成的指令数目膨胀对运行时指令访问的影响.我们继
         续使用 nvprof 工具,统计由于指令访问延迟导致线程阻塞的比例.我们将我们的方法生成的 kernel 与 cuDNN 和
         cuSPARSE 进行了对比,实验中,使用的稀疏程度为 0.9,在 10 个算子上的实验结果见表 5.
                             Table  5    Percentage of stalls caused by instruction fetch delay     (%)
                               表 5   由于获取下一条指令的延迟导致执行阻塞的比例                                 (%)
                             alexnet-  alexnet-  alexnet-   lenet-  lenet-  resnet-  resnet-  vgg-   vgg-   vgg-
                   算子
                              conv1   conv2   conv3   conv1  conv2  conv1  conv2  conv1   conv2   conv3
                     cuDNN    4.89    5.02   6.81  6.30  4.77   3.95  4.86  4.91  3.60  3.28
               方法   cuSPARSE  5.03    5.96   6.58  6.41  5.11   4.03  4.08  9.87  4.23  3.74
                      Our     1.64    2.12   3.24  2.67  4.31   2.83  3.50  1.49  2.27  2.70
             相对于 cuDNN 和 cuSPARSE,我们生成的 kernel 在运行时,由于指令访问延迟带来的阻塞比例更低.由于循
         环展开消除了部分与控制流相关的指令,使得对指令的访问变为顺序访问的模式,GPU 上的指令访问部件也可
         以更好地预测下一步将要执行的指令,并进行对指令的读取.

         4    相关工作

             在这一节中,我们对相关工作进行分析.我们主要介绍其他以加速稀疏神经网络执行为目标的工作.从实现
         方法区分,已有工作可以分为软件层面的优化方法和硬件层面的加速器设计.
         4.1   稀疏神经网络性能优化
             Intel 提出了 GS [26] 算法优化 CPU 上的稀疏卷积.GS 将稀疏卷积视为稀疏矩阵-稠密矩阵乘法问题,稠密矩
         阵基于卷积的输入变换得到.GS 将稠密矩阵的生成集成在了计算中,以降低访存需求,提升计算密度.另外,GS
         使用了 tiling 和向量化等技术优化在 CPU 上的数据访问和指令吞吐量.GS 使用 CSR 存储稀疏模型参数,与本文
         的方法相比,会占用额外的存储空间并导致更多的运行时访存.作者在论文中发现,基于 CSR 表示的稀疏参数会
         带来约 1 倍的存储开销.SparseCNN       [30] 也利用了为特定稀疏矩阵定制相应运算的思想,作者对模型压缩后引入
         的稀疏矩阵和稠密矩阵乘法在 CPU AVX256 指令集上进行了手工实现.作者对开源的 OpenBLAS                          [31] 进行了修
         改,基于 OpenBLAS 中的 tiling 框架,作者去除了与无效分块进行计算的代码.虽然基于类似的消除冗余计算的
         思想,但本文的方法基于一种通用的中间表示,不需要对同一算子的不同稀疏参数重复编写和手工调优代码.
   335   336   337   338   339   340   341   342   343   344   345