GEMM 三向分块参数 M/N/K BlockSize 完整解释

发布时间:2026/6/20 9:14:02
GEMM 三向分块参数 M/N/K BlockSize 完整解释 GEMM 三向分块参数 M/N/K BlockSize 完整解释GEMM 公式CM×NAM×K×BK×NC_{M×N} A_{M×K} × B_{K×N}CM×N​AM×K​×BK×N​三个维度对应三套分块参数M_blockA 矩阵行维度分块大小选项AN_blockB 矩阵列维度分块大小选项BK_block矩阵乘累加维度分块大小选项C一、每个参数分别是什么含义1. M方向分块大小 M_blockA的行、C的行逻辑矩阵 A 维度 M把 M 切多段每段长度 M_block硬件对应Task BlockAI Core并行分块多个AI Core并行每个Block只算 M_block 行的数据各核负载拆分。存储每块 A[M_block, K] 会搬入 L0A2. N方向分块大小 N_blockB的列、C的列逻辑矩阵 B 维度 N把 N 切多段每段长度 N_block硬件对应单AI Core内一次输出的C矩阵宽度存储每块 B[K, N_block] 搬入 L0B输出 C[M_block, N_block] 存在 L13. K方向分块大小 K_block累加维度乘加循环逻辑A、B公共维度K循环多次累加每次只取 K_block 长度做Cube乘A(M,K)×B(K,N)∑tile0K/KblockAtile(M,Kblock)×Btile(Kblock,N)A(M,K)×B(K,N) \sum_{tile0}^{K/K_{block}} A_{tile}(M,K_{block}) × B_{tile}(K_{block},N)A(M,K)×B(K,N)∑tile0K/Kblock​​Atile​(M,Kblock​)×Btile​(Kblock​,N)核心约束L0A、L0B容量上限完全由 K_block 决定L0A存 M_block × K_blockL0B存 K_block × N_block两者总和不能超过片上L0总大小。二、为什么这三个参数必须确定对应Local内存、Cube、硬件限制1. 硬件存储硬性约束最核心原因昇腾Cube计算必须把A、B小块放入L0A / L0BLocal专用缓存L0容量极小MB级不能一次性放下完整矩阵。{L0A占用Mblock×Kblock×data_type_bytesL0B占用Kblock×Nblock×data_type_bytes \begin{cases} \text{L0A占用} M_{block} × K_{block} × \text{data\_type\_bytes}\\ \text{L0B占用} K_{block} × N_{block} × \text{data\_type\_bytes} \end{cases}{L0A占用Mblock​×Kblock​×data_type_bytesL0B占用Kblock​×Nblock​×data_type_bytes​三者任意一个太大都会直接 Local Memory Overflow 报错三者搭配太小会频繁SDMA搬运Global→L0访存瓶颈。2. 匹配Cube硬件原生计算粒度达芬奇Cube最小硬件计算单元为 16×16×16FP16M_block、N_block 建议是16倍数适配单次Cube输出块K_block 建议16倍数保证Cube流水线满载减少计算气泡。三个分块尺寸不对齐16会产生填充0、算力浪费msprof中CubeUtilization变低。3. 控制SDMA搬运次数决定访存开销K_block 越小外层K循环次数越多Global ↔ L0 来回搬运越频繁HBM带宽压力暴增M_block / N_block 太小单次Cube计算数据量少流水线频繁启停PipeUtilization流水线利用率下降。4. 控制多AI Core并行负载均衡M_block总M长度 / M_block 启动的Task Block数量AI Core并行数。M_block设置不合理会导致AI Core数量不匹配硬件、部分核负载过重、部分核空闲并行效率低。5. 控制L1输出缓存占用M_block × N_block计算结果C存在L1Mblock×NblockM_{block}×N_{block}Mblock​×Nblock​不能超过L1剩余容量如果M/N分块过大L1溢出必须频繁写回Global增加带宽开销。三、三者分工总结M_blockA选项负责多AI Core并行拆分约束L0A、L1输出行宽N_blockB选项负责单次Cube输出宽度约束L0B、L1输出列宽K_blockC选项控制内层累加循环次数决定L0总占用、数据搬运频次是调优GEMM性能最关键参数。四、一句话总结为什么三者都需要确定GEMM计算依赖片上极小L0/L1存储必须把大矩阵沿M/N/K三维切小块M/N/K分块大小共同决定① L0/L1内存是否溢出② Cube硬件计算是否对齐、算力利用率高低③ Global与Local之间数据搬运次数与带宽开销④ 多AI Core并行负载是否均衡。三者缺一不可都需要人工指定/自动Tiling求解。