Matmul高阶API使能MTE2 Preload

案例介绍

本案例呈现了在矩阵乘算子场景中,使用Matmul高阶API进行矩阵乘法计算,使能MTE2 Preload对算子性能的提升效果通过MatmulConfig中的doMTE2Preload参数开启矩阵M或N方向的预加载功能,预加载即在MTE2间隙提前加载A矩阵/B矩阵数据,开启预加载功能后,可以减少MTE2间隙,提升算子性能。doMTE2Preload参数的详细介绍请参考MatmulConfig

本案例的算子规格如下:

表1 算子规格

输入

Shape

Data type

Format

a

128, 512

float16

ND

b

512, 24576

float16

ND

当前案例使用的AI处理器共24个核,算子中使能高阶API Matmul的纯Cube模式。使用MDL模板,Tiling参数如下:

获取性能数据

使用msProf工具获取算子仿真流水图上板Profiling数据,重点分析Cube,Fixpipe的流水情况。

分析主要瓶颈点

设计优化方案

使能MTE2 Preload功能:在创建Matmul对象时,开启doMTE2Preload开关。使能MTE2 Preload的完整样例请参考M方向预加载Matmul算子样例。具体步骤如下:

  1. 配置MDL模板参数,将其中的doMTE2Preload参数设置为2,使能N方向Preload功能。

    1
    2
     // preloadMode = 2
    static constexpr MatmulConfig MM_CFG = GetMDLConfig(false, false, preloadMode); 
    

  2. 基于自定义MatmulConfig模板参数,创建Matmul对象。

    1
    2
    3
    4
    AscendC::Matmul<AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, aType>,
        AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, bType>,
        AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, cType>,
        AscendC::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, biasType>, MM_CFG> matmulObj;
    

验证优化方案性能收益

总结

当MTE2流水间隙较大,且M或N数值较大时,可以考虑使能MTE2 Preload功能,提前加载A矩阵或B矩阵数据。