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

依赖和资源限制

软件流水线的第二阶段涉及收集循环资源和依赖图信息。阶段 2 的结果显示在软件流水线信息注释块中,如下所示:

;*      Loop Carried Dependency Bound(^) : 2
;*      Unpartitioned Resource Bound     : 12
;*      Partitioned Resource Bound       : 12 (pre-sched)

此部分提供的统计信息如下:

  • 循环携带依赖限制:最大循环携带路径的距离(如果存在)。当循环的一次迭代写入在未来迭代中必须读取的值时,便会出现循环携带路径。属于循环携带限制中的一部分的指令用 ^ 符号标记。针对循环携带依赖限制显示的数字是因循环的循环携带依赖限制导致的最小迭代间隔。

    如果循环携带依赖限制大于资源限制,可能导致循环效率低下,您可以通过向编译器传递附加信息来提高性能。节 4.3讨论了这种情况的潜在解决方案。

  • 未分区资源限制:编译器将每条指令分区到 A 端或 B 端之前,最佳情况下资源限制的最小迭代间隔 (mii)。
  • 分区资源限制(调度前、调度后):指令分区到 A 端或 B 端之后的 mii。给出了调度前和调度后的值。调度后的值为调度发生后的分区资源限制。调度有时涉及到添加指令,这可能会影响资源限制。