Matmul高阶API使能MDL模板

案例介绍

本案例呈现了在矩阵乘算子场景中,使用Matmul高阶API进行矩阵乘法计算,使能MDL模板对算子性能的提升效果。在MDL模板中,MTE2流水从Global Memory到A1/B1的数据搬运为一次性大包搬运,即一次MTE2能搬入多个Matmul计算的基本块,提升带宽利用率,使后续的MTE1流水尽可能复用A1/B1内基本块的缓存数据,减少MTE2的搬运次数。MDL模板的详细介绍请参考MatmulConfig

本案例的算子规格如下:

表1 算子规格

输入

Shape

Data type

Format

a

128, 1024

float16

ND

b

1024, 30720

float16

ND

当前案例使用的AI处理器共24个核,每个核中包含1个AIC核和2个AIV核。

Tiling参数如下:

获取性能数据

使用msProf工具获取算子仿真流水图上板Profiling数据,因为MDL模板主要优化MTE2搬运效率,重点分析MTE2的流水情况。

分析主要瓶颈点

设计优化方案

下图是默认的Norm模板的Matmul计算流水示意图,MTE2分多次从Global Memory搬运基本块到A1或B1,每次只搬运一个基本块。Norm模板的优势为启动开销小,可以提前启动MTE1流水;Norm模板的劣势为在大Shape场景,MTE2搬运次数多,搬运带宽利用率低,整体性能开销大。

图1 默认Norm模板流水示意图

实现Norm模板的具体步骤如下:

  1. 创建Matmul对象,使用默认的Norm模板参数CFG_NORM。

    1
    2
    3
    4
    5
    6
    7
    8
    #define ASCENDC_CUBE_ONLY
    #include "lib/matmul_intf.h"
    
    using A_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, AType>;
    using B_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, BType>;
    using C_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, CType>;
    using BIAS_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, BiasType>;
    AscendC::Matmul<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, CFG_NORM> matmulObj; // 使用CFG_NORM定义Matmul对象
    

下图是MDL模板的Matmul计算流水示意图,MTE2一次性从Global Memory搬运多个基本块到A1或B1,每次搬运stepM * stepKa个基本块到A1或搬运stepN * stepKb个基本块到B1。MDL模板的优势为MTE2一次性搬运多个基本块,带宽利用率高,后续的MTE1流水能尽可能复用A1或B1的缓存数据,MTE2重复搬运次数少。MDL模板的劣势为MTE2头开销时间较长,MTE1流水需要等待MTE2流水完成后才启动,MTE1启动时间晚。

图2 MDL模板流水示意图

Matmul API使能MDL模板的完整样例请参考Matmul API性能优化样例。使能MDL模板的主要步骤如下:

  1. 创建Matmul对象,使用默认的MDL模板参数CFG_MDL。

    1
    2
    3
    4
    5
    6
    7
    8
    #define ASCENDC_CUBE_ONLY
    #include "lib/matmul_intf.h"
    
    using A_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, AType>;
    using B_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, BType>;
    using C_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, CType>;
    using BIAS_TYPE = AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, BiasType>;
    AscendC::Matmul<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, CFG_MDL> matmulObj; // 使用CFG_MDL定义Matmul对象
    

验证优化方案性能收益

总结

大Shape输入、MTE2搬运次数多,且MTE1流水等MTE2流水的同步等待耗时较长的场景下,可以使能MDL模板。通过实现MTE2从Global Memory一次性搬入多个基本块到A1或B1,使后续的MTE1流水能尽量复用A1/B1的缓存数据,减少MTE2的搬运次数,从而提升算子性能。