Batch Matmul算子特性分析_v0.2 #2
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Batch Matmul算子特性分析
1.1 算子功能与接口说明
算子功能:完成带batch的矩阵乘计算。
算子输入:
左矩阵(也叫A矩阵):[BatchA,M,K]、数据类型dtype、layout(典型ND)
右矩阵(也叫B矩阵):[BatchB,M,K]、数据类型dtype、layout(典型ND)
偏置bias:维度固定[B,1,N]、数据类型dtype、layout(固定ND),可为空
算子输出:
输出矩阵(也叫C矩阵):[BatchC,M,N]、数据类型dtype、layout(典型ND)
计算公式:
C=A@B+bias
其中,A,B 输入维度典型为3维,最后两维做矩阵乘计算。例如,A,B 输入维度分别为(B,M,K)、(B,K,N) 时,C维度为 (B,M,N)。bias是维度为(B,1,N)的向量。其中,B为矩阵乘法的batch数,M为第一个张量A的行数和输出张量C的行数,N为第二个张量B的列数和输出张量C的列数,K为第一个张量A的列数和第二个张量B的行数。
1.2 BMM算子最优实现分析
算子性能最优的优化目标是总时延最短。
多核并行计算时延可以通过流水进行一定程度的掩盖,最终时延
T_total=max(T_MMAD, T_MTE2, T_MTE1, T_Fixpipe [, T_Reduce])
算子优化的关键是对瓶颈硬件时延的优化。
当MTE2硬件时延是瓶颈,MMAD计算硬件不是瓶颈时,甚至可以考虑牺牲一定MMAD时延(例如冗余计算)来换取瓶颈硬件MTE2的性能提升,来换取总时延最低的优化。
反之亦然,当MMAD计算硬件时延是瓶颈,MTE2硬件不是瓶颈时,甚至可以考虑牺牲一定MTE2时延(例如重复搬移)来换取瓶颈硬件MMAD的性能提升,来换取总时延最低的优化。
BMM算子在NPU上运行实现的本质是将参与计算的数据块分块(tile),由多核并行+串行完成这些分块(tile)的计算并组合成最终结果。
BMM分块的划分有4个维度(B,M,K,N)
这4个维度,从切分特征看,
只切B:
1、 每个数据分块都只会被固定的一个核读取,同一个数据分块不会被多个不同的核读取,核间不会重复读取同一数据分块
2、 每个最终输出数据块分块只由1个核独立完成,没有中间结果产生,也不依赖其他核
只切M或只切N:
1、 若是切M后左矩阵分块被分到不同核,则存在同一右矩阵分块被不同核(重复)读取;若是切N后右矩阵分块被分到不同核,则存在同一左矩阵分块被不同核(重复)读取;单核会读取多个数据块,单个数据块也可能会被多个不同的核读取;
2、 每个最终输出数据块分块只由1个核独立完成,没有中间结果产生,也不依赖其他核
只切K:
1、 每个数据分块只需要被固定的一个核读取,同一个数据分块不需要被多个不同的核读取,核间不会重复读取同一数据分块
2、 每个最终输出数据块不能只通过一个核的计算完成,单核存在中间结果的写出,需要与其他核的结果一起做Reduce才能产生最终输出数据分块
从完备性角度,所有可能的切分组合是这4个维度的任意非空子集,共2^4-1=15种
{B}、{M}、{K}、{N}、{B,M}、{B,K}、{B,N}、{M,K}、{M,N}、{K,N}、{B,M,K}、{B,M,N}、{B,K,N}、{M,K,N}、{B,M,K,N}
结合特征,将这些组合分成不同分支,不同分支的优化方案有所不同
只切B: {B},
无重复读,读写数据量固定,
当case是访存Bound时,优化目标是搬移效率要高,
当case是计算Bound时,优化目标是计算效率要高
切B\M\N:{M}、{N}、{M,N}、{B,M}、{B,N}、{B,M,N},
可能存在重复读,
当case是访存Bound时,优化目标是重复读尽量少,且搬移效率尽量高,
当case是计算Bound时,优化目标是计算效率要高
涉及切K:{K}、{B,K}、{M,K}、{K,N}、{B,M,K}、{B,K,N}、{M,K,N}、{B,M,K,N}
可能存在重复读,且可能存在写出中间量再读回AIV做Reduce再写出
当算子是计算Bound时,优化目标是总计算效率尽量高,且分块的多核并行计算所引入的额外MTE2、Fixpipe硬件时延不会成为新的瓶颈
由此引出第一个问题,如何分块,数据分块涉及核间分块、核内分块,
优先考虑核间分块问题,
核间分块有4个维度
BMM分块多核并行计算的本质是完成:
C[B,M,N]=∑A[B,M,Ki]@B[B,Ki,N]
算子时延主要受限于多核并行计算时的
对于并行计算的瓶颈时延的优化实现是BMM算子达成最优性能的关键
对于多核并行计算
要达成最短时延需要同时决策以下3个维度
软件实现分支选择:决定了核间切分和数据流组织方式
Tiling参数选择:决定了单核内的分块
Swizzle编排
【修复说明 · 乱码重写】原评论提交时编码损坏、内容不可恢复, 以下按 git 记录 / issue 正文 / 残留文本重建 (要点级, 非逐字原稿):
原评论与 #1 上的评论内容完全相同、时间仅差 1 秒, 系误重复提交 (duplicate)。
本 issue 的评审闭环内容见 #1 评论的重写版; 本评论仅作去重说明。