上一篇说到CoreMark并未实现helium相关功能,但是通过观察coremark代码发现,coremark核心的代码就四个模块,list操作,crc校验,状态机,以及核心的矩阵运算。而通过查看源码,个人认为核心消耗算力的部分是crc计算和矩阵运算,其中矩阵运算是大头,而从helium提供的加速点来说,特别提到了矩阵计算,因此可以通过使用helium语法重写举证运算的方法测试helium对运算速度的影响。
移植操作
CoreMark核心文件
core_list_join.c ----- 链表相关的内容,主要是一些指针操作 core_main.c ----- CoreMark核心文件 core_matrix.c ----- 矩阵运算相关部分 core_state.c ----- 状态机相关部分 core_util.c ----- crc计算相关部分,其中计算因子为1021 core_portme.c ----- 可以认为是与平台对接的部分,主要是计时相关
代码移植
代码移植主要做的就是把上面提到的这几个c文件和几个对应的头文件(core_portme.h和coremark.h)放置于工程中。
代码修改
core_portme.c
修改宏 CORETIMETYPE (计时器变量的变量类型)和宏 GETMYTIME(_t)(读取当前计时器值)
#define CORETIMETYPE TIMING_FORMAT #define GETMYTIME(_t) (*_t = GPT_Get_Tick())
core_portme.h
#define ITERATIONS 6000 // 最关键的值,如果运行结果报错,需要往修改,以保证coremark能跑够10s以上 #define FLAGS_STR "-Ofast" // 当前编译器的优化等级,与keil里设置的一致就行,其实没啥功能,就是最后出报告时显示的内容 #define MAIN_HAS_NORETURN 1 // 让coremark跑完后停留在内部的while(1)循环中
core_main.c
之所以这么改,是因为单片机的入口是main,但是瑞萨把这个占用了,留给我们hal_entry,因此我们需要在harl_entry里调用coremark测试逻辑。
#if MAIN_HAS_NOARGC MAIN_RETURN_TYPE coremark_main(void) { int argc = 0; char *argv[1]; #else MAIN_RETURN_TYPE coremark_main(int argc, char *argv[]) { #endif
hal_entry.c
主要是删掉了之前测试计时准确性的代码,换成了coremark测试入口。
...... #include "coremark.h" ...... void hal_entry(void) { Debug_UART_Init(); GPT_Timing_Init(); systick_init(); printf("debug uart init OK\n\r"); #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif coremark_main(); } ......
工程修改
由于coremark是跑在堆上的,而瑞萨生成的工程,堆的默认大小并不算大,导致工程编译正常,但运行时迟迟无法输出coremark结果。使用在线调试时发现跑飞了,因此需要修改堆大小。
修改方法如下:
最终效果
debug uart init OK 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 14459 Total time (secs): 14.459000 Iterations/Sec : 414.966457 Iterations : 6000 Compiler version : GCCClang 18.0.0 Compiler flags : -Ofast Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xa14c Correct operation validated. See readme.txt for run and reporting rules. CoreMark 1.0 : 414.966457 / GCCClang 18.0.0 -Ofast / STACK
可以看到,跑分效果与CoreMark官网以及网友跑分效果差异巨大,但本次的目的并不是为了跑出高分,而是为了看看helium对运算效率的提升程度,因此先把跑分分数严重偏低的问题放一边,而去改写coremark代码,以得出helium加速指令的提升效率。
后面怀疑是硬件定时器操作会干扰cpu运行,改为systick,但发现提升并不大,这个不是主要导致效率比coremark上记录的分数低的原因。