1. 程式人生 > >CPU效能測試——CoreMark篇

CPU效能測試——CoreMark篇

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020122414373872.png) `本文將介紹使用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](http://www.eembc.org/)`(Embedded Microprocessor Benchmark Consortium)`的`Shay Gla-On`於`2009`年提出的一項基準測試程式,`CoreMark`的主要目標是簡化操作,並提供一套測試**單核處理器核心**的方法。測試標準是在配置引數的組合下單位時間內執行的`CoreMark`程式次數(單位:`CoreMark/MHz`),該數字值越大則說明測試的效能越好。   目前在嵌入式`CPU`行業中普遍公認的效能測試指標的標準主要使用以下三種,`MIPS`、`Dhrystone`、`Coremark`,而`CoreMark`與`Dhrystone`一樣,擁有體積小、方便移植、易於理解、免費並且顯示單個數字基準分數。與`Dhrystone`不同的是,`Dhrystone`的主要部分實際上暴露了編譯器優化工作負載的能力,而不是實際[MCU](https://baike.baidu.com/item/MCU/62773)或[CPU](https://baike.baidu.com/item/%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8/284033)的能力,的效能,而`CoreMark`具有特定的執行和報告規則,從而可以避免由於所使用的編譯庫不同而導致的測試結果難以比較。 ## 2、獲取原始碼   `EEMBC`在將`CoreMark`原始碼託管在`GitHub`上可以訪問[github.com/eembc/coremark](https://github.com/eembc/coremark)直接點選下載獲得原始碼;也可以通過`git`命令下載到本地。 ```shell 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”`。該專案以下是當前目錄的個檔案介紹: ```shell #在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`分支: ```shell imaginemiracle@:coremark$ cp -rf linux64/ riscv64 imaginemiracle@:coremark$ vim riscv64/core_portme.mak ``` 修改`CC`為`riscv64-unknown-linux-gnu-gcc`即可(預設已經配置好riscv64-linux-gnu工具鏈,有很多優秀的部落格介紹了riscv chaintool的編譯安裝過程可以自行查閱參考): ```shell #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 編譯命令: ```shell imaginemiracle@:coremark$ make PORT_DIR=riscv64 ``` 編譯結果如下,會出現錯誤。 ```shell ./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 ``` ```shell 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`的值,根據該值和其它引數可以對比各微處理器的效能。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231174903326.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzkzOTc4,size_16,color_FFFFFF,t_70#pic_center) ## 6、CoreMark跑分榜 目前可以看到EEMBC已經上傳了592款型號的微控制器CoreMark跑分結果,可以在EEMBC的[coremark/scores](https://www.eembc.org/coremark/scores.php)裡看到。(`注:下圖獲取時間為2020-12-31`) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201231174517459.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzkzOTc4,size_16,color_FFFFF