1、coremark 简介
coremark 是由EEMBC提出的一个评价CPU性能指标的跑分软件。其主要目标是测试处理器核心性能。CoreMark程序使用C语言写成,包含如下四类运算法则:数学矩阵操作(普通矩阵运算)、列举(寻找并排序)、状态机(用来确定输入流中是否包含有效数字)、CRC(循环冗余校验),都是在真实的嵌入式应用中很常见的操作,这也是CoreMark比其他测试标准更有实际价值的原因所在。
目前只发布了1个版本: https://github.com/eembc/coremark/tree/v1.01
CoreMark标准的测试方法很简单,就是在某配置参数组合下单位时间内跑了多少次CoreMark程序,其指标单位为CoreMark和CoreMark/MHz。
CoreMark和CoreMark/MHz 数字越高,意味着性能更高。
CoreMark/MHz = CoreMark Score/Clock Frequency(CPU RUN)
可参考 https://www.analog.com/media/en/technical-documentation/application-notes/EE-389.pdf
2、Cross compile
这里以 NXP-LS1046A ARM64平台为例
Hardware Platform:NXP-LS1046A : 4 * A72 cores 1.8GHz
CoreMark详细说明可以参考:coremark
这里以硬件平台NXP-LS1046A为例进行编译配置 : 4*A72 cores,CPU系统时钟为100MHz。
目前CoreMark只发布了1个版本, 我们可以直接下载
wget https://github.com/eembc/coremark/archive/refs/tags/v1.01.zip
1、新建一个编译目录
unzip v1.01.zip && cd coremark-1.01
cp linux64/ arm64 -ad
2、修改arm64/core_portme.mak中的CC变量为正确的交叉编译工具
CC=/data/toolchain/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
3、测试多核性能时,需配置XCFLAGS来打开需要的宏
测试NXP-LS1046A 4核CPU性能, 编译方式:
make PORT_DIR=arm64 XCFLAGS="-DTOTAL_DATA_SIZE=12000 -DPROFILE_RUN=1 -DMULTITHREAD=4 -DUSE_PTHREAD -pthread"
mv coremark.exe coremark_4core
测试单核性能, 编译方式:
make PORT_DIR=arm64
mv coremark.exe coremark_1core
说明:
测试多核性能(根据核数确定,这里是4核,选用多线程方式):
XCFLAGS="-DMULTITHREAD=4 -DUSE_PTHREAD -pthread"
也可选多进程方式,可实际测试看性能表现选择线程还是进程:
XCFLAGS="-DMULTITHREAD=4 -DUSE_FORK"
多核可选优化参数, 根据程序产生profile参数优化性能,可实际测试看性能表现,选择是否使用该参数:
XCFLAGS="-DTOTAL_DATA_SIZE=12000 -DPROFILE_RUN=1"
3、测试
这里以测试NXP-LS1046A 4核CPU性能为例。
测试结果可以跟 EEMBC官方认证结果进行对比参考: coreMark Scores
为保证测试到最佳性能,测试前请确保系统上没有其它负载。
3.1 多核性能测试
#./coremark_4core 0x0 0x0 0x66 0 7 1 2000
root@localhost:~# ./coremark_4core 0x0 0x0 0x66 0 7 1 2000
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 19128
Total time (secs): 19.128000
Iterations/Sec : 41823.504810
Iterations : 800000
Compiler version : GCC7.2.1 20171011
Compiler flags : -O2 -O2 -O5 -DTOTAL_DATA_SIZE=12000 -DPROFILE_RUN=1 -DMULTITHREAD=4 -DUSE_PTHREAD=1 -pthread -DPERFORMANCE_RUN=1 -lrt
Parallel PThreads : 4
Memory location : Please put data memory location here
(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[1]crclist : 0xe714
[2]crclist : 0xe714
[3]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[1]crcmatrix : 0x1fd7
[2]crcmatrix : 0x1fd7
[3]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[1]crcstate : 0x8e3a
[2]crcstate : 0x8e3a
[3]crcstate : 0x8e3a
[0]crcfinal : 0x4983
[1]crcfinal : 0x4983
[2]crcfinal : 0x4983
[3]crcfinal : 0x4983
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 41823.504810 / GCC7.2.1 20171011 -O2 -O2 -O5 -DTOTAL_DATA_SIZE=12000 -DPROFILE_RUN=1 -DMULTITHREAD=4 -DUSE_PTHREAD=1 -pthread -DPERFORMANCE_RUN=1 -lrt / Heap / 4:PThreads
测试结果:
3.2单核性能测试
# ./coremark_1core 0x0 0x0 0x66 0 7 1 2000
root@localhost:~# ./coremark_1core 0x0 0x0 0x66 0 7 1 2000
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 19718
Total time (secs): 19.718000
Iterations/Sec : 10143.016533
Iterations : 200000
Compiler version : GCC7.2.1 20171011
Compiler flags : -O2 -DPERFORMANCE_RUN=1 -lrt
Memory location : Please put data memory location here
(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x4983
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 10143.016533 / GCC7.2.1 20171011 -O2 -DPERFORMANCE_RUN=1 -lrt / Heap