ZHCAFZ0 November 2025 AM62A7 , AM67A , TDA4AL-Q1 , TDA4VE-Q1 , TDA4VEN-Q1 , TDA4VH-Q1 , TDA4VM , TDA4VP-Q1
在电路板上运行模型时,设置调试级别可以在模型执行期间输出内存要求。使用 /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 的各个部分分配的存储空间。
图 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 堆时都需要配置以下四种大小:
我们只需根据内存块是否可缓存,是持久化块还是暂存块,来对图 1 中的内存块进行分类和求和,即可获得需要为上述四个块配置的相应大小。在具有多个 C7xMMA 的芯片中,需要根据这种方法为每个 C7x 配置其自身的四个内存块。
读者可能还会注意到,在 gen_linker_mem_map.py 中,除了 C7x 堆外,还有一些名为 c7x_x_ddr_size 的内存块。这些内存块负责存储 IPC 通信、MCU 启动固件、基本运行时所需堆栈等,并可根据实际使用情况酌情减少。
请注意,配置内存映射时,请严格遵循文档中的内存对齐和最小内存要求。