ZHCU881C May   2020  – December 2023

 

  1.   1
  2.   请先阅读
    1.     关于本手册
    2.     相关文档
    3.     商标
  3. 2引言
    1. 2.1 C7000 数字信号处理器 CPU 架构概述
    2. 2.2 C7000 分离式数据路径和功能单元
  4. 3C7000 C/C++ 编译器选项
    1. 3.1 概述
    2. 3.2 为性能选择编译器选项
    3. 3.3 了解编译器优化
      1. 3.3.1 软件流水线
      2. 3.3.2 矢量化和矢量谓词
      3. 3.3.3 自动使用流引擎和流地址生成器
      4. 3.3.4 循环折叠和循环合并
      5. 3.3.5 自动内联
      6. 3.3.6 if 转换
  5. 4基本代码优化
    1. 4.1  迭代计数器和限制的有符号类型
    2. 4.2  浮点除法
    3. 4.3  循环携带依赖和 restrict (限制)关键字
      1. 4.3.1 循环携带依赖
      2. 4.3.2 restrict (限制)关键字
      3. 4.3.3 运行时别名消歧
    4. 4.4  函数调用和内联
    5. 4.5  MUST_ITERATE 和 PROB_ITERATE Pragma 与属性
    6. 4.6  if 语句和嵌套的 if 语句
    7. 4.7  内在函数
    8. 4.8  矢量类型
    9. 4.9  待使用和避免的 C++ 特性
    10. 4.10 流引擎
    11. 4.11 流地址生成器
    12. 4.12 优化库
    13. 4.13 存储器优化
  6. 5了解汇编注释块
    1. 5.1 软件流水线处理阶段
    2. 5.2 软件流水线信息注释块
      1. 5.2.1 循环和迭代计数信息
      2. 5.2.2 依赖和资源限制
      3. 5.2.3 启动间隔 (ii) 和迭代
      4. 5.2.4 常量扩展
      5. 5.2.5 使用的资源和寄存器表
      6. 5.2.6 阶段折叠
      7. 5.2.7 存储器组冲突
      8. 5.2.8 循环持续时间公式
    3. 5.3 单个调度迭代注释块
    4. 5.4 识别流水线故障和性能问题
      1. 5.4.1 阻止循环进行软件流水线作业的问题
      2. 5.4.2 软件流水线故障消息
      3. 5.4.3 性能问题
  7. 6修订历史记录

阶段折叠

在某些情况下,编译器可以通过一种称为阶段折叠 的转换,减少软件流水线循环的最小安全迭代计数。有关阶段折叠的信息显示在软件流水线信息注释块中。示例如下所示。

阶段折叠始终有助于缩减代码大小。阶段折叠通常有利于提高性能,因为它可以减少软件流水线循环的最小安全迭代计数,这样当循环执行的次数很少时,软件流水线循环很可能执行(速度更快),而且不必将执行转移到重复循环(速度更慢且不是软件流水线)。

;*      Epilog not entirely removed
;*      Collapsed epilog stages       : 2
;*
;*      Prolog not removed
;*      Collapsed prolog stages       : 0
;*
;*      Max amt of load speculation   : 128 bytes
;*
;*      Minimum safe iteration count  : 3 (after unrolling)

上例中的反馈显示了两个结尾阶段已折叠。但是,编译器无法折叠任何开场阶段,所以无法将软件流水线循环的最小安全迭代计数减小到 1(这是最好的情况)。 软件流水线循环开场或结尾无法删除的技术原因很复杂,编程人员也很难影响这种结果。

执行阶段折叠时,编译器可能生成推测式执行加载指令的代码,意味着加载结果可能得不到使用。在编译器需要推测式执行加载指令的情况下,如果访问的地址超出了合法存储器的范围,则编译器只对不会导致异常的加载指令执行此操作。有关“Max amt of load speculation”的反馈告知您加载推测将访问的地址超出正常地址访问范围的程度。