本文将介绍使用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的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCU或CPU的能力,的性能,而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 toolchain的编译安装过程可以自行查阅参考):

#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.cLOAD = echo Loading done
RUN = OEXT = .o
# ===========================Alter by me===========================
EXE = .rvexe
# ============================End Alter============================

4、编译生成coremark.rvexe

4.1、编译在单核上运行的coremark.rvexe

<1> 编译命令:

imaginemiracle@:coremark$ make PORT_DIR=riscv64

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

./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

4.2、编译在多核上运行的coremark.rvexe

<1> 首先需要修改make文件(在LFLAGAS_END变量添加-lpthread``):

imaginemiracle@:coremark$ cd riscv64
imaginemriacle@:riscv64$ vim core_portme.mak
#coremark/riscv64/core_protme.mak
#File: core_portme.mak# Flag: OUTFLAG
#   Use this flag to define how to to get an executable (e.g -o)
OUTFLAG= -o
# Flag: CC
#   Use this flag to define compiler to use
CC = riscv64-unknown-linux-gnu-gcc
#CC = gcc
# 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 -fno-common -funroll-loops -finline-functions --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4 -
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.
#===============================Alter by me===========================
LFLAGS_END += -lrt -lpthread
#===============================Alter by me===========================
# Flag: PORT_SRCS
# Port specific source files can be added here
PORT_SRCS = $(PORT_DIR)/core_portme.c

<2> 编译生成coremark.rvexe

可以使用XCFLAGS=-DMULTITHREAD=N其中的N是需要并行运行的线程数,如下使用的编译命令则是使用POSIX Threads API将源码编译在4个内核上运行的CoreMark测试:

imaginemiracle@:coremark$ make PORT_DIR=riscv64  XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD"

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

make XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD -DPERFORMANCE_RUN=1" load run1.log
make[1]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make port_prebuild
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make[2]: Nothing to be done for 'port_prebuild'.
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make link
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
riscv64-unknown-linux-gnu-gcc -O2 -fno-common -funroll-loops -finline-functions --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4 --param inline-min-speedup=10 -Iriscv64 -I. -DFLAGS_STR=\""-O2 -fno-common -funroll-loops -finline-functions --param max-inline-insns-auto=20 -falign-functions=4 -falign-jumps=4 -falign-loops=4 --param inline-min-speedup=10 -DMULTITHREAD=4 -DUSE_PTHREAD -DPERFORMANCE_RUN=1  -lrt -lpthread"\" -DITERATIONS=0 -DMULTITHREAD=4 -DUSE_PTHREAD -DPERFORMANCE_RUN=1 core_list_join.c core_main.c core_matrix.c core_state.c core_util.c riscv64/core_portme.c -o ./coremark.rvexe -lrt -lpthread
Link performed along with compile
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make port_postbuild
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make[2]: Nothing to be done for 'port_postbuild'.
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make port_preload
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make[2]: Nothing to be done for 'port_preload'.
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
echo Loading done ./coremark.rvexe
Loading done ./coremark.rvexe
make port_postload
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make[2]: Nothing to be done for 'port_postload'.
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make port_prerun
make[2]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'
make[2]: Nothing to be done for 'port_prerun'.
make[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-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/coremark-riscv64'
make: *** [Makefile:99: rerun] Error 2

与上面的错误类似,都是在运行非X86架构的程序报的错误信息,因此不必担心,直接将编译好的coremark.rvexe拷贝到目标平台即可。

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

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

<1> 运行coremark.rvexe

执行命令:./coremark.rvexe
[注] 多核与单核coremark测试相同,直接运行coremark的可执行程序即可,下图是单核coremark的测试结果

6、CoreMark跑分榜

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

觉得这篇文章对你有帮助的话,就留下一个赞吧v*
请尊重作者,转载还请注明出处!感谢配合~
[作者]: Imagine Miracle
[版权]: 本作品采用知识共享署名-非商业性-相同方式共享 4.0 国际许可协议进行许可。
[本文链接]: https://blog.csdn.net/qq_36393978/article/details/111629341

CPU性能测试——CoreMark篇相关推荐

  1. 杰理之CPU性能测试【篇】

    Dhrystone的重要性在于其能作为处理器整数计算性能的指标; DMIPS: Dhrystone MIPS,并非字面上每秒百万条指令的意思.它是一个测量CPU运行一个叫Dhrystone(整数运算) ...

  2. 微控制器CPU性能测试基准CoreMark

    origin:https://www.cnblogs.com/henjay724/p/8729364.html 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark) 大家好,我是痞 ...

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

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

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

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

  5. amd锐龙笔记本cpu怎么样_amd锐龙处理器5怎么样?AMD锐龙5 1600X1500X CPU性能测试

    AMD 2月底的锐龙 7 CPU无疑是相当有亮点,不过2000元起的售价也成了普及的一大门槛.相对来说,中高端装机点名率最高的应该就是i5-7500和i7-7700K,AMD并没有第一时间推出对应的产 ...

  6. 锐炬显卡可以linux吗,Intel Broadwell桌面CPU性能测试:Iris Pro 6200核显无敌了

    Intel已经在Computex 2015发布了Broadwell-H桌面版处理器,分别有Core i7-5775C和Core i5-5765C两款,另有3款BGA封装的嵌入式型号.它们的特色是内置I ...

  7. 服务器cpu性能如何测试,CPU性能测试(1)_服务器评测与技术-中关村在线

    在测试之前,我们有必要交代下这次测试的操作系统环境.通过缓存为512MB的LSI MegaRAID 2208 SAS阵列卡,对四块300GB 15K转速的SAS硬盘组建RAID5,在此基础上我们选择了 ...

  8. 服务器性能测试综合实验报告,CPU性能测试实验报告.doc

    文档介绍: 计算机硬件技术基础课程实验报告 实验题目:CPU性能测试 实验人班级: 学号: 姓名: 1.实验目的 了解CPU参数的含义,以及各个参数对CPU性能的影响 2.实验环境 ①实验硬件环境(计 ...

  9. CPU性能测试基准(Dhrystone)学习

    目录 简介 源码获取 缺陷 简介 Dhrystone是测量处理器运算能力的最常见基准程序之一,常用于处理器的整型运算性能的测量.程序是用C语言编写的,因此C编译器的编译效率对测试结果也有很大影响. D ...

最新文章

  1. NTU 课程笔记 CV6422 假设检验
  2. 尝鲜 workerize 源码
  3. 微信外卖小程序 怎么计算与客户的距离_微信小程序结合腾讯位置服务实现用户商家距离计算...
  4. codeforces CF438D The Child and Sequence 线段树
  5. 新云网站管理系统最新版注入漏洞
  6. 深入解读 MySQL 架构设计原理,剖析存储架构选型核心
  7. 布隆过滤器(Bloom Filter)- 原理、实现和推导
  8. 弱电工程师和网络工程师有什么区别?工作内容是什么?
  9. 日本java图书馆_菜鸡的Java笔记 图书馆
  10. c语言编程用什么字体,10 款最适合编程的字体
  11. 华为语音网关iad208e(m)华为8口语音网关web界面
  12. ubuntu20.04安装并运行ORB_SLAM3(一路顺风版)
  13. IOl:从文件夹中找到后缀名为TXT的文件,然后复制到指定的文件夹
  14. cad画正弦曲线lisp_AutoCAD怎么画正弦线?
  15. 英语不好,能学好计算机吗?
  16. 06_Callable接口
  17. Qt简单项目实例之(二)——多功能计算器
  18. 臭氧辅助硅蚀刻的深度研分析
  19. 百度API实现人流量数量检测(动态)
  20. 我关于Spring Boot的理解

热门文章

  1. Opencv2.4.9源码分析——Stitching(二)
  2. 拓歌,克服N大难关,K歌音响不容易
  3. MATLAB顺序读取文件夹数据
  4. 数理逻辑PC系统基本定理证明
  5. 学AI的高中生还有5秒钟到达战场,请90后叔叔阿姨做好准备
  6. 平面几何----用四点共圆证明西姆松定理
  7. android 触摸屏驱动分析,Android 触摸屏驱动代码分析(ADC 类型触摸屏 CPU:s3c
  8. 手机H5网站 支付宝、微信支付遇到的问题和注意事项
  9. Revit 二次开发,长度单位转换位,坐标系转换为M
  10. Android APIs (Class Index - Android SDK)(二)