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修订历史记录

MUST_ITERATE 和 PROB_ITERATE Pragma 与属性

当编译器知道循环将执行多少次时,通常可以生成更快的代码。通过 MUST_ITERATE 和 PROB_ITERATE pragma以及 TI_must_iterate 和 TI_prob_iterate C++ 属性添加此信息可帮助编译器:

  • 确定对循环进行矢量化循环是否有益
  • 确定执行某些循环优化和循环嵌套优化是否有益
  • 确定是否需要冗余循环(参阅下述冗余循环

在对循环进行矢量化之前,编译器试图确定这种改变是否会提高性能。如果编译器掌握关于循环迭代计数的信息,那么有助于编译器更好地预测矢量化的获利。同样,编译器还试图确定某些循环优化和循环嵌套优化是否有益,因此关于循环迭代计数的信息对编译器很有帮助。

注: 请勿在 MUST_ITERATE pragma 或 TI_must_iterate C++ 属性中提供错误的迭代计数信息。如果在此 pragma/属性中指定错误信息,则编译器可能创建产生意外和错误行为的代码。

冗余循环:在某些情况下,如果编译器不知道循环将执行多少次,那么编译器会生成两个不同版本的循环。软件流水线循环通常必须执行一定的最少迭代次数才能合法执行。如果循环迭代计数小于此最小安全迭代计数,那么编译器会生成运行时迭代计数检查,以及软件流水线版本的循环或重复循环 的分支。也就是说,编译器生成了“常规”版本的循环(执行速度慢很多)。

最小安全迭代计数取决于并行调度的迭代次数,以及编译器能够执行阶段折叠 优化的效率。有关更多 信息,请参阅节 5.2.6

汇编文件注释块中的软件流水线信息指定循环的最小安全迭代计数(迭代计数),并说明编译器是否生成了重复循环。

因为编译器有时必须生成冗余循环和在两个循环之间选择所必需的控制代码,所以在已知循环的最小迭代计数时,使用 MUST_ITERATE pragma 告知编译器是有帮助的,因为冗余循环可能不是必需的。这样可以提高性能,特别是当循环封闭在外循环中而且编译器可以对外循环和内循环执行循环折叠或其他循环优化的时候。

下述示例显示了汇编注释块的软件流水线信息部分中的冗余循环生成信息。

;*      Redundant loop generated
;*      Collapsed epilog stages       : 5
;*      Prolog not removed
;*      Collapsed prolog stages       : 0