本文将介绍使用CoreMark测试程序对我们小组自研芯片进行性能的测试,记录了CoreMarK工具的使用以及对其测试结果进行分析

测试环境:

PC OS: Ubuntu20.04 LTS

CPU: 自研CPU(ARCH=riscv64,ISA=rv64imafdc)

Kernel: CPU使用的内核为Linux4.15

CoreMark: CoreMark v1.01

GNU: riscv64-unknown-linux-gnu

1、CoreMark简介

  CoreMark是由EEMBC(Embedded Microprocessor Benchmark Consortium)Shay Gla-On2009年提出的一项基准测试程序,CoreMark的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。

  目前在嵌入式CPU行业中普遍公认的性能测试指标的标准主要使用以下三种,MIPSDhrystoneCoremark,而CoreMarkDhrystone一样,拥有体积小、方便移植、易于理解、免费并且显示单个数字基准分数。与Dhrystone不同的是,Dhrystone的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCUCPU的能力,的性能,而CoreMark具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。

2、获取源码

  EEMBC在将CoreMark源码托管在GitHub上可以访问github.com/eembc/coremark直接点击下载获得源码;也可以通过git命令下载到本地。

imaginemiracle@:Download$ git clone https://github.com/eembc/coremark.git
imaginemiracle@:Download$ cd coremark/
imaginemiracle@:coremark$ ls
barebones core_main.c coremark.md5 core_state.c cygwin freebsd linux macos README.md simple
core_list_join.c coremark.h core_matrix.c core_util.c docs LICENSE.md linux64 Makefile rtems

CoreMark项目的详细介绍,可以查阅当前目录下“coremark/docs/html/index.html”。该项目以下是当前目录的个文件介绍:

#在tree命令的输出中,作了部分删除(不影响分析整个CoreMark工程)
imaginemiracle@:coremark$ tree
.
├── barebones --移植到裸机环境下需要修改的目录
│ ├── core_portme.c --移植的目标平台配置信息
│ ├── core_portme.h --计时以及板级初始化实现
│ ├── core_portme.mak --该子目录的makefile
│ ├── cvt.c
│ └── ee_printf.c --打印函数串口发送实现
├── core_list_join.c --列表操作程序
├── core_main.c --主程序
├── coremark.h --项目配置与数据结构的定义头文件
├── coremark.md5
├── core_matrix.c --矩阵运算程序
├── core_state.c --状态机控制程序
├── core_util.c --CRC计算程序
├── cygwin --x86 cygwin和gcc 3.4(四核,双核和单核系统)的测试代码
│ ├── core_portme.c
│ ├── core_portme.h
│ └── core_portme.mak
├── freebsd --以下同理,是在不同操作系统下的测试代码
│ ├── ...
├── LICENSE.md
├── linux
│ ├── ...
├── linux64
│ ├── ...
├── macos
│ ├── ...
├── Makefile
├── README.md --自述文件,CoreMark项目的基本介绍
├── rtems
│ ├── ...
└── simple
├── ...
└──

3、移植到riscv64架构

[注]:若移植的平台是ARM Cortex-M系列的裸机系统,只需要修改“coremark/barebones”目录下的文件即可。

将当前目录下linux64目录拷贝一份为riscv64分支:

imaginemiracle@:coremark$ cp -rf linux64/ riscv64
imaginemiracle@:coremark$ vim riscv64/core_portme.mak

修改CCriscv64-unknown-linux-gnu-gcc即可(默认已经配置好riscv64-linux-gnu工具链,有很多优秀的博客介绍了riscv chaintool的编译安装过程可以自行查阅参考):

#core_portme.mak文件

OUTFLAG= -o
# Flag: CC
# Use this flag to define compiler to use
# ===========================Alter by me===========================
CC = riscv64-unknown-linux-gnu-gcc
# ============================End Alter============================
# Flag: CFLAGS
# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags"
PORT_CFLAGS = -O2
FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)"
CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\"
#Flag: LFLAGS_END
# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts).
# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt.
LFLAGS_END += -lrt
# Flag: PORT_SRCS
# Port specific source files can be added here
PORT_SRCS = $(PORT_DIR)/core_portme.c LOAD = echo Loading done
RUN = OEXT = .o
# ===========================Alter by me===========================
EXE = .rvexe
# ============================End Alter============================

4、编译生成coremark.rvexe

编译命令:

imaginemiracle@:coremark$ make PORT_DIR=riscv64

编译结果如下,会出现错误。

./coremark.rvexe  0x0 0x0 0x66 0 7 1 2000 > ./run1.log
/bin/sh: 1: ./coremark.rvexe: Exec format error
make[1]: *** [Makefile:112: run1.log] Error 2
make[1]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/test/coremark'
make: *** [Makefile:99: rerun] Error 2
imaginemiracle@:coremark$ file coremark.rvexe
coremark.rvexe: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 3.0.0, with debug_info, not stripped

仔细查看该错误并不是编译过程发生的错误,而是在运行编译出的coremark.rvexe报错,答案是肯定的,因为该可执行文件的架构是riscv64,而当前环境架构是x86

5、在目标平台上运行coremark.rvexe测试性能

