本文将介绍使用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-On
于年提出的一项基准测试程序,
CoreMark
的主要目标是简化操作,并提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark
程序次数(单位:CoreMark/MHz
),该数字值越大则说明测试的性能越好。
目前在嵌入式CPU
行业中普遍公认的性能测试指标的标准主要使用以下三种,MIPS
、Dhrystone
、Coremark
,而CoreMark
与Dhrystone
一样,拥有体积小、方便移植、易于理解、免费并且显示单个数字基准分数。与Dhrystone
不同的是,Dhrystone
的主要部分实际上暴露了编译器优化工作负载的能力,而不是实际MCU或CPU的能力,的性能,而CoreMark
具有特定的运行和报告规则,从而可以避免由于所使用的编译库不同而导致的测试结果难以比较。
2、获取源码
EEMBC
在将CoreMark
源码托管在GitHub
上可以访问/eembc/coremark直接点击下载获得源码;也可以通过git
命令下载到本地。
imaginemiracle@:Download$ git clone /eembc/coremark.gitimaginemiracle@:Download$ cd coremark/imaginemiracle@:coremark$ lsbarebones core_main.c coremark.md5 core_state.c cygwin freebsdlinux macosREADME.md simplecore_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/ riscv64imaginemiracle@:coremark$ vim riscv64/core_portme.mak
修改CC
为riscv64-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 = -O2FLAGS_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 herePORT_SRCS = $(PORT_DIR)/core_portme.cLOAD = echo Loading doneRUN = 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 errormake[1]: *** [Makefile:112: run1.log] Error 2make[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.rvexecoremark.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 riscv64imaginemriacle@: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 useCC = 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 herePORT_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.logmake[1]: Entering directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'make port_prebuildmake[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 linkmake[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 -lpthreadLink performed along with compilemake[2]: Leaving directory '/media/imaginemiracle/Disk_D/Linux_Workspace/riscv-project/File_System_test/sifive_coremark/coremark-riscv64'make port_postbuildmake[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_preloadmake[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.rvexeLoading done ./coremark.rvexemake port_postloadmake[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_prerunmake[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 errormake[1]: *** [Makefile:112: run1.log] Error 2make[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里看到。(注:下图获取时间为-12-31
)
觉得这篇文章对你有帮助的话,就留下一个赞吧v*
请尊重作者,转载还请注明出处!感谢配合~
[作者]: Imagine Miracle
[版权]: 本作品采用知识共享署名-非商业性-相同方式共享 4.0 国际许可协议进行许可。
[本文链接]: /qq_36393978/article/details/111629341