Batch Matmul是指批量处理Matmul计算的场景。该场景对外提供了的调用接口,调用一次IterateBatch,可以计算出多个singleCoreM * singleCoreN大小的C矩阵。
Matmul单次计算的过程需要搬入和搬出数据,当进行多次Matmul计算且单次Matmul计算的输入shape较小时,搬运开销在整体耗时中占比较大。通过IterateBatch接口批量处理Matmul,可以有效提升带宽利用率。
Batch Matmul当前支持4种Layout类型:BSNGD、SBNGD、BNGS1S2、NORMAL(BMNK的数据排布格式),相关数据排布格式请参考。
下图为NORMAL数据排布格式的Batch Matmul计算。整个Matmul计算一共包含4个矩阵乘操作:mat_a1*mat_b1、mat_a2*mat_b2、mat_a3*mat_b3、mat_a4*mat_b4,需要单核上计算四个singleCoreM *singleCoreN。在该场景下,如果shape较小,可以将其视为Batch Matmul场景进行批量处理,以提升性能。一次IterateBatch可同时计算出mat_c1 = mat_a1 * mat_b1、mat_c2 = mat_a2 * mat_b2、mat_c3 = mat_a3 * mat_b3、mat_c4 = mat_a4 * mat_b4。
图 1 NORMAL数据排布格式的Batch Matmul示意图[object Object][object Object]
Matmul计算需要计算出多个singleCoreM * singleCoreN大小的C矩阵,且单次Matmul计算处理的shape较小。
- 只支持。
- 对于BSNGD、SBNGD、BNGS1S2 Layout格式,输入A、B矩阵按分形对齐后的多Batch数据总和应小于L1 Buffer的大小;对于NORMAL Layout格式没有这种限制,但需通过配置参数,即输入A、B矩阵多Batch数据大小与L1 Buffer的大小关系;
- 对于BSNGD、SBNGD、BNGS1S2 Layout格式,称左矩阵、右矩阵的G轴分别为ALayoutInfoG、BLayoutInfoG,则ALayoutInfoG / batchA = BLayoutInfoG / batchB;对于NORMAL Layout格式,batchA 、batchB必须满足倍数关系。Bias的shape(batch, n)中的batch必须与C矩阵的batch相等。
- 如果接口输出到Unified Buffer上,输出C矩阵大小BaseM*BaseN应小于分配的Unified Buffer内存大小。
- 对于BSNGD、SBNGD Layout格式,输入输出只支持ND格式数据。对于BNGS1S2、NORMAL Layout格式, 输入支持ND/NZ格式数据。
- Batch Matmul不支持量化/反量化模式,即不支持、接口。
- BSNGD场景,不支持一次计算多行SD,需要算子程序中循环计算。
- 异步模式不支持IterateBatch搬运到Unified Buffer上。
- 模板参数(默认取值为false)设置为true,即使能MixDualMaster(双主模式)场景时,不支持Batch Matmul。
- 在batch场景,A矩阵、B矩阵支持half/float/bfloat16_t/int8_t数据类型,不支持int4b_t数据类型。
以下是NORMAL数据排布格式的Batch Matmul调用示例。BSNDG数据排布格式的Batch Matmul完整示例请参考。