DSP ISS 仿真
使用指令集仿真器(Instruction Set Simulator ISS)进行程序分析(profile),可以帮助开发者在性能调优阶段快速定位性能瓶颈,从而优化算法架构。
特别提示:
不支持多核心 IPC 通信,仅支持 DSP 内核算法仿真。
ISS 仿真中的逻辑单元计算能力基本与真实芯片相同(如数据/代码均在缓存中的情况下,Cache 和 DTCM 的内存特性从配置中获取,可以确保此部分的准确性)。
然而,由于系统内存只支持 PSRAM 或 SRAM 参数,ISS 系统内存模型只能配置为 PSRAM 或 SRAM。 内存模型的差异会引入性能误差。根据不同程序特性,仿真误差一般在 10%以内,最大约为 20%。
由于是精准指令仿真,仿真速度较慢,进行大型项目仿真时耗时较长。
建议使用 Xplorer 的 GUI 界面进行仿真。如果在 Linux 服务器上安装了 Xplorer,可以开启服务器的 X11 远程 GUI 进行使用。
编译工程
修改 LSP specs 文件(
<dsp sdk>\project\RTK_LSP\RI-2021.8\HIFI5_PROD_1123_asic_UPG\RTK_LSP\specs
)内容:*startfile: crt1-sim%O%s crti%O%s crtbegin%O%s _sharedvectors%O%s _vectors%O%s *endfile: crtend%O%s crtn%O%s *lib: -lc -lsim -lc -lhandler-reset -lhandlers-sim -lhal -lc
编辑代码并添加
exit()
仿真退出函数,例如:#include <xtensa/sim.h> int main() { xt_iss_client_command("isa_profile", "enable"); xt_profile_enable(); // "Start with counting off" Option app_example(); // function for profile xt_profile_disable(); exit(1); }
重新编译工程:
仿真配置和启动
在工具栏点击
:按需重命名仿真任务名称,并在 Profiling Mode Options 列勾选所需功能。
其中,需勾选 Enable ISA profiling。 Start with counting off 包含提示函数,可控制需要统计 profile 信息的代码段的开始和结束位置。 否则会从上电一直统计到
exit()
。SRAM 和 PSRAM 的仿真参数如下(默认代码/数据在 PSRAM 中):项目
SRAM读取
SRAM写入
PSRAM读取
PSRAM写入
内存等待周期(cycles)
16
2
28
28
循环块等待周期(cycles)
2
2
8
8
点击 Apply 和 Profile to 启动仿真。
注意,下面图片中 Start with counting off 选项的提示窗口是错误的(command 多了”s”)。
应为:
xt_iss_client_command("all", "enable")
也可以点击下图中的设置按钮进行仿真。注意不能直接点击工具栏上的 profile 按钮,否则默认没有内存延迟模型。

在仿真窗口的标签栏中有各种统计结果:

CMD 仿真
仿真完成后,可以点击下方的 Console 查看 Xplorer 仿真指令,例如:

保存该指令,例如:
/opt/xtensa/XtDevTools/install/tools/RI-2021.8-linux/XtensaTools/bin/xt-run --xtensa-core=HIFI5_PROD_1123_asic_UPG --xtensa-system=/opt/xtensa/XtDevTools/install/builds/RI-2021.8-linux/HIFI5_PROD_1123_asic_UPG/config --xtensa-params= --console --mem_model --wbsize=32 --mlatency=28 --blockrepeat=8 --write_delay=28 --write_repeat=8 --summary --client=<dsp sdk>/project/project_dsp/bin/HIFI5_PROD_1123_asic_UPG/Release/_gen_d/profile/--psram_--_project_dsp_-_HIFI5_PROD_1123_asic_UPG_-_Release/p_10/iss.clientcmds --vector=1 --alt_reset_vec=0x60301000 <dsp sdk>/project/project_dsp/bin/HIFI5_PROD_1123_asic_UPG/Release/project_dsp
可以用上述命令进行仿真。但需要根据实际项目配置及路径进行调整。注意,如果在 Linux 下使用 auto_build.sh
脚本编译 project_dsp,需要根据实际情况修改 xt-run 命令。
例如,auto_build.sh
会将项目拷贝到 <dsp sdk>/auto_ws
目录再编译。
CMD 最后参数( /home/miles_wang/dsp_sdks/20230216_ISS_SIM/dsp/project/project_dsp/bin/HIFI5_PROD_1123_asic_UPG/Release/project_dsp
)需据实际情况修改。
Profile 与 RTOS Task 问题
当前,Xplorer 提供的 profile 方法对于异常和中断函数调用的处理还不完善。一般算法调优也可以独立于 RTOS 系统进行。因此,我们强烈不推荐在 RTOS 系统下进行 profile。
如果用户必须在 RTOS task 环境里 profile:
profile 时防止上下文切换和处理中断服务。
进入统计区域前完成一次 lazy switch。因为 RTOS 的任务切换不会改变协处理器寄存器,仅当任务用到这些 DSP 寄存器时,才会生成协处理器寄存器异常。
例如:
void profiling_task(void)
{
int start, end;
vTaskEnterCritical();
co_processor_func(test_array); // this function uses DSP co-processor registers start = xthal_get_ccount();
xt_iss_client_command("isa_profile", "enable");
xt_profile_enable();
for (int i = 0; i < 1000; ++i) {
co_processor_func (test_array);
}
xt_profile_disable ();
end = xthal_get_ccount();
vTaskExitCritical();
printf("%d cycles\n", end-start); // output: 314313 cycles
exit(1);
}
profile 结果如下:

如果取消第一次 co_processor_func()
的调用,则会发现出现了部分异常 handler,Xplorer 对这些 handler 的统计会出错:

Profile (Cycles) 表统计正确,但 Call-Graph 表会出现统计错误。
参考文档
具体 ISS 仿真方法,参考 Xplorer 安装目录下的 Xtensa 文档 inst_set_sim_ug.pdf。
profile 结果分析可参考 gnu_profiler_ug.pdf。