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

存储器优化

改善数据加载和存储的优化措施通常对应用的性能至关重要。对 Keystone 3 器件上有用的存储器优化的详细检查不在本文档讨论的范围之内。但是,下述列出了用于提高存储器系统吞吐量和减少存储器层次结构延迟的最常见的优化措施。

  • 分块:输入、输出和临时数组/对象通常太大,无法放入多核共享存储器控制器 (MSMC) 或 L2 存储器中。例如,在对整个 1000x1000 像素的图像上执行算法时,图像太大了以至于无法放入到大部分或所有配置的 L2 存储器中,而且算法可能会冲击缓存,导致性能低下。使数据尽可能靠近 CPU 可以提高存储器系统的性能,但是当图像太大而无法放入 L2 缓存时,我们该如何做到这一点呢?根据算法的不同,使用一种称为“分块”的技术可能很有用,其中算法修改为在给定时间只对一部分数据进行操作。一旦处理完该数据“块”,算法会移到下一块。此技术通常与此列表中的其他技术搭配使用。
  • 直接存储器访问 (DMA):考虑使用器件的异步 DMA 功能将新数据移动到 MSMC 存储器或 L2 存储器中,并使用 DMA 将处理过的数据移出。这样,C7000 CPU 就可以自由地执行计算,同时 DMA 为下一帧、块或层准备数据。
  • 乒乓缓冲器:考虑使用乒乓存储缓冲器,以使 C7000 CPU 在处理一个缓冲器中的数据时,正在向/从另一个缓冲器进行 DNA 传输。当 C7000 CPU 处理完第一个缓冲器时,算法切换到第二个缓冲器,如此因 DMA 传输而有了新数据。考虑将这些缓冲器放在 MSMC 或 L2 存储器中,这比 DDR 存储器快得多。