下图是在我们自研CPU上CoreMark的测试结果,其中Iterations/Sec就是在跑分榜上CoreMark的值,根据该值和其它参数可以对比各微处理器的性能。

6、CoreMark跑分榜

目前可以看到EEMBC已经上传了592款型号的微控制器CoreMark跑分结果,可以在EEMBC的coremark/scores里看到。(注:下图获取时间为2020-12-31

CPU性能测试——CoreMark篇的更多相关文章

  1. 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微控制器CPU性能测试基准CoreMark. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.Co ...

  2. [原创]App性能测试指标篇

    [原创]App性能测试指标篇 目前由于苹果,三星等大厂对智能手机的研发及投入,使的智能手机发展非常迅速,每个人手中都有一些离不开生活的App,如:微信,微博,百度或是各游戏App等,但是到底App性能 ...

  3. 痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.C ...

  4. sysbench——服务器cpu性能测试

    一.前言 最近在工作中需要测试cpu占用率.内存占用率,我想要寻找一种合适的能提高cpu占用率的工具及方法.先尝试了使用 echo "scale=5000; 4*a(1)" | b ...

  5. Linux系统性能测试工具(四)——CPU性能测试工具之super_pi、sysbench

    本文介绍关于Linux系统(适用于centos/ubuntu等)的CPU性能测试工具-sysbench.CPU性能测试工具包括: super_pi: sysbench——不仅可以测试CPU性能,而且可 ...

  6. 【转载】8.2.1 CPU性能测试工具

    (KVM连载) 8.2.1 CPU性能测试工具 01/08/2013master 1 Comment 8.2.1 CPU性能测试工具 CPU是计算机系统中最核心的部件,CPU的性能直接决定了系统的计算 ...

  7. 【从零开始自制CPU之学习篇07】最简单的ALU—全加器

    ALU是算术逻辑单元,是CPU中重要的一部分,因为CPU本质上就是不断重复最简单的计算.而我们这一版CPU的ALU部分更为简单,是一个只能做加法的ALU. 理论部分 我们需要一个能帮我们进行数学计算的 ...

  8. 【从零开始自制CPU之学习篇06】寄存器

    上一篇文章学习了总线的相关知识,途中ABC当时假设为一个个的8位寄存器.这一篇要学习怎么构建这个寄存器. 这分为两个三个部分,数据输入,寄存器,数据输出.首先不管输出,来看数据输入和寄存器这两个部分. ...

  9. linux sysbench (一): CPU性能测试详解

    网上sysbench教材众多,但没有一篇中文教材对cpu测试参数和结果进行详解. 本文旨在能够让读者对sysbench的cpu有一定了解. 小慢哥的原创文章,欢迎转载 1.sysbench基础知识 s ...

随机推荐

  1. 代码审计【根据功能点定向审计】BugFree ZSWin重装案例

    (哦对了!这些CMS代码不要安装在服务器上,先不说它们用来代码审计本身就是有漏洞的,而且在网上下载下来,也不能保证没有源码是否被篡改而留有后门,就安装在本地进行代码审计的练习即可) 我们先下载BugF ...

  2. 中间件面试专题:kafka高频面试问题

  3. 全国11省市出台区块链专项政策,Panda Global发现 "区块链+政务"被寄予厚望!

    2020年已经过半,回顾2020年的上半年,不难发现其实区块链的变化非常大,今天Panda Global就给大家回顾下上半年全国关于区块链政策的发布情况.今年上半年,全国已有11个省市出台区块链专项政 ...

  4. 图论-zkw费用流

    图论-zkw费用流 模板 这是一个求最小费用最大流的算法,因为发明者是神仙zkw,所以叫zkw费用流(就是zkw线段树那个zkw).有些时候比EK快,有些时候慢一些,没有比普通费用流算法更难,所以学z ...

  5. nginx优化-转载

    (1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...

  6. Springboot之登录模块探索(含Token,验证码,网络安全等知识)

    简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端登录状 ...

  7. css进阶 03-网页设计和开发中,关于字体的常识

    03-网页设计和开发中,关于字体的常识 #前言 我周围的码农当中,有很多是技术大神,却常常被字体这种简单的东西所困扰. 这篇文章,我们来讲一讲关于字体的常识.这些常识所涉及到的问题,有很强的可操作性, ...

  8. js下 Day05、DOM案例

    一.简易购物车 效果图: 功能思路分析: 功能一:数量加减 \1. 找到所有的加号按钮,循环绑定点击事件.点击加号时让对应的数量+1 (找清楚加号和数量的关系,让数量标签的内容++) \2. 找到所有 ...

  9. 基于Python PIL实现简单图片格式转化器

    基于Python PIL实现简单图片格式转化器 目录 基于Python PIL实现简单图片格式转化器 1.简介 2.前期资料准备 2.1.1如何实现图片格式转换? 2.1.2如何保存需要大小的图片? ...

  10. JavaScript var,let,const三个关键字的区别

    var: 1)声明作用域:在函数内部,使用var定义一个变量(局部变量),在函数被调用完之后,该变量会被立即销毁.在定义变量时如果省略var,就会创建一个全局变量(不建议在局部作用域中定义全局变量,难 ...