From 3ee4e70575b0027bc1f2cba95caaf49284f06d0b Mon Sep 17 00:00:00 2001 From: Kepontry Date: Wed, 29 Mar 2023 22:54:39 -0700 Subject: [PATCH 1/2] update articles/20230323-vf2-coremark.md --- articles/20230323-vf2-coremark.md | 38 +++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md index c8ef2b1..498c4fc 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 - [spaces codeinline pangu autocorrect]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [codeinline tables pangu autocorrect]
> Author: Kepontry
> Date: 2023/3/23
-> Revisor: Falcon ; Bin Meng ; Walimis
+> Revisor: Falcon ; Bin Meng ; Walimis
> 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 @@ -219,6 +219,40 @@ Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 27185.665740 / GCC12.2.0 -march=rv64gc_zba_zbb -O3 -fno-common -funroll-loops -finline-functions -funroll-all-loops --param max-inline-insns-auto=20 -falign-functions=8 -falign-jumps=8 -falign-loops=8 --param inline-min-speedup=10 -mtune=sifive-7-series -ffast-math -fno-if-conversion2 -DPERFORMANCE_RUN=1 -lpthread / Heap / 4:PThreads ``` +## 性能调优小结 + +在以上代码中,编译参数 `CFLAGS` 的内容是经过多轮测试得到的较优版本,测试中参考了论坛中一篇关于 CoreMark 测试的 [帖子][007]。下表展示了具体的优化参数以及对应的 CoreMark 分值,添加优化参数后,编译时间增加,调试难度增加,但程序的运行时性能得到提升。 + +以 GCC 11.3.0 和优化选项 `-O2` 为基础版本,优化 1 将优化选项提升为 `-O3`,启用编译器提供的更多优化技术。优化 2 将 GCC 版本升级为 12.2.0。优化 3 使用循环展开技术,以增加可执行文件大小为代价,减少因为分支预测错误造成的流水线停顿。应用该技术后,可执行文件大小从 23K 增大到 31K。优化 4 使用存储对齐技术,将函数起始位置、跳转指令位置和循环指令位置都按 8 字节对齐,优化取指。优化 5 设置了代码内联的参数,主要是限制自动内联的最大指令数。优化 6 是针对数学运算和 U74 CPU 的性能调优。优化 7 指定编译架构,因为 JH7110 支持 zba 和 zbb 等用于位运算加速的 RISC-V B 扩展指令集,所以设置该参数能够进一步提升 CoreMark 分值。 + +| 序号 | GCC 版本 | 编译参数 | 每秒迭代次数 | CoreMark 分值 | +|------|:-------:|:-------------------------------------------------------------------------------------:|:------------:|:------------:| +| | 11.3.0 | -O2 | 4986 | 3.32 | +| 1 | 11.3.0 | -O3 | 5235 | 3.49 | +| 2 | 12.2.0 | -O3 | 5322 | 3.55 | +| 3 | 12.2.0 | -O3 -fno-common -funroll-loops -funroll-all-loops | 5437 | 3.62 | +| 4 | 12.2.0 | ... -falign-functions=8 -falign-jumps=8 -falign-loops=8 | 5473 | 3.65 | +| 5 | 12.2.0 | ... -finline-functions --param max-inline-insns-auto=10 --param inline-min-speedup=10 | 6015 | 4.01 | +| 6 | 12.2.0 | ... -mtune=sifive-7-series -ffast-math | 6320 | 4.21 | +| 7 | 12.2.0 | ... -march=rv64gc_zba_zbb... | 6809 | 4.54 | + +通过对生成的二进制文件 `coremark.riscv` 反汇编,可以观察到有较多的 `add.uw` 指令,这些便是 RISC-V B 扩展中的指令,用于加速位运算。 + +```shell +$ riscv64-linux-gnu-objdump -d coremark.riscv | grep add.uw + ... + 3958: 08c587bb add.uw a5,a1,a2 + 39dc: 08c582bb add.uw t0,a1,a2 + 39e4: 08c78ebb add.uw t4,a5,a2 + 39ec: 08c70f3b add.uw t5,a4,a2 + 39f4: 08c68fbb add.uw t6,a3,a2 + 39fc: 08c883bb add.uw t2,a7,a2 + 3a04: 08c3043b add.uw s0,t1,a2 + 3a10: 08c802bb add.uw t0,a6,a2 + 3a14: 08ce04bb add.uw s1,t3,a2 + ... +``` + ## 总结 本文使用 CoreMark 测试集评测了 JH7110 这款 CPU,给出了其单核与 PGO 优化后的结果,并简单的对多核性能进行评测。本次实验中,JH7110 的 CoreMark 分数为 4.54 分/MHz,尽管采用了升级 GCC、添加编译参数等手段,但与官方的测试结果 5.09 分/MHz 相比仍有些差距。本文的实验调试参考了论坛上一篇关于 JH7110 处理器 CoreMark 测试分数复现的 [帖子][007],该作者实验达到的 CoreMark 分数为 4.83 分/MHz。今后将进一步分析原因,并使用更加专业的测试集 [CoreMark-Pro][002] 评测多核性能,给出其它 RISC-V 处理器的性能数据。 -- Gitee From 6460a56302418a8ac871ba1de5c0e0ef36e23689 Mon Sep 17 00:00:00 2001 From: Kepontry Date: Fri, 31 Mar 2023 02:24:34 -0700 Subject: [PATCH 2/2] update articles/20230323-vf2-coremark.md --- articles/20230323-vf2-coremark.md | 81 +++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/articles/20230323-vf2-coremark.md b/articles/20230323-vf2-coremark.md index 498c4fc..2f3047f 100644 --- a/articles/20230323-vf2-coremark.md +++ b/articles/20230323-vf2-coremark.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [codeinline tables pangu autocorrect]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.1 - [spaces tables pangu]
> Author: Kepontry
> Date: 2023/3/23
> Revisor: Falcon ; Bin Meng ; Walimis
@@ -6,7 +6,7 @@ > Proposal: [VisionFive 2 开发板软硬件评测及软件 gap 分析](https://gitee.com/tinylab/riscv-linux/issues/I64ESM)
> Sponsor: PLCT Lab, ISCAS -# VisionFive 2 开发板的 CoreMark 评测 +# VisionFive 2 开发板的 CoreMark 评测、优化与对比 ## 简介 @@ -223,20 +223,27 @@ CoreMark 1.0 : 27185.665740 / GCC12.2.0 -march=rv64gc_zba_zbb -O3 -fno-common -f 在以上代码中,编译参数 `CFLAGS` 的内容是经过多轮测试得到的较优版本,测试中参考了论坛中一篇关于 CoreMark 测试的 [帖子][007]。下表展示了具体的优化参数以及对应的 CoreMark 分值,添加优化参数后,编译时间增加,调试难度增加,但程序的运行时性能得到提升。 -以 GCC 11.3.0 和优化选项 `-O2` 为基础版本,优化 1 将优化选项提升为 `-O3`,启用编译器提供的更多优化技术。优化 2 将 GCC 版本升级为 12.2.0。优化 3 使用循环展开技术,以增加可执行文件大小为代价,减少因为分支预测错误造成的流水线停顿。应用该技术后,可执行文件大小从 23K 增大到 31K。优化 4 使用存储对齐技术,将函数起始位置、跳转指令位置和循环指令位置都按 8 字节对齐,优化取指。优化 5 设置了代码内联的参数,主要是限制自动内联的最大指令数。优化 6 是针对数学运算和 U74 CPU 的性能调优。优化 7 指定编译架构,因为 JH7110 支持 zba 和 zbb 等用于位运算加速的 RISC-V B 扩展指令集,所以设置该参数能够进一步提升 CoreMark 分值。 +以 GCC 11.3.0 和优化选项 `-O2` 为基础版本,以下优化的改动分别为: + * 优化 1 将优化选项提升为 `-O3`,启用编译器提供的更多优化技术。 + * 优化 2 将 GCC 版本升级为 12.2.0。 + * 优化 3 使用循环展开技术,以增加可执行文件大小为代价,减少因为分支预测错误造成的流水线停顿。应用该技术后,可执行文件大小从 23K 增大到 31K。 + * 优化 4 使用存储对齐技术,将函数起始位置、跳转指令位置和循环指令位置都按 8 字节对齐,优化取指。 + * 优化 5 设置了代码内联的参数,主要是限制自动内联的最大指令数。 + * 优化 6 是针对数学运算和 U74 CPU 的性能调优。 + * 优化 7 指定编译架构,因为 JH7110 支持 zba 和 zbb 等用于位运算加速的 RISC-V B 扩展指令集,所以设置该参数能够进一步提升 CoreMark 分值。 | 序号 | GCC 版本 | 编译参数 | 每秒迭代次数 | CoreMark 分值 | -|------|:-------:|:-------------------------------------------------------------------------------------:|:------------:|:------------:| -| | 11.3.0 | -O2 | 4986 | 3.32 | -| 1 | 11.3.0 | -O3 | 5235 | 3.49 | -| 2 | 12.2.0 | -O3 | 5322 | 3.55 | -| 3 | 12.2.0 | -O3 -fno-common -funroll-loops -funroll-all-loops | 5437 | 3.62 | -| 4 | 12.2.0 | ... -falign-functions=8 -falign-jumps=8 -falign-loops=8 | 5473 | 3.65 | -| 5 | 12.2.0 | ... -finline-functions --param max-inline-insns-auto=10 --param inline-min-speedup=10 | 6015 | 4.01 | -| 6 | 12.2.0 | ... -mtune=sifive-7-series -ffast-math | 6320 | 4.21 | -| 7 | 12.2.0 | ... -march=rv64gc_zba_zbb... | 6809 | 4.54 | - -通过对生成的二进制文件 `coremark.riscv` 反汇编,可以观察到有较多的 `add.uw` 指令,这些便是 RISC-V B 扩展中的指令,用于加速位运算。 +|------|:--------:|:-------------------------------------------------------------------------------------:|:------------:|:-------------:| +| | 11.3.0 | -O2 | 4986 | 3.32 | +| 1 | 11.3.0 | -O3 | 5235 | 3.49 | +| 2 | 12.2.0 | -O3 | 5322 | 3.55 | +| 3 | 12.2.0 | -O3 -fno-common -funroll-loops -funroll-all-loops | 5437 | 3.62 | +| 4 | 12.2.0 | ... -falign-functions=8 -falign-jumps=8 -falign-loops=8 | 5473 | 3.65 | +| 5 | 12.2.0 | ... -finline-functions --param max-inline-insns-auto=10 --param inline-min-speedup=10 | 6015 | 4.01 | +| 6 | 12.2.0 | ... -mtune=sifive-7-series -ffast-math | 6320 | 4.21 | +| 7 | 12.2.0 | ... -march=rv64gc_zba_zbb... | 6809 | 4.54 | + +通过对生成的二进制文件 `coremark.riscv` 反汇编,可以观察到有较多的 `add.uw` 指令,这些便是 RISC-V B 扩展中的指令,用于加速位运算。使用这些指令后,CoreMark 分数提升了 7.8%。 ```shell $ riscv64-linux-gnu-objdump -d coremark.riscv | grep add.uw @@ -253,9 +260,53 @@ $ riscv64-linux-gnu-objdump -d coremark.riscv | grep add.uw ... ``` +## 哪吒 D1 开发板性能对比 + +我们在哪吒 D1 开发板上使用 GCC11.3.0 编译 CoreMark 程序,进行对比测试,其在 `-O2` 和 `-O3` 优化参数下的得分分别为 2.31 和 2.49。与上表中的基础版本与应用优化 1 后的版本进行对比可以发现,VisionFive 2 开发板的性能要优于哪吒 D1 开发板。 + +```shell +$ ./coremark.riscv +2K performance run parameters for coremark. +CoreMark Size : 666 +Total ticks : 12869 +Total time (secs): 12.869000 +Iterations/Sec : 2331.183464 +Iterations : 30000 +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 : 0x5275 +Correct operation validated. See README.md for run and reporting rules. +CoreMark 1.0 : 2331.183464 / GCC11.3.0 -O2 / Heap + +$ ./coremark.riscv.o3 +2K performance run parameters for coremark. +CoreMark Size : 666 +Total ticks : 15926 +Total time (secs): 15.926000 +Iterations/Sec : 2511.616225 +Iterations : 40000 +Compiler version : GCC11.3.0 +Compiler flags : -O3 +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 : 0x25b5 +Correct operation validated. See README.md for run and reporting rules. +CoreMark 1.0 : 2511.616225 / GCC11.3.0 -O3 / Heap +``` + ## 总结 -本文使用 CoreMark 测试集评测了 JH7110 这款 CPU,给出了其单核与 PGO 优化后的结果,并简单的对多核性能进行评测。本次实验中,JH7110 的 CoreMark 分数为 4.54 分/MHz,尽管采用了升级 GCC、添加编译参数等手段,但与官方的测试结果 5.09 分/MHz 相比仍有些差距。本文的实验调试参考了论坛上一篇关于 JH7110 处理器 CoreMark 测试分数复现的 [帖子][007],该作者实验达到的 CoreMark 分数为 4.83 分/MHz。今后将进一步分析原因,并使用更加专业的测试集 [CoreMark-Pro][002] 评测多核性能,给出其它 RISC-V 处理器的性能数据。 +本文使用 CoreMark 测试集评测了 JH7110 这款 CPU,给出了其单核、多核与 PGO 优化后的测试结果,并与哪吒 D1 开发板进行对比。本次实验中,JH7110 的 CoreMark 分数为 4.54 分/MHz,尽管采用了升级 GCC、添加编译参数等手段,但与官方的测试结果 5.09 分/MHz 相比仍有些差距。本文的实验调试参考了论坛上一篇关于 JH7110 处理器 CoreMark 测试分数复现的 [帖子][007],该作者实验达到的 CoreMark 分数为 4.83 分/MHz。今后将进一步分析原因,并使用更加专业的测试集 [CoreMark-Pro][002] 评测多核性能。 ## 参考资料 -- Gitee