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 (限制)关键字

为了纠正前面示例中由循环携带依赖导致的问题,我们需要告知编译器,这些数组在存储器中不重叠,因此一个迭代与下一个迭代之间不存在存储器依赖关系。

许多常见的数字信号处理循环包含一个或多个加载操作、一些计算以及一个存储操作。通常,加载从数组中读取,存储则将值存储到数组。如果编译器不知道数组是独立的(或不重叠),那么编译器必须是保守的,并假定在迭代 i+1i+2 等的加载中可能需要存储迭代 i 。因此,重要的是务必告知编译器负载和存储数组是否位于完全不同的存储器区域(也就是说,指向的对象/数组不重叠)。

为此,我们可以使用 restrict(限制) 关键字来实现这一点。此关键字告知编译器,在整个变量范围内(用于访问数组的数组名称或指针名称),只能通过该数组名称或指针名称访问该对象或数组。

注: 对 restrict (限制)指针的这种描述并不完全准确;但在大多数用途中已经足够。如果您想要详细了解restrict (限制)关键字,请参阅 C 标准或揭秘 restrict (限制)关键字

使用restrict (限制)关键字允许有效地告知编译器,存储到存储器的数据不会写入下一次迭代的加载所读取的位置。因此,当编译器执行软件流水线时,连续的迭代可以重叠,从而使生成的代码运行得更快。

此 C 函数示例使用了restrict (限制)关键字。生成的软件流水线信息注释块将显示,使用restrict (限制)关键字时,循环携带依赖限制为 0,而分区资源限制为 2。这会将大大缩短两个周期的启动间隔 (ii)。

void weighted_sum(int * restrict a, int *restrict b, int *restrict out,
                  int weight_a, int weight_b, int n)

尽管restrict (限制)关键字不是 C++14 或 C++17 标准中的一部分,但德州仪器 (TI) C7000 C/C++ 编译器允许在 C 和 C++ 模式中使用restrict (限制)关键字。

注: 如果不正确地使用了restrict (限制)关键字,编译器通常会生成具有未定义行为的代码,意味着编译器生成的代码将产生不正确的结果。