本案例呈现了在融合算子场景中,使用Matmul高阶API进行矩阵乘法计算时,A矩阵和B矩阵同时启用IBShare对性能的提升效果。
该案例的关键优化措施包括:
- 分核逻辑:以Cube核视角分核,Matmul计算结果输出到GM,提供给Vector核进行后续计算。
- 开启IBShare:A矩阵和B矩阵同时开启IBShare。
本案例的算子规格如下:
表 1 算子规格
[object Object][object Object]
[object Object]使用msProf工具获取算子的Profiling的数据,重点分析MTE2,Cube,Scalar的流水情况。
图 1 优化前Profiling数据[object Object][object Object]
通过分析以上Profiling数据可以看出,算子执行多次的平均耗时为27.11us,aic_scalar_time的平均耗时为26.27us,当前性能瓶颈点为Cube的Scalar流水。
A矩阵和B矩阵均未开启IBShare时,数据需要根据K轴、M轴或N轴进行切分计算。这里以K轴切分为例,未开启IBShare之前,算子以AIV Block为视角进行tiling切分,AIV0发起A0*B0的计算,AIV1发起A1*B1的计算。
图 2 未开启IBShare[object Object][object Object]
当A矩阵和B矩阵都启用IBShare时,可以一次性加载到L1 Buffer上,省去了切分,分开搬运的过程,同时Cube计算单元完全由AIV0单核驱动,发起一次计算,计算的结果由AIV0和AIV1共享,从而减少Cube响应的次数,减少Scalar计算。
图 3 开启IBShare[object Object][object Object]
开启IBShare和不开启IBShare的数据交互对比示意图如下:
通过设置A和B矩阵MatmulType的IBShare均为true,开启该优化,具体代码如下:
优化后执行多次的平均耗时:22.44us,较优化前有较大提升。
图 4 优化后Profiling数据[object Object][object Object]
融合算子场景下,Matmul A矩阵和B矩阵同时开启IBShare,以Cube核视角分核,可以有效减少Cube侧的Scalar开销,提升性能。