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

运行时别名消歧

在某些限定的情况下,编译器可生成两个循环:一个循环假定两个指针没有别名,另一个循环假定两个指针有别名。编译器生成运行时检查,以确定两个指针是否有别名。此优化称为运行时别名消歧。其优点在于,假定指针无别名的循环通常可以按更小的启动间隔进行软件流水线,从而提高循环性能。

由于技术性太强,无法在此进行描述,故编译器无法总是执行运行时别名消歧。此外,当编译器使用运行时别名检查生成两个不同的循环时,会抑制嵌套循环合并之类的某些进一步优化操作,因此最好在合法的前提下使用restrict (限制)关键字。

关于识别和消除循环携带依赖的进一步讨论和详细信息,请参阅以下参考资料:

  • TMS320C6000 编程器指南 (SPRU198K),第 2.2.2 节“存储器依赖”
  • 手动调优 TMS320C6000 上的循环和控制代码 (SPRA666),第 4.1 节“使用 restrict (限制)限定符、MUST_ITERATE pragma 和 _nasserts()”