本案例呈现了在矩阵乘算子场景中,使用Matmul高阶API进行矩阵乘法计算,B矩阵使能IBShare对算子性能的提升效果。IBShare功能通过共享L1 Buffer上相同的A矩阵或B矩阵数据,减少重复的MTE2数据搬运开销,提升算子性能。该功能支持A矩阵和B矩阵其中一个矩阵使能IBShare,也支持A矩阵和B矩阵同时使能IBShare。
本案例的算子规格如下:
|
输入 |
Shape |
Data type |
Format |
|---|---|---|---|
|
a |
64, 384 |
float16 |
ND |
|
b |
384, 256 |
float16 |
ND |
当前案例使用的AI处理器共20个核,每个核中包含1个AIC核和2个AIV核。因为输入shape较小,本案例以单核为示例,参考SetDim接口在MIX模式下的使用,在Tiling程序中设置参与运算的核数为2。Tiling参数如下:
使用msProf工具获取算子仿真流水图和上板Profiling数据,因为IBShare功能主要是通过共享L1 Buffer上相同的A矩阵或B矩阵数据,减少重复的MTE2数据搬运开销,所以重点分析MTE2的流水情况。
下图是不使能IBShare模板(默认使用Norm模板)的Matmul计算流水示意图。MTE2分多次从Global Memory搬运基本块到A1或B1,即使前后两次搬运的B矩阵基本块数据是相同的数据,也会重复搬运。
下图是使能IBShare模板的Matmul计算流水示意图。MTE2分多次从Global Memory搬运基本块到A1或B1,若前后两次搬运的B矩阵基本块数据相同,不会重复搬运,第一次搬运到B1内的数据会被复用。
Matmul API使能IBShare模板共享B矩阵的完整样例请参考仅B矩阵使能IBShare样例。使能IBShare功能的主要步骤如下:
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, false, LayoutMode::NONE, true>; // 设置B矩阵的IBSHARE参数为true 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_IBSHARE_NORM> matmulObj; // 使用默认的IBShare模板参数CFG_IBSHARE_NORM定义Matmul对象 |
MIX场景(包含矩阵计算和矢量计算)下,若多个AIV的A矩阵或B矩阵GM地址相同,且多个AIV复用的A矩阵/B矩阵在L1 Buffer上全载。可以考虑使能IBShare模板,通过共享L1 Buffer上相同的A矩阵或B矩阵数据,减少重复的MTE2数据搬运开销,提升算子性能。