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

使用的资源和寄存器表

资源分区表总结了如何将指令分配给各种机器资源以及如何在 A 端和 B 端之间对指令进行划分。下面显示了一些示例。

星号 (*) 标记决定资源限制值(也就是最大 mii)的条目。因为许多 C7000 指令可以在多个功能单元上执行,所以该表按照可能的资源组合将功能单元分成几类。

  • 单个功能单元(.L、.S、.D、.M、.C 单元等)显示专门需要该单元的指令总数。可在多个功能单元上操作的指令不包括在这些计数中。
    ;*      .S units                                     0        0     
    ;*      .M units                                     4       12*    
    ...
  • 分组功能单元(.M/.N、.L/.S、.L/.S/.C 等)显示可在所有列出的功能单元上执行的指令总数。例如,如果 .L/.S 行显示 A 端值为 14,B 端值为 12,则意味着在 .L1 或 .S1 上将执行 14 条指令,在 .L2 或 .S2 上将执行 12 条指令。
    ;*      .L/.S units                                  1        8     
    ;*      .L/.S/.C units                               0        0     
    ...
  • .X 交叉路径显示了将数据从一个数据路径移动到另一个数据路径(A 到 B 或 B 到 A)所需的交叉路径总线的数量。
    ;*      .X cross paths                              13*       0     
  • 限制:当仅考虑可在该行上列出的一组功能单元上操作的指令时,显示循环可进行软件流水线处理的最小 ii。例如,如果 .L .S .LS 行显示 A 端值为 3,B 端值为 2,则意味着有足够的指令需要在 .L 和 .S 上运行,在软件流水线调度中需要为 .L1 和 .S1 安排三个周期,并为 .L2 和 .S2 安排两个周期。请注意,.L .S .LS 符号意味着我们考虑只能在 .L 单位上运行的指令、只能在 .S 单位上运行的指令或可以在 .L 或 .S 上运行的指令。
    ;*      Bound(.L .S .LS)                             1        4     
  • 寄存器使用表编译器显示了在软件流水线内核的每个周期中使用哪些 CPU 寄存器。您很难使用此信息来提高循环性能,但是可以由此了解整个循环中有多少寄存器处于活动中。
    ;*                   Regs Live Always   :  6/ 1/ 4/
    ;*                   Max Regs Live      : 56/26/29/
    ;*                   Max Cond Regs Live :  0/ 0/ 0/