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

为性能选择编译器选项

在应用经过全面调试并正常工作之后,就该开始优化过程了。首先,您需要选择适当的编译器选项。以下编译器选项会影响性能。有关命令行选项的更多详细信息,请参阅 C7000 C/C++ 编译器用户指南 (SPRUIG8)。

  • --opt_level=3 (-o3)。编译器在 -opt_level=2 下执行函数级优化,并在 -opt_level=3 下执行文件级优化和函数内联。在 --opt_level=2 和 --opt_level=3 下,编译器执行各种循环优化,例如软件流水线、矢量化和循环合并。默认情况下,--opt_level 开关会对性能进行优化。此类优化可增加代码大小。如果代码大小构成问题,请勿降低优化级别。相反,使用 --opt_for_speed (-mf) 开关更改优化目标(性能与代码大小之间的对比关系)并使用 –oi 选项控制自动内联的数量。
  • --opt_level=4 (-o4)。考虑使用此选项在链接时对所有文件执行优化。使用此选项可显著增加编译时间。如果在任何步骤中使用此选项,则必须在所有编译和链接步骤中使用该选项。只要源文件是使用 --opt_level=4 进行编译的,则都可以单独编译。此优化级别无法与 --program_level_compile (-pm) 一起使用。
  • --gen_func_subsections (-mo)。如果源代码使用许多从未调用的函数,请考虑使用此选项。此选项将每个函数放在自身的输入子段中,因此,如果该函数从未被引用,则链接器可以从可执行文件中排除该函数。但是,这种优化可增加代码大小,因为编译器必须应用最小的段对齐要求。
  • --opt_for_speed=0 (-mf0) 或 --opt_for_speed=1 (-mf1)。如果代码大小构成问题,那么在编译包含不常执行的函数或对性能微不足道的函数的文件时,请使用这些选项。这会告诉编译器优化代码大小,而非性能。请勿为了减小代码大小而降低优化级别 (--opt_level)。

如果您关心性能,请勿使用 --disable_software_pipelining (-mu) 选项。此选项会关闭软件流水线。软件流水线对于在大多数循环上实现高性能至关重要。此选项可以作为调试工具,因为其使汇编代码更容易理解。

以下选项提供了用于调试和性能评估的附加信息:

  • --src_interlist (-s)。此选项使编译器在编译器生成的汇编文件中发送经过高级优化的源代码副本。此输出作为汇编代码中的注释置于汇编文件中。优化器的注释输出看起来像 C 代码,并显示了已应用的高级转换,例如内联、循环合并和矢量化。此选项有助于您理解汇编代码以及编译器为优化代码性能所做的一些工作。此选项会开启 --keep_asm (-k) 选项,因此编译器生成的汇编文件 (.asm) 将不会被删除。

    --debug_software_pipeline (-mw)。此选项提供有关软件流水线循环的额外信息,包括循环的单次调度迭代。本文档后续介绍的循环调优示例中将使用此信息。此选项会开启 --keep_asm (-k) 选项,因此编译器生成的汇编文件 (.asm) 将不会被删除。

    --gen_opt_info=2 (-on2)。此选项创建 .nfo 文件,其基本名称与 .obj 文件相同。此文件包含有关已应用的高级优化的摘要信息以及提供建议。