From 3e178ae308882bd92165023b5dc9cb8132cdf3d7 Mon Sep 17 00:00:00 2001 From: Kepontry Date: Wed, 22 Mar 2023 18:50:52 -0700 Subject: [PATCH 1/3] add 20230323-vf2-coremark.md --- articles/20230323-vf2-coremark.md | 222 ++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 articles/20230323-vf2-coremark.md diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md new file mode 100644 index 0000000..c1eec0c --- /dev/null +++ b/articles/20230323-vf2-coremark.md @@ -0,0 +1,222 @@ +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [tounix spaces toc comments codeinline urls pangu autocorrect]
+> Author: Kepontry
+> Date: 2023/3/23
+> Revisor: Falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Proposal: [VisionFive 2 开发板软硬件评测及软件 gap 分析](https://gitee.com/tinylab/riscv-linux/issues/I64ESM)
+> Sponsor: PLCT Lab, ISCAS + +# VisionFive 2 开发板的 CoreMark 评测 + +## 简介 + +### VisionFive 2 开发板 + +VisionFive 2 开发板采用的是赛昉科技的 JH7110 高性能 RISC-V SoC,它是一款 64 位四核处理器,共享 2MB 一致性缓存,工作频率为 1.5GHz。JH7110 支持 Linux 操作系统,拥有集成 GPU 以及视频编解码 ISP,支持 OpenCL/OpenGL, ES/Vulkan 等图形渲染库,支持 H.264/H.265/JPEG 等格式的编解码。本文作为评测系列的第一篇,将主要关注 CPU 性能。 + +### CoreMark 测试集 + +[CoreMark][006] 是由 EEMBC(Embedded Microprocessor Benchmark Consortium) 开发的一项基准测试程序,主要为 MCU 或 CPU 提供轻量级评测。主要测试的是单核性能,但本文中也对多核评测做了简单的尝试。测试标准是在配置参数的组合下单位时间内运行的 CoreMark 程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。 +Dhrystone 和 Coremark 都是广泛使用的的性能测试程序,都拥有着体积小、方便移植、易于理解、免费等优点。但 Dhrystone 的结果更容易受编译器优化能力的影响,从而影响对 CPU 的评测。而 Coremark 在设计的过程中避免了上述问题,而且还在其官网上提供了测试结果的验证与排行。 + +## 测试集编译与运行 + +### 源码获取与配置 + +CoreMark 在 GitHub 上有对应的 [源码仓库][001],但我们这里采用 BOOM 处理器核团队移植到 RISC-V 上的 [riscv-coremark][003]。CoreMark 提供了可移植的接口,从而使得能够在核心评测代码不变的前提下,在多种架构环境中执行。riscv-coremark 中提供了 riscv64 和 riscv64-baremetal 两种构建方式,使测试程序分别能在 Linux 和裸机上运行。CoreMark 原版代码以子模块的形式包含在 riscv-coremark 中,执行以下命令以获取全套代码。 + +```shell +$ git clone https://github.com/riscv-boom/riscv-coremark.git +$ cd riscv-coremark +$ tree -L 1 +. +|-- LICENSE +|-- README.md +|-- build-coremark.sh # 构建脚本 +|-- coremark # 原版 CoreMark 代码 +|-- riscv64 # 运行在 Linux 或者 Proxy Kernel 上的版本 +`-- riscv64-baremetal # 运行在裸机上的版本,手动实现了用到的 syscall +$ git submodule update --init +``` + +查看构建脚本 `build-coremark.sh` 的内容,发现它只是在 coremark 目录下执行 `make PORT_DIR=../xxx compile` 命令,指定移植代码并编译,最后把生成的文件复制出来。所以之后我们直接在 coremark 目录下执行该命令,以便于调试。因为我们是运行在 Linux 上,所以选择 riscv64 移植版本构建并运行。 + +```shell +$ cat build-coremark.sh +#!/bin/bash + +set -e + +BASEDIR=$PWD +CM_FOLDER=coremark + +cd $BASEDIR/$CM_FOLDER + +# run the compile +echo "Start compilation" +make PORT_DIR=../riscv64 compile +mv coremark.riscv ../ + +make PORT_DIR=../riscv64-baremetal compile +mv coremark.bare.riscv ../ +``` + +首先修改 Makefile,指定编译工具链的前缀 `RISCVTYPE=riscv64-linux-gnu` 与存放目录 `RISCVTOOLS=/usr`。 + +```shell +$ vim riscv64/core_portme.mak +... +RISCVTOOLS=/usr +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-linux-gnu +# 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 = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +... +``` + +然后修改头文件,将 `HAS_TIME_H` 宏变量设置为 1,表示 clock_t 变量使用中的定义而不需要手动定义,避免报定义重复的错误。 + +```shell +$ vim riscv64/core_portme.h +... +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. + */ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +... +``` + +### 单核测试 + +按默认配置进行编译即可生成单核测试程序。指定移植目录 `PORT_DIR` 为 riscv64 并编译,在当前目录生成 `coremark.riscv` 测试程序。运行该程序,得到的分数为 4986。 + +```shell +$ make PORT_DIR=../riscv64 compile +$ ./coremark.riscv +2K performance run parameters for coremark. +CoreMark Size : 666 +Total ticks : 12032 +Total time (secs): 12.032000 +Iterations/Sec : 4986.702128 +Iterations : 60000 +Compiler version : GCC11.3.0 +Compiler flags : -O2 +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 : 0xbd59 +Correct operation validated. See README.md for run and reporting rules. +CoreMark 1.0 : 4986.702128 / GCC11.3.0 -O2 / Heap +``` + +### PGO 优化测试 + +PGO 是一种编译优化技术,它利用实际运行中收集的性能分析数据重新编译应用,以提高应用程序的运行时性能。PGO 优化与传统的静态优化相比,能够获取应用程序的运行时数据,从而能够针对热代码块在布局上进行优化,提高指令 Cache 的命中率。 + +使用如下 make 命令构建测试程序,通过指定 `PGO=1` 开启 PGO 优化。编译器首先构建用于性能分析的二进制程序。向 GCC 传递 `-fprofile-generate` 参数,以收集运行数据。之后再用生成的 `*.gcda` 文件重新编译测试程序,设置 GCC 的 `-fprofile-use` 标志,表示使用上述运行时性能数据进行 PGO 优化,生成优化后的测试程序。 + +如果提示 `'xxx.gcda' profile count data file not found`,可以删除 `coremark.riscv` 文件后再重新编译。 + +运行测试程序 `coremark.riscv`,经 PGO 优化后的测试得分为 5278,约有 6% 的性能提升。 + +```shell +$ make PORT_DIR=../riscv64 PGO=1 +$ ./coremark.riscv +2K performance run parameters for coremark. +CoreMark Size : 666 +Total ticks : 20840 +Total time (secs): 20.840000 +Iterations/Sec : 5278.310940 +Iterations : 110000 +Compiler version : GCC11.3.0 +Compiler flags : -O2 -DPERFORMANCE_RUN=1 +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 : 0x33ff +Correct operation validated. See README.md for run and reporting rules. +CoreMark 1.0 : 5278.310940 / GCC11.3.0 -O2 -DPERFORMANCE_RUN=1 / Heap +``` + +### 多核测试尝试 + +通过观察头文件 `riscv64/core_portme.h`,发现移植者提供了多核测试的代码与设置项。通过 `MULTITHREAD` 宏变量指定线程数,`USE_PTHREAD` 宏表示通过 pthread 库使用多线程。我们在 Makefile 文件的 `CFLAGS` 项中添加这两项,同时在 `LFLAGS_END` 项中加上 `-lpthread`,使链接器将 pthread 库链接进来。 + +```shell +$ vim riscv64/core_portme.mak +... +CFLAGS = $(PORT_CFLAGS) -DMULTITHREAD=4 -DUSE_PTHREAD -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 += -lpthread +# Flag: PORT_SRCS +... +``` + +使用 make 命令编译,生成 `coremark.riscv` 可执行文件并运行,可以看到多线程得分是 19995。这个结果大致等于单核的 4 倍得分,由于该测试集本身不是专门为多核设计的,并没有太多核间的竞争与同步,所以这个得分的参考意义等同于单核得分。 + +```shell +$ make PORT_DIR=../riscv64 compile +$ ./coremark.riscv +2K performance run parameters for coremark. +CoreMark Size : 666 +Total ticks : 12003 +Total time (secs): 12.003000 +Iterations/Sec : 19995.001250 +Iterations : 240000 +Compiler version : GCC11.3.0 +Compiler flags : -O2 -lpthread +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 : 0xbd59 +[1]crcfinal : 0xbd59 +[2]crcfinal : 0xbd59 +[3]crcfinal : 0xbd59 +Correct operation validated. See README.md for run and reporting rules. +CoreMark 1.0 : 19995.001250 / GCC11.3.0 -O2 -lpthread / Heap / 4:PThreads +``` + +## 总结 + +本文使用 CoreMark 测试集评测了 JH7110 这款 CPU,给出了其单核与 PGO 优化后的结果,并简单的对多核性能进行评测。测试结果表明:JH7110 单核性能达到 2010 年左右 Intel 等厂商的主流 CPU 水平。后续考虑使用更加专业的测试集 [CoreMark-Pro][002] 评测多核性能,并给出其它 RISC-V 处理器的性能数据。 + +## 参考资料 + +- [CPU 性能测试——CoreMark 篇][005] +- [CPU 性能测试——CoreMark-pro 篇][004] + +[001]: https://github.com/eembc/coremark +[002]: https://github.com/eembc/coremark-pro +[003]: https://github.com/riscv-boom/riscv-coremark +[004]: https://www.cnblogs.com/ImagineMiracle-wxn/p/CPU_CoreMark-pro_test.html +[005]: https://www.cnblogs.com/ImagineMiracle-wxn/p/CPU_CoreMark_test.html +[006]: https://www.eembc.org/coremark/ -- Gitee From e9968f1b0006a10a3e7b4ba710f386902422e177 Mon Sep 17 00:00:00 2001 From: Kepontry Date: Thu, 23 Mar 2023 01:20:10 -0700 Subject: [PATCH 2/3] modify 20230323-vf2-coremark.md --- articles/20230323-vf2-coremark.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md index c1eec0c..80615a8 100644 --- a/articles/20230323-vf2-coremark.md +++ b/articles/20230323-vf2-coremark.md @@ -12,11 +12,11 @@ ### VisionFive 2 开发板 -VisionFive 2 开发板采用的是赛昉科技的 JH7110 高性能 RISC-V SoC,它是一款 64 位四核处理器,共享 2MB 一致性缓存,工作频率为 1.5GHz。JH7110 支持 Linux 操作系统,拥有集成 GPU 以及视频编解码 ISP,支持 OpenCL/OpenGL, ES/Vulkan 等图形渲染库,支持 H.264/H.265/JPEG 等格式的编解码。本文作为评测系列的第一篇,将主要关注 CPU 性能。 +VisionFive 2 开发板采用的是赛昉科技的 JH7110 高性能 RISC-V SoC,它是一款 64 位四核处理器,共享 2MB 一致性缓存,工作频率为 1.5GHz。JH7110 支持 Linux 操作系统,拥有集成 GPU 以及视频编解码 ISP,支持 OpenCL/OpenGL ES/Vulkan 等图形渲染库,支持 H.264/H.265/JPEG 等格式的编解码。本文作为评测系列的第一篇,将主要关注 CPU 性能。 ### CoreMark 测试集 -[CoreMark][006] 是由 EEMBC(Embedded Microprocessor Benchmark Consortium) 开发的一项基准测试程序,主要为 MCU 或 CPU 提供轻量级评测。主要测试的是单核性能,但本文中也对多核评测做了简单的尝试。测试标准是在配置参数的组合下单位时间内运行的 CoreMark 程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。 +[CoreMark][006] 是由 EEMBC (Embedded Microprocessor Benchmark Consortium) 开发的一项基准测试程序,主要为 MCU 或 CPU 提供轻量级评测。主要测试的是单核性能,但本文中也对多核评测做了简单的尝试。测试标准是在配置参数的组合下单位时间内运行的 CoreMark 程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好。 Dhrystone 和 Coremark 都是广泛使用的的性能测试程序,都拥有着体积小、方便移植、易于理解、免费等优点。但 Dhrystone 的结果更容易受编译器优化能力的影响,从而影响对 CPU 的评测。而 Coremark 在设计的过程中避免了上述问题,而且还在其官网上提供了测试结果的验证与排行。 ## 测试集编译与运行 @@ -61,7 +61,7 @@ make PORT_DIR=../riscv64-baremetal compile mv coremark.bare.riscv ../ ``` -首先修改 Makefile,指定编译工具链的前缀 `RISCVTYPE=riscv64-linux-gnu` 与存放目录 `RISCVTOOLS=/usr`。 +首先修改 Makefile,指定编译工具链的前缀 `RISCVTYPE=riscv64-linux-gnu` 与存放目录 `RISCVTOOLS=/usr`,这里大家可以结合下方代码中的 `CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc` 更好地理解这些项的设置意义。 ```shell $ vim riscv64/core_portme.mak @@ -122,7 +122,7 @@ CoreMark 1.0 : 4986.702128 / GCC11.3.0 -O2 / Heap ### PGO 优化测试 -PGO 是一种编译优化技术,它利用实际运行中收集的性能分析数据重新编译应用,以提高应用程序的运行时性能。PGO 优化与传统的静态优化相比,能够获取应用程序的运行时数据,从而能够针对热代码块在布局上进行优化,提高指令 Cache 的命中率。 +PGO (Profile Guided Optimization) 是一种编译优化技术,它利用实际运行中收集的性能分析数据重新编译应用,以提高应用程序的运行时性能。PGO 优化与传统的静态优化相比,能够获取应用程序的运行时数据,从而能够针对热代码块在布局上进行优化,提高指令 Cache 的命中率。 使用如下 make 命令构建测试程序,通过指定 `PGO=1` 开启 PGO 优化。编译器首先构建用于性能分析的二进制程序。向 GCC 传递 `-fprofile-generate` 参数,以收集运行数据。之后再用生成的 `*.gcda` 文件重新编译测试程序,设置 GCC 的 `-fprofile-use` 标志,表示使用上述运行时性能数据进行 PGO 优化,生成优化后的测试程序。 -- Gitee From 0af6bd2d55938cd519ce2e66861edc715f4beb44 Mon Sep 17 00:00:00 2001 From: Kepontry Date: Thu, 23 Mar 2023 06:25:42 -0700 Subject: [PATCH 3/3] modify 20230323-vf2-coremark.md --- articles/20230323-vf2-coremark.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md index 80615a8..50f1fdc 100644 --- a/articles/20230323-vf2-coremark.md +++ b/articles/20230323-vf2-coremark.md @@ -1,7 +1,7 @@ > Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [tounix spaces toc comments codeinline urls pangu autocorrect]
> Author: Kepontry
> Date: 2023/3/23
-> Revisor: Falcon
+> Revisor: Falcon ; Bin Meng
> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
> Proposal: [VisionFive 2 开发板软硬件评测及软件 gap 分析](https://gitee.com/tinylab/riscv-linux/issues/I64ESM)
> Sponsor: PLCT Lab, ISCAS -- Gitee