这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » 【CPKCORRA8D1B评测】---移植CoreMark

共3条 1/1 1 跳转至

【CPKCORRA8D1B评测】---移植CoreMark

助工
2024-11-15 20:48:19   被打赏 50 分(兑奖)     打赏

上一篇说到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结果。使用在线调试时发现跑飞了,因此需要修改堆大小。

   修改方法如下:

1.jpg最终效果

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上记录的分数低的原因。





关键词: CPKCOR     RA8D1B     移植     CoreMark    

专家
2024-11-16 00:24:15     打赏
2楼

感谢分享



工程师
2024-11-16 08:53:02     打赏
3楼

大佬厉害啊,这么快就出来了。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]