在ARMv9架构中引入的SME(Scalable Matrix Extension)扩展为矩阵运算提供了硬件级支持。这个扩展的核心创新点是引入了ZA(Z-Array)——一个可伸缩的二维矩阵寄存器组。与传统的向量寄存器不同,ZA允许开发者直接操作矩阵数据结构,这在机器学习、信号处理等领域具有革命性意义。
SME指令集包含多种操作ZA的指令,其中MOV和MOVA指令系列负责在ZA tile和向量寄存器之间传输数据。这类指令的设计充分考虑了实际应用场景的需求:
重要提示:虽然文档中MOV和MOVA指令功能相同,但ARM官方推荐始终使用MOV助记符进行编码。MOVA形式主要用于内部架构文档描述,实际编程时应避免直接使用。
MOV指令在ZA tile和向量寄存器之间传输数据时,主要涉及以下几个关键组件:
指令通用格式为:
code复制MOV <目标>, <源>, [<谓词>]
根据方向不同分为:
切片选择是MOV指令最精巧的设计之一。以水平切片为例:
base = Ws + offsetfinal_pos = base % (VL / element_size)这种设计带来了几个优势:
这是最基本的传输形式,操作单个向量寄存器与ZA切片之间的数据。
典型编码:
asm复制MOV ZA0.H[W12, 2], P0/M, Z0.H // 向量到Tile
MOV Z0.H, P0/M, ZA0.H[W12, 2] // Tile到向量
关键参数:
同时操作两个连续的向量寄存器,要求偏移量为2的倍数。
示例:
asm复制MOV { Z0.B-Z1.B }, ZA0.B[W13, 0:1] // 从ZA加载两个连续切片
技术细节:
高性能变体,一次操作四个向量寄存器,要求偏移量为4的倍数。
特殊语法:
asm复制MOV { Z0.S-Z3.S }, ZA0.S[W14, 0:3] // 加载四个切片
MOV ZA0.S[W14, 0:3], { Z0.S-Z3.S } // 存储四个切片
注意事项:
所有MOV变体共享相似的编码模式,以32位元素为例:
code复制31-28 | 27-23 | 22-16 | 15-10 | 9-5 | 4-0
1100 | 00010 | 000010 | ZAd | off2 | size/Q
关键字段:
标准语法遵循ARM汇编惯例,但有几点特殊之处:
谓词位置:
asm复制MOV ZA0.H[Ws, off], Pg/M, Zn.H // 向量到Tile
MOV Zn.H, Pg/M, ZA0.H[Ws, off] // Tile到向量
多寄存器语法:
asm复制MOV { Zn1.H-Zn2.H }, ZAd.H[Ws, off1:off2]
隐式偏移:
当偏移量为0时可省略:
asm复制MOV Z0.D, ZA0.D[W12] // 等价于[W12, 0]
小数据块(<4个向量):
中大数据块:
索引寄存器分配:
向量寄存器分组:
asm复制// 推荐用法
MOV { Z0.H-Z1.H }, ZA0.H[W12, 0:1]
MOV { Z2.H-Z3.H }, ZA0.H[W12, 2:3]
// 不推荐用法(寄存器不连续)
MOV { Z0.H-Z1.H }, ZA0.H[W12, 0:1]
MOV { Z7.H-Z8.H }, ZA0.H[W12, 2:3]
元素大小不匹配:
asm复制// 错误示例
MOV Z0.S, ZA0.H[W12, 0] // 元素大小不一致!
谓词使用不当:
asm复制// 危险用法(可能未初始化部分元素)
MOV Z0.H, P0.M, ZA0.H[W12, 0]
边界条件忽略:
asm复制// 需要检查VL值
MOV { Z0.D-Z3.D }, ZA0.D[W12, 0:3] // 需要VL>=256
利用水平和垂直切片特性,可以高效实现矩阵转置:
asm复制// 假设ZA0已加载4x4矩阵
MOV Z0.H, ZA0.H[W12, 0] // 取行0
MOV ZA1.V[W13, 0], Z0.H // 存为列0
MOV Z1.H, ZA0.H[W12, 1] // 取行1
MOV ZA1.V[W13, 1], Z1.H // 存为列1
...
批量搬运数据到ZA:
asm复制// 将Z0-Z3中的数据存入ZA0的连续切片
MOV ZA0.H[W12, 0:3], { Z0.H-Z3.H }
使用谓词控制部分更新:
asm复制// 只更新ZA中符合条件的元素
MOV ZA0.H[W12, 0], P0/M, Z0.H
QEMU 7.0+支持SME模拟
bash复制qemu-aarch64 -cpu max,sme=on,sme2=on ./program
使用LLVM-MCA进行吞吐量分析:
bash复制llvm-mca -mcpu=neoverse-v2 -timeline mov_za.s
关键性能事件:
L1D_CACHE.ACCESS:缓存访问情况STALL_SLOT_BACKEND:后端停顿周期INST_RETIRED:指令退休计数非法指令异常:
.arch_extension sme是否正确设置数据损坏:
性能低下:
在实际工程实践中,我发现合理组织数据布局对性能影响巨大。例如,在实现矩阵乘法时,将输入矩阵预先转置存储在ZA中,可以使后续计算获得更好的访问模式。同时,建议在热循环中使用固定索引寄存器(如专用W12存储基址),减少地址计算开销。