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

阻止循环进行软件流水线作业的问题

以下情景可能会妨碍循环形成软件流水线。通过检查注释块中的汇编输出和软件流水线信息可发现这些问题。

  • 循环包含函数调用:虽然软件流水线循环可包含内在函数,但不能包含函数调用。这包括将导致调用不可内联的运行时支持例程的代码,例如浮点除法。您可以尝试内联用户定义的小函数;参阅节 3.3.5
  • 循环包含控制代码:在某些情况下,编译器不能从 if-then-else 语句或“?:”语句中删除所有的控制流。您可以尝试通过仅在更新存储器的代码周围以及在循环内部计算且仅在循环外部使用的变量周围使用 if 语句来优化这种情况。
  • 有条件递增的循环控制变量未经软件流水线处理。如果循环包含有条件递增的循环控制变量,则编译器无法对循环进行软件流水线处理。
    for (i = 0; i < x; i++)
    {
        . . .
        if (b > a)
            i += 2
    }
    
  • 指令太多。由于超大循环需要大量的寄存器,所以通常无法调度。然而,有些大循环需要过长的时间进行编译。潜在的解决方案是将大循环分解成多个更小的循环。
  • 未初始化的迭代计数器。循环计数器可能未设置为初始值。
  • 无法识别迭代计数器。循环控制过于复杂。尝试简化循环。