在当今的计算密集型应用中,矩阵运算已成为机器学习、科学计算和图形处理等领域的核心操作。ARM架构通过SME(Scalable Matrix Extension)指令集为这类计算提供了硬件级加速支持,其中FMLAL和FMLALL指令专门针对浮点矩阵运算进行了优化。
SME架构引入了一个名为ZA(Z-Array)的二维寄存器组,这是一个可伸缩的矩阵存储区域,其大小随实现不同而变化。ZA寄存器组的独特之处在于它允许程序员将数据视为矩阵而非传统向量,这为矩阵运算提供了更自然的编程模型。FMLAL和FMLALL指令正是利用这一特性,实现了高效的矩阵乘加操作。
关键提示:SME指令集需要处理器支持特定的硬件特性(如FEAT_SME2、FEAT_SME_F8F16等),在使用前务必检查CPU是否支持这些扩展。
FMLAL(Floating-point Multiply-Add to Long)指令执行以下核心操作:
该指令有三种主要变体:
典型的指令格式如下:
assembly复制FMLAL ZA.S[<Wv>, <offs1>:<offs2>], <Zn>.H, <Zm>.H
其中:
ZA.S指定目标为ZA寄存器组的单精度区域<Wv>是向量选择寄存器(W8-W11)<offs1>:<offs2>定义操作的范围<Zn>.H和<Zm>.H是源寄存器,包含半精度(FP16)数据FMLAL指令最强大的特性之一是它能在执行运算时自动处理精度转换。以FP16到FP32的操作为例:
Zn和Zm中读取FP16数据这种设计有两大优势:
FMLAL支持通过VGx2和VGx4后缀启用多向量组并行处理。例如:
assembly复制FMLAL ZA.S[<Wv>, <offs1>:<offs2>, VGx4], { <Zn1>.H-<Zn4>.H }, <Zm>.H
这种模式下,指令会同时处理四个向量组,大幅提升吞吐量。在实际应用中,这相当于同时计算四个独立的矩阵乘法,非常适合需要批量处理小矩阵的场景。
FMLALL(Floating-point Multiply-Add to Long Long)指令专注于8位浮点(FP8)到更高精度的运算,主要特点包括:
基本指令格式:
assembly复制FMLALL ZA.S[<Wv>, <offs1>:<offs4>], <Zn>.B, <Zm>.B
这里.B表示源数据是8位格式,而ZA.S表示目标为单精度。
FMLALL提供了一种独特的索引访问模式,可以从第二个源向量中选择特定元素进行广播式乘法:
assembly复制FMLALL ZA.S[<Wv>, <offs1>:<offs4>], <Zn>.B, <Zm>.B[<index>]
其中<index>是0-15范围内的立即数,指定要使用的元素位置。这种模式在需要重复使用某些权重值的神经网络推理中特别有用。
FMLALL引入了一个重要的缩放控制机制:
c复制最终值 = 累加值 + (FP8_to_FP32(A) * FP8_to_FP32(B)) * 2^(-UInt(FPMR.LSCALE[3:0]))
这种缩放能力使得FMLALL非常适合需要动态调整数值范围的量化神经网络运算,开发者可以通过修改FPMR寄存器来优化数值稳定性。
以下是一个使用FMLAL进行矩阵乘法的伪代码示例:
c复制// 初始化ZA寄存器
SMSTART(ZAz)
// 加载输入矩阵到Z寄存器
LD1H {Z0.H-Z3.H}, [input_ptr]
// 加载权重矩阵到Z寄存器
LD1H {Z4.H}, [weight_ptr]
// 执行矩阵乘法累加
FMLALL ZA.S[W8, 0:3], {Z0.B-Z3.B}, Z4.B
// 存储结果
ST1W {ZA0H.S[W8,0]-ZA0H.S[W8,3]}, [output_ptr]
SMSTOP()
经验分享:在实际测试中,我们发现对于中等规模矩阵(如32x32),使用VGx4模式相比单向量组能有近3倍的性能提升,但要注意这会增加寄存器压力。
非法指令异常:
数值精度问题:
性能未达预期:
在神经网络推理中,FMLALL指令特别适合量化模型的加速。以典型的int8量化模型为例:
这种方案相比纯整数运算能提供更好的精度,同时保持高性能。
在科学计算中,FMLAL可用于:
例如,一个3D变换可以表示为:
math复制\begin{bmatrix}
x' \\ y' \\ z'
\end{bmatrix}
=
\begin{bmatrix}
a & b & c \\
d & e & f \\
g & h & i
\end{bmatrix}
\times
\begin{bmatrix}
x \\ y \\ z
\end{bmatrix}
使用FMLAL的VGx3模式可以高效地并行计算这三个输出分量。
以单ZA双向量组编码为例:
code复制31-28 | 27-23 | 22-16 | 15-10 | 9-5 | 4-0
11000 | 01001 | Zm<<1 | 010Rv | Zn | off3
关键字段:
现代ARM实现通常为SME指令提供专用执行单元:
在Cortex-X系列处理器中,FMLAL指令通常具有:
相比传统NEON指令,SME的FMLAL/FMLALL提供:
相比GPU方案,SME的优势在于:
但GPU在极大矩阵运算上仍有吞吐量优势。
ARM SME架构仍在持续演进,未来可能的方向包括:
对于开发者来说,保持对SME新特性的关注非常重要,这有助于提前规划优化策略。