Page 11 - 《软件学报》2021年第8期
P. 11

蔡雨  等:异构 HPL 算法中 CPU 端高性能 BLAS 库优化                                              2293



















                                   Fig.3    High performance GEMM algorithm of big and little kernels
                                       图 3   高性能 GEMM 的大 kernel 算法和小 kernel 算法

                    大 kernel 算法描述如下:
                     •  最外层 Loop1 遍历 n 维度(以 j c 索引),以宽度 n c 为单位,对矩阵 C 和矩阵 B 进行分块,形成列向 panels.
                     •  第 2 层 Loop2 遍历 k 维度(以 p c 索引),以高度 k c 为单位,将矩阵 A 划分成列向 panels,同时将 Loop1 中
                        划分出的矩阵 B 的列向 panel 进一步划分成 block;Loop2 中,还会将 B block(B(p c :p c +k c –1,j c +n c –1)表示)
                        进行打包(packing).关于大 kernel 中的 packing 操作见第 2.2 节.
                     •  第 3 层 Loop3 遍历 m 维度(以 i c 索引),以高度 m c 为单位,将 Loop1 中划分出的矩阵 C 的列向 panel 进
                        一步划分出 block,以 C c 表示(未进行 packing 操作),将 Loop2 中划分出的矩阵 A 的列向 panel 也进一步
                        划分成 block.同样地,Loop3 中,还会将 A block 进行打包,以 A c 表示打包后的矩阵块.
                     •  第 4 层 Loop4 再次遍历 n 维度(以 j r 索引),以宽度 n r 为单位,将 packed block B c 和 block C c 再次进一步
                        划分成 micro-panels.
                     •  第 5 层 Loop5 再次遍历 m 维度(以 i r 索引),以高度 m r 为单位,将 packed block  A c 划分成 micro-panels,
                        将 Loop4 中 C c 中的 micro-panel 进一步划分成 micro-tiles.
                     •  最内层 Loop6 再次遍历 k 维度(以 p r 索引),以 1 为单位,计算 A c 中的 micro-panel 与 B c 中的 micro-panel
                        的点积(dot product),并将结果累加到 C c 中的 micro-panel,即所谓的“rank-1 update”.
                    小 kernel 算法描述如下:
                     •  前两次 loops 的作用在于将小矩阵 B 进行打包,其目的是便于 inner-loops 中最内层 kernel 对 B 矩阵的
                        连续、对齐访问,关于小 kernel 中的 packing B 操作见第 2.2 节.
                     •  inner-loops 中的 3 层循环类似于大 kernel 中的实现,只是此时循环操作的上限不再是大 kernel 中分块
                        后的 n c 、m c 和 k c ,而直接是整个矩阵的大小.
                    与大 kernel 算法相比,小 kernel 算法有如下优点:
                    (1)  省去了对矩阵 A 的 packing 操作.
                    异构 HPL 中的矩阵 A 往往是“高窄阵”,其规模比矩阵 B 大非常多,对矩阵 A 进行打包操作的耗时占整个
                 GEMM 操作的比例非常高.
                    (2)  极大地避免了大 kernel 中 out-loops 的循环次数.
                    大 kernel 算法与小 kernel 算法间的动态切换,主要依据输入矩阵的规模,即计算量的大小.但并不存在完美
                 的切换阈值(threshold),因为 3 个矩阵 A、B 和 C 的行、列维度千变万化,某一个特定的切换阈值无法做到全面
                 适用于所有的使用场景,需要在具体的应用中实际测试来找到比较合适的阈值设置.根据本文系统平台实测,切
                 换进入小 kernel 的阈值条件满足下面两者之一即可:
                    (1) C 矩阵的面积,即 M×N≤700×700 时.
                    (2)  维数 M≤160 同时维数 K≤128 时.
   6   7   8   9   10   11   12   13   14   15   16