DSP ISS 仿真

使用指令集仿真器(Instruction Set Simulator ISS)进行程序分析(profile),可以帮助开发者在性能调优阶段快速定位性能瓶颈,从而优化算法架构。 ISS 仿真中的逻辑单元计算能力基本与真实芯片相同(如数据/代码均在缓存中的情况下,Cache 和 DTCM 的内存特性从配置中获取,可以确保此部分的准确性)。 在仿真环境下,系统内存只支持一种,因此 ISS 系统内存模型只能配置为 PSRAM 或 SRAM。 内存模型的差异会引入性能误差。根据不同程序特性,仿真误差一般在 10%以内,最大约为 20%。

Note

  • 不支持多核心 IPC 通信,仅支持 DSP 内核算法仿真。

  • 由于是精准指令仿真,仿真速度较慢,进行大型项目仿真时耗时较长。

  • 建议使用 Xplorer 的 GUI 界面进行仿真。如果在 Linux 服务器上安装了 Xplorer,可以开启服务器的 X11 远程 GUI 进行使用。

编译工程

  1. 修改 <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
    
  2. 编辑代码并添加 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);
    }
    
  3. 重新编译工程。

配置和启动仿真

  1. 在工具栏点击 Debug > Profile Configurations,按需重命名仿真任务名称,并在 Profiling Mode Options 选项中勾选 Enable ISA profiling

  2. Memory Modeling Options 选项中修改 SRAM 和 PSRAM 的仿真参数(默认代码和数据是在 PSRAM 中):

    项目

    SRAM读取

    SRAM写入

    PSRAM读取

    PSRAM写入

    Memory Waitstates(cycles)

    16

    2

    28

    28

    Repeat Block Waitstates(cycles)

    2

    2

    8

    8

    ../../_images/create_manage_and_run_configurations.png
  3. 点击 ApplyProfile 启动仿真。

    也可以点击下图中的设置按钮进行仿真。注意不能直接点击工具栏上的 profile 按钮,否则默认没有内存延迟模型。

    ../../_images/click_setting_to_start_simulation.png

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

    ../../_images/statistical_results_in_simulation_window.png

    Note

    若在启动仿真时出现下方弹窗,请注意 Start with counting off 选项的提示窗口是错误的(command 多了”s”)。

    ../../_images/wrong_start_with_counting_off_option_prompt_window.png

    应为:

    xt_iss_client_command("all", "enable")
    

CMD 仿真

  1. 查看仿真指令

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

    ../../_images/xplorer_simulation_instructions_in_console.png
    /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
    
  2. 修改指令

    用户需要根据实际项目配置及文件路径进行调整。如果在 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)就需据实际情况修改到 ELF 文件所在位置。

  3. 运行指令

    在终端中正常运行上面的命令即可。

Profile 与 FreeRTOS Task 问题

当前,Xplorer 提供的 profile 方法对于异常和中断函数调用的处理还不完善,一般算法调优也可以独立于 FreeRTOS 系统进行。因此,我们强烈不推荐在 FreeRTOS 系统下进行 profile。

如果用户必须在 FreeRTOS Task 环境里 profile:

  • profile 时防止上下文切换和处理中断服务。

  • 进入统计区域前完成一次 lazy switch。因为 FreeRTOS 的任务切换不会改变协处理器寄存器,仅当任务用到这些 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 结果如下:

../../_images/expected_result_of_profiling.png

如果取消第一次 co_processor_func() 的调用,则会发现出现了部分异常 handler,Xplorer 对这些 handler 的统计会出错: Profile (Cycles) 表统计正确,但 Call-Graph 表会出现统计错误。

../../_images/cancel_the_first_call_of_co_processor_func.png

参考文档

  • 具体 ISS 仿真方法和 profile 结果分析,请参考 Xtensa 文档