算子优化分析

维度一:分析向量运算

通过分析仿真dump文件:

  1. 算子Vector执行效率偏低时,找出执行效率低的Vector向量指令。
  2. mte2搬运粒度较低导致Vector计算的输入数据较少。
  3. 是否使能多核资源。
  4. 多核场景下,核之间的Vector计算量是否分配均衡。

分析结果如下:

表1 输出字段说明

字段

说明

Instruction

指令名称。

First PC

指令地址,根据取值仿真dump文件中可搜索到对应的重复向量指令。

Execution Times

向量指令被重复执行的次数。

Repeat

即repeat_times参数,表示一条向量指令的重复迭代次数,取值范围为(0,255]。

Mask

向量内参与计算的元素,取值范围为[1,128],单位为bits。每一个bit位用来表示vector的每个元素是否参与操作,bit位的值为1表示参与计算,0表示不参与计算。

注:有关分析向量指令执行效率的具体参数应用请参见TBE&AI CPU算子开发指南中的“接口参考>TBE TIK API>矢量计算>单目”章节。

表2 优化建议

输出建议

中文含义

Try to optimize vector instructions

优化Vector指令。

Try to optimize out->ub data move instructions

优化out->ub数据搬运指令。

Try to use multi-core resources

使能多核。

Try to reallocate vector calculations to these cores: 0 1

重新分配Vector计算数据到这些核:0 1。

优化Vector指令可以通过修改向量指令参数mask和repeat_times,替代重复执行的向量指令。

根据字段First PC的值从仿真dump文件中可搜索到对应的重复向量指令,假设Execution Times取值为64,Repeat取值为1,Mask取值为1,则该指令被重复执行了64次,而一次执行只进行了一次迭代计算,每次只计算了该向量中的一位元素。那么为了提高该指令的执行效率,可以通过修改算子代码中的repeat_times参数值为64,最后根据向量位数以及实际需求修改mask的值,修改后该指令只需执行一次即可完成64次迭代计算并且每次计算都完成向量在场景下要求计算的所有元素,从而提升该条指令执行的效率。

维度二:分析流水打断

根据仿真dump文件,针对占比最大的流水进行分析,主要从三个维度进行:

  1. 其它流水导致的流水不连续。
  2. 指令入队列导致的流水不连续。
  3. pipe_barrier(PIPE_ALL)导致的流水打断。

根据分析的结果,对上述三个维度造成影响的周期数进行排序,结果展示如下:

表3 输出字段说明

字段

说明

Interruption Factor

流水打断因素。

Affected Pipeline

受影响的流水。

Interruption Cycles

流水打断的周期数。

Percentage to Total

打断周期数占总周期数的百分比。

表4 优化建议

输出建议

中文含义

Try to use the double buffer for UB

使用乒乓策略。

Reduce strong data dependencies between pipelines

优化不合理的流水依赖。

Eliminate improper instruction synchronization between pipelines

消除流水间不合理的指令同步。

Delete redundant pipe_barrier(PIPE_ALL)

删除冗余pipe_barrier(PIPE_ALL)指令。

维度三:分析标量运算

根据仿真dump文件,统计Scalar标量指令执行次数和总的执行周期,按总的执行周期的大小进行排序,选出Top5个Scalar标量指令,分析结果如下:

表5 输出字段说明

字段

说明

Instruction

指令名称。

Execution Times

标量指令被重复执行的次数。

Execution Cycles

标量指令的总执行周期。

表6 优化建议

输出建议

中文含义

Try to adjust tiling policy

调整tiling策略。

Try to optimize the implementation solution

优化实现方案。

Try to replace instructions with poor performance

替换性能差的指令。

维度四:Memory bound

通过分析仿真dump文件,找出内存搬运类性能瓶颈:

  1. 小包搬运:在算子一次运算内若没有达到OUT->UB/UB->OUT/L1->UB通道阈值,则判定为小包搬运。

    OUT->UB/UB->OUT/L1->UB通道阈值为:Vector最大一次运算可以计算两个128长度的fp16类型向量相加或相乘,即128 * 2 * 2B = 512B。

  2. 冗余搬运:计算冗余度 = 搬运量 / 计算量,冗余度大于1.2则存在冗余搬运。

    搬运量为OUT->UB搬运量,计算量为VECTOR计算量。

  3. 带宽抢占:分析OUT->UB/OUT->L1搬运指令的运行时间是否存在重合,找出可能存在的mte2带宽抢占。

分析结果如下:

表7 优化建议

输出建议

中文含义

Small packets are transferred in such channels as out->ub. Combine the transfer instructions for optimization

存在小包搬运,涉及通道OUT->UB,尝试合并搬运指令进行优化。

Redundant transfer exists. Optimize the data transfer policy

存在冗余搬运,尝试优化数据搬运策略。

Bandwidth preemption exists. Adjust the transfer instruction sequence

存在带宽抢占,尝试调整搬运指令时序。