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 时.