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

循环折叠和循环合并

如果折叠合并 嵌套循环合法而且可提高性能,那么编译器会尝试这么做。嵌套循环 是两个循环的集合,其中一个循环位于另一个封闭循环的内部。折叠和合并都涉及到将嵌套循环转换为单个循环。当外循环中没有代码时,就会发生折叠。当外循环中有代码时,就会发生合并。

两个嵌套循环组合成一个循环之后,必须转换外循环主体中的代码,从而仅在必要时有条件地执行该代码。折叠和合并都有利于性能,因为在执行循环嵌套时只执行一次 pipe-up (加速)和pipe-down(减速),若不执行循环合并/折叠,则每次执行外循环时都要执行内循环的pipe-up (加速)和 pipe-down(减速)。

要执行循环折叠或循环合并,合成的循环必须能够进行软件流水线作业。这意味着循环嵌套不能包含函数调用。每个循环必须有一个带符号的计数迭代器,每次迭代固定的次数。也就是说,内循环的迭代次数不能取决于外循环迭代的情况。此外,外循环不能包含太多代码,否则转换无法提高性能。如果外循环具有存储器依赖性,则可能不会执行循环合并和循环折叠。

当发生循环折叠或循环合并时,软件流水线循环会在软件信息注释块的顶部附近指示起始循环源代码行(“Loop source line”)。当此源代码行号引用一个外循环时,这表示内循环已经完全展开,或者编译器已经执行循环合并或折叠。在循环合并的情况下,编译器使用特殊指令,例如 NLCINIT、TICK、GETP 和 BNL。这些硬件特性的说明(包括所谓的“NLC”)不在本文档的范围内。有关 NLC 的更多详细信息,可参阅 C71x DSP CPU、指令集和矩阵乘法加速器技术参考手册 (SPRUIP0)。