算子优化分析
维度一:分析向量运算
通过分析仿真dump文件:
- 算子Vector执行效率偏低时,找出执行效率低的Vector向量指令。
 - mte2搬运粒度较低导致Vector计算的输入数据较少。
 - 是否使能多核资源。
 - 多核场景下,核之间的Vector计算量是否分配均衡。
 
分析结果如下:

| 
          输出建议  | 
        
          中文含义  | 
       
|---|---|
| 
          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文件,针对占比最大的流水进行分析,主要从三个维度进行:
- 其它流水导致的流水不连续。
 - 指令入队列导致的流水不连续。
 - pipe_barrier(PIPE_ALL)导致的流水打断。
 
根据分析的结果,对上述三个维度造成影响的周期数进行排序,结果展示如下:

| 
          字段  | 
        
          说明  | 
       
|---|---|
| 
          Interruption Factor  | 
        
          流水打断因素。  | 
       
| 
          Affected Pipeline  | 
        
          受影响的流水。  | 
       
| 
          Interruption Cycles  | 
        
          流水打断的周期数。  | 
       
| 
          Percentage to Total  | 
        
          打断周期数占总周期数的百分比。  | 
       
| 
          输出建议  | 
        
          中文含义  | 
       
|---|---|
| 
          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标量指令,分析结果如下:

| 
          字段  | 
        
          说明  | 
       
|---|---|
| 
          Instruction  | 
        
          指令名称。  | 
       
| 
          Execution Times  | 
        
          标量指令被重复执行的次数。  | 
       
| 
          Execution Cycles  | 
        
          标量指令的总执行周期。  | 
       
| 
          输出建议  | 
        
          中文含义  | 
       
|---|---|
| 
          Try to adjust tiling policy  | 
        
          调整tiling策略。  | 
       
| 
          Try to optimize the implementation solution  | 
        
          优化实现方案。  | 
       
| 
          Try to replace instructions with poor performance  | 
        
          替换性能差的指令。  | 
       
维度四:Memory bound
通过分析仿真dump文件,找出内存搬运类性能瓶颈:
- 小包搬运:在算子一次运算内若没有达到OUT->UB/UB->OUT/L1->UB通道阈值,则判定为小包搬运。
      
OUT->UB/UB->OUT/L1->UB通道阈值为:Vector最大一次运算可以计算两个128长度的fp16类型向量相加或相乘,即128 * 2 * 2B = 512B。
 - 冗余搬运:计算冗余度 = 搬运量 / 计算量,冗余度大于1.2则存在冗余搬运。
      
搬运量为OUT->UB搬运量,计算量为VECTOR计算量。
 - 带宽抢占:分析OUT->UB/OUT->L1搬运指令的运行时间是否存在重合,找出可能存在的mte2带宽抢占。
 
分析结果如下:

| 
          输出建议  | 
        
          中文含义  | 
       
|---|---|
| 
          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  | 
        
          存在带宽抢占,尝试调整搬运指令时序。  |