基于Ascend C的Matmul算子性能优化最佳实践

矩阵乘法是深度学习计算中的基础操作,对于提升模型训练和推理速度至关重要。昇腾AI处理器是一款专门面向AI领域的AI加速器,其AI Core采用达芬奇架构,以高性能Cube计算引擎为基础,针对矩阵运算进行加速,可大幅提高单位面积下的AI算力。Matmul算子实现的功能是矩阵乘法,通过Ascend C算子编程语言优化该算子的实现逻辑,可以使其在昇腾AI处理器上获得更优的执行性能。希望通过本案例的讲解,可以为开发者优化昇腾Cube类算子性能带来启发。


本案例以矩阵维度M = 4096,N = 5120,K = 4096,输入数据类型half,输出数据类型float,输出格式是ND为例,性能验证平台为Atlas A2训练系列产品/Atlas 800I A2推理产品,介绍针对Matmul算子的主要优化手段,包括优化分核逻辑、优化基本块、开启大包搬运。

  • 优化分核逻辑:开启尽量多的Cube核使能并行计算。
  • 优化基本块,选择最优的baseM、baseN、baseK参数。
  • 开启大包搬运:从Global Memory搬运数据到L1时,对于A矩阵,一次搬入depthA1个基本块,基本块大小为baseM * baseK,对于B矩阵,一次搬入depthB1个基本块,基本块大小为baseN * baseK。使能大包搬运后,一次搬入的数据量变大,提升MTE2搬运效率。

分析主要瓶颈点

借助昇腾Profiling性能数据可较方便地分析主要瓶颈点,这里我们重点分析MTE2,Cube,Scalar pipeline的流水情况,其中MTE2(Memory Transfer Engine)pipeline反映了数据的搬入情况,Cube和Scalar pipeline则反映了AI Core中的数据计算及标量的使用情况。

优化前Profiling数据

从上图Profiling数据来看,aic_mte2_ratio数值是0.973,这表明MTE2类型指令的cycle数在total cycle数中的占比过大,这意味着当前性能瓶颈点可能在于MTE2流水。此外,从图中的Block Dim数值4也可以看到,参与计算的AI处理器核并没有用满,这里假设当前案例使用的AI处理器上共有20个核。整体优化思路如下:

  • 优化分核逻辑,假设CurrentCore是未优化前分核的Cube核数,MaxCore为最大Cube核数,当开启全部核并行做当前shape数据量的计算时,预估性能收益约为MaxCore / CurrentCore的倍数。
  • 优化基本块切分将影响搬运数据的效率,算子搬运的总数据量为搬运的左矩阵和右矩阵数据量之和。根据矩阵乘法的算法,搬运左矩阵的次数为N / baseN,搬运右矩阵的次数为M / baseM,即搬运总数据量totalCnt = (N / baseN) * M * K + (M / baseM) * K * N。预估性能收益为搬运数据量的比值,优化前搬运数据量totalCnt0/优化后搬运数据量totalCnt1,化简后结果为(1 / baseM0 + 1 / baseN0) / (1 / baseM1 + 1 / baseN1),其中,baseM0, baseN0为优化前基本块参数,baseM1, baseN1为优化后基本块参数。
  • 开启大包搬运后,指令条数变化、地址对齐等因素会影响性能,按
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值