ZHCAFZ0 November   2025 AM62A7 , AM67A , TDA4AL-Q1 , TDA4VE-Q1 , TDA4VEN-Q1 , TDA4VH-Q1 , TDA4VM , TDA4VP-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2C7xMMA DDR 使用情况分析和优化
  6. 3测试基于 J722S 和 MobileNet
    1. 3.1 固件编译和环境配置
    2. 3.2 模型导出和板载推理
    3. 3.3 内存统计信息
    4. 3.4 修改内存映射
    5. 3.5 重新编译 SDK 并更新到电路板
    6. 3.6 板载测试
  7. 4总结
  8. 5参考资料

C7xMMA DDR 使用情况分析和优化

在电路板上运行模型时,设置调试级别可以在模型执行期间输出内存要求。使用 /opt/tidl_test/TI_DEVICE_armv8_test_dl_algo_host_rt.out 并将 debugTraceLevel 设置为 2,或使用 edgeai-tidl-tools 并将 debug_level 设置为 2,或在使用 TIOVX 应用时,在 TIDL_CreateParams 中将 traceLogLevel 设置为 2。在进行模型推理之前,运行 /opt/vision_apps/vision_apps_init.sh 以启用 C7xMMA 日志记录。此时,进行模型推理将生成日志,如下图所示。这些日志会说明为 TIDL 的各个部分分配的存储空间。

计算机屏幕截图。该内容由 AI 生成,可能不正确。图 2-1 模型运行时内存空间分配

该表会显示内存分配记录,即打印 memRec 信息。MemRec 中有 16 条内存记录,记录了模型运行期间不同进程占用的存储空间。下面的内容简要介绍了各个说明的用途:

录音 说明 可缓存 属性
0 TIDL 实例 永久性
1 TIDL_CreateParams 占用的空间 永久性
2 L1D SRAM - 暂存
3 L2 SRAM - 暂存
4 L3 SRAM - 暂存
5 存储每层的固定输入,如权重 永久性
6 中间层输出结果(用于模型转换) 暂存
7 中间层输出结果(模型推理) 永久性
8 每个层临时使用的空间,用于累积输出值并取最大值。 暂存
9 存储统计信息和一些记录信息 暂存
10 每层的 sTIDL_AlgLayer_t 之和,记录每层的基本信息 永久性
11 每个层的算法应用使用的空间 暂存
12 在处理抢占时存储上下文 永久性
13 网络结构 永久性
14 用于多核模式下的多核同步 永久性
15 存储一些常量,例如卷积参数 永久性

为了提高 CPU 运行效率,应将 DDR 设置为尽可能可缓存。对于需要被其他内核访问的内存,必须将其设置为不可缓存,以避免多核系统中出现缓存一致性问题。持久化表示内存块中的数据长时间保持不变,而暂存则表示数据会频繁变化。

参考文档来配内存映射时,需要注意每次使用 C7 堆时都需要配置以下四种大小:

  • C7x_x_ddr_local_heap_size,对应可缓存持久化内存块
  • C7x_x_ddr_scratch_size,对应可缓存暂存内存块
  • C7x_x_ddr_local_heap_non_cacheable_size,对应不可缓存持久化内存块
  • C7x_x_ddr_scratch_non_cacheable_size,对应不可缓存暂存内存块

我们只需根据内存块是否可缓存,是持久化块还是暂存块,来对图 1 中的内存块进行分类和求和,即可获得需要为上述四个块配置的相应大小。在具有多个 C7xMMA 的芯片中,需要根据这种方法为每个 C7x 配置其自身的四个内存块。

读者可能还会注意到,在 gen_linker_mem_map.py 中,除了 C7x 堆外,还有一些名为 c7x_x_ddr_size 的内存块。这些内存块负责存储 IPC 通信、MCU 启动固件、基本运行时所需堆栈等,并可根据实际使用情况酌情减少。

请注意,配置内存映射时,请严格遵循文档中的内存对齐和最小内存要求。