SME简介
矩阵乘在计算仿真、机器学习等领域扮演着十分重要的角色,SME(Scalable Matrix Extension)是Armv9中新增加的基于矩阵外积运算的指令集扩展,它在SVE/SVE2的已有能力之上,针对矩阵运算扩充了多种能力:如独立的矩阵存储单元ZA,高效的矩阵外积乘指令及矩阵向量间的数据移动指令,以及流模式(streaming mode)。自4.0.0版本开始,毕昇编译器对ACLE SME(Beta)及SME ABI进行了支持, 并提供了对典型计算模式进行自动识别并生成SME指令的自动矩阵化能力,目前支持GEMM/SYR2K算子及其变种。
毕昇编译器不包含SME2内容支持
流模式
SME指令需要在AArch64流模式(streaming mode)下执行。流模式与非流模式(non-streaming mode)有不同的z寄存器和p寄存器宽度,流模式下的z寄存器宽度用SVL(streaming vector length)表示,非流模式下的z寄存器宽度用NSVL(non-streaming vector length)表示,两种模式下p寄存器宽度分别为SVL/8与NSVL/8。
920 72F8机器中,SVL与NSVL均为64,即z寄存器宽度均为64 bytes。
存储单元
ZA是一块核内私有的SVL.B x SVL.B(SVL的byte数量,如SVL=256时SVL.B=32)字节大小的存储单元,SME中的矩阵运算指令即是将运算结果存放在此块区域。如下图所示(图片来自Arm):

SME矩阵操作类型
SME支持的向量外积运算类型如下:
输出矩阵(类型) |
输入向量(类型) |
920 72F8是否支持 |
对应编译器特性扩展名 |
|---|---|---|---|
INT32 |
INT8 * INT8 |
是 |
sme-i8i32 |
INT32 |
INT32 |
否 |
sme-i32i32 |
FP32 |
BF16 * BF16 |
是 |
sme-bf16f32 |
FP32 |
FP16 * FP16 |
是 |
sme-f16f32 |
FP32 |
FP32 * FP32 |
是 |
sme-f32f32 |
INT64 |
INT16 * INT16 |
否 |
sme-i16i64 |
FP64 |
FP64 * FP64 |
是 |
sme-f64f64 |
毕昇编译器支持显示添加sme、sme-f64f64、sme-fa64, 其他特性隐式包含在sme中