前言
前面我们进行了RISC-V开发环境的搭建,并分析了代码框架。按照测评计划,我们这一篇进行性能测试。CPU基准性能测试有很多种,比较常见的是coremark,我们就以coremark进行CPU的基准性能测试。
过程
准备代码
下载代码
git clone https://github.com/eembc/coremark.git
只保留如下内容,并添加到工程main目录下
修改代码
core_portme.h中
#include <stdio.h>
#define HAS_STDIO 0改为#define HAS_STDIO 1
#define HAS_PRINTF 0改为#define HAS_PRINTF 1
#define HAS_FLOAT 1
改为
#define HAS_FLOAT 0
添加
#define CLOCKS_PER_SEC 25000000
和nuclei.h中的
#define RTC_FREQ 25000000一致
添加#define MAIN_HAS_NOARGC 1
FLAGS_STR按照实际改为”-O0”或者”-O3”等。
typedef size_t ee_size_t;改为
typedef unsigned int ee_size_t;
#define CORETIMETYPE ee_u32
改为
#define CORETIMETYPE uint64_t
typedef ee_u32 CORE_TICKS;
改为
typedef uint64_t CORE_TICKS;
添加#define ITERATIONS 10000
该值需要按照实际修改,如果提示运行时间不够则修改增加该值。
core_portme.c中
barebones_clock()
{
#error \
"You must implement a method to measure time in barebones_clock()! This function should return current time.\n"
}
改为
barebones_clock()
{
//#error
// "You must implement a method to measure time in barebones_clock()! This function should return current time.\n"
return sys_tick_get();
}
前面申明extern uint64_t sys_tick_get(void);
注释掉
#if 0
#error \
"Call board initialization routines in portable init (if needed), in particular initialize UART!\n"
#endif
以下两个宏确定获取时间tick的单位
#define TIMER_RES_DIVIDER 1
# define CLOCKS_PER_SEC (100)
core_main.c中main函数改为coremark_main
main函数中
实现
uint64_t sys_tick_get(void)
{
return SysTimer_GetLoadValue();
}
调用
extern void coremark_main(void);
coremark_main();
测试
设置优化等级
对比
https://www.eembc.org/coremark/scores.php
和Andes Technology的D45差不多但是它是60MHz。
换算到CoreMark/MHz是2.64,不是很突出,毕竟是FPGA的硬核。
但是比STM32F103还是高一点。
总结
以上基于CoreMark进行了RISC-V硬核的性能测试。从结果来看比其他厂家的RISC-V的芯片要差点毕竟是硬核非专门IC,但是优于Cortex-M3的STM32F103ZET6.