【LeetCode】365. Water and Jug Problem 水壺問題(Medium)(JAVA)
本文將介紹使用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
2009
年提出的一項基準測試程式,CoreMark
的主要目標是簡化操作,並提供一套測試單核處理器核心的方法。測試標準是在配置引數的組合下單位時間內執行的CoreMark
程式次數(單位:CoreMark/MHz
),該數字值越大則說明測試的效能越好。目前在嵌入式
CPU
行業中普遍公認的效能測試指標的標準主要使用以下三種,MIPS
、Dhrystone
、Coremark
,而CoreMark
與Dhrystone
一樣,擁有體積小、方便移植、易於理解、免費並且顯示單個數字基準分數。與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
修改CC
為riscv64-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
)