Page 14 - 《软件学报》2021年第8期
P. 14
2296 Journal of Software 软件学报 Vol.32, No.8, August 2021
Fig.5 Packing matrix B in little GEMM kernel
图 5 GEMM 小 kernel 中矩阵 B 的打包操作
Packing 数据打包操作的优点有 3 个.
(1) 创造连续的内存访问方式.
BLAS 接口传入的矩阵存储方式是不确定的,可能是 row-major,也可能是 column-major,且矩阵的行或列间
的跨度会非常大,最内层的 kernel 为了适应不同的数据存储方式以及不连续的数据分布,需要通过 packing 制造
统一的、连续的内存布局视图.
(2) 数据对齐.
对于大多数 CPU 微架构实现而言,对齐到寄存器宽度,cache 边界和页边界的数据访问往往比非对齐的数
据访问方式更快.
(3) 提前 load 数据到 cache.
通过 packing 操作,最内层 kernel 可以在尽可能接近 CPU 寄存器的 cache 上获取到需要进行运算的操作数,
这比直接从内存中获取数据要快很多.
2.4 数据预取
X86 CPU 提供了硬件取功能和符合 X86 ISA 的软件预取指令.其中硬件预取对开发者是透明的,软件预取
指令 PREFETCHn 指示处理器将后续需要访问的数据提前读入到指定的某级缓存中,当程序使用这些数据时,
可以直接读取缓存.PREFETCHn 指令格式见表 1.
Table 1 X86 software prefetch instructions
表 1 X86 软件预取指令
指令格式 功能描述
PREFETCHT0 mem8 将内存字节地址 mem8 指定的缓存行,预取到所有的 caches 中
PREFETCHT1 mem8 将 mem8 指定的缓存行,预取到除 L1 之外的所有 caches 中
PREFETCHT2 mem8 将 mem8 指定的缓存行,预取到除 L1、L2 之外的所有 caches 中
PREFETCHNTA mem8 将 mem8 指定的缓存行,以缓存污染最小化的方式预取到 caches 中
软件预取指令不要求数据行对齐,如果预取数据行已经存在于比指定的 n 更低的某层 cache 中,那么指令将
被当作 NOP 空指令处理.