4.5.10. CPU 性能测试
4.5.10.1. 测试原理
CoreMark 是
算法
选择: CoreMark 使用 了 以下 几种 基础 的 算法 和 操作: 整数
运算:包括 加法、乘法、位操作 等 常见 操作。 数据结构:测试
包含 了 链表、队列 等 数据结构 的 操作。 控制结构:涉及
循环、条件 判断 等 基本 的 控制结构。 矩阵
乘法 和 基本 计算 任务:用来 模拟 常见 的 数值 计算 任务。
测试
任务: CoreMark 测试 的 工作 负载 包括 了 下列 几个 方面: 计算
密集型 操作:例如 整数 加法、乘法 和 位 运算。 内存
操作:模拟 典型 的 内存 访问 模式,包括 链表 和 队列 的 操作。 任务调度
和 控制:涉及 复杂 的 控制流,例如 条件 判断 和 循环。
测试环境: CoreMark 的
测试运行 是 在 没有 其他 进程 或 线程 干预 的 环境 中 执行 的,这种 方式 确保 了 测试 结果 不 受 操作系统 调度、资源管理 等 因素 的 影响,从而 真实 反映 处理器 的 计算 性能。 性能
测量: CoreMark 的 性能指标 是 CoreMark 分数 (CoreMark score) ,这个 分数 反映 了 在 测试 期间 执行 的 算法 和 任务 的 平均 计算速度,分数 越高,表示 处理器 的 性能 越 好。
4.5.10.2. 测试准备工作
1. 长时间
2. 为top 命令
3. 在 app/platform_samples/chip_base_test/08_cpu_performance/coremark-main 路径coremark_O3_multi 和 coremark_O3_single,分别
如果cd 到
cd /app/platform_samples/chip_base_test/08_cpu_performance/coremark-main/
root@buildroot:/app/platform_samples/chip_base_test/08_cpu_performance/coremark-main# ls
LICENSE.md README.md barebones core_main.c core_state.c coremark.h coremark_O3_multi cygwin freebsd macos rtems
Makefile aarch64 core_list_join.c core_matrix.c core_util.c coremark.md5 coremark_O3_single docs linux posix simple
检测 cpu 工作频率
hrut_somstatus
=====================1=====================
temperature-->
DDR : 54.1 (C)
BPU : 53.4 (C)
CPU : 53.5 (C)
cpu frequency-->
min(M) cur(M) max(M)
cpu0: 300 1500 1500
cpu1: 300 1500 1500
cpu2: 300 1500 1500
cpu3: 300 1500 1500
cpu4: 300 1500 1500
cpu5: 300 1500 1500
cpu6: 300 1500 1500
cpu7: 300 1500 1500
bpu status information---->
min(M) cur(M) max(M) ratio
bpu0: 500 1000 1000 0
ddr frequency information---->
min(M) cur(M) max(M)
ddr: 266 4266 4266
GPU gc8000 frequency information---->
min(M) cur(M) max(M)
gc8000: 200 1000 1000
手动
echo userspace >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 1500000 >/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
4.5.10.3. 测试方法
1. 执行
确保
./coremark_O3_single
等待 10 秒
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 16665
Total time (secs): 16.665000
Iterations/Sec : 6600.660066
Iterations : 110000
Compiler version : GCC11.3.1 20220712
Compiler flags : -O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -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 : 0x33ff
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 6600.660066 / GCC11.3.1 20220712 -O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -lrt / Heap
2. 执行
确保
./coremark_O3_multi
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 16620
Total time (secs): 16.620000
Iterations/Sec : 52948.255114
Iterations : 880000
Compiler version : GCC11.3.1 20220712
Compiler flags : -O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -DMULTITHREAD=8 -DUSE_PTHREAD -DVALIDATION_RUN=1 -lrt -pthread -lrt
Parallel PThreads : 8
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
[4]crclist : 0xe714
[5]crclist : 0xe714
[6]crclist : 0xe714
[7]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[1]crcmatrix : 0x1fd7
[2]crcmatrix : 0x1fd7
[3]crcmatrix : 0x1fd7
[4]crcmatrix : 0x1fd7
[5]crcmatrix : 0x1fd7
[6]crcmatrix : 0x1fd7
[7]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[1]crcstate : 0x8e3a
[2]crcstate : 0x8e3a
[3]crcstate : 0x8e3a
[4]crcstate : 0x8e3a
[5]crcstate : 0x8e3a
[6]crcstate : 0x8e3a
[7]crcstate : 0x8e3a
[0]crcfinal : 0x33ff
[1]crcfinal : 0x33ff
[2]crcfinal : 0x33ff
[3]crcfinal : 0x33ff
[4]crcfinal : 0x33ff
[5]crcfinal : 0x33ff
[6]crcfinal : 0x33ff
[7]crcfinal : 0x33ff
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 52948.255114 / GCC11.3.1 20220712 -O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -DMULTITHREAD=8 -DUSE_PTHREAD -DVALIDATION_RUN=1 -lrt -pthread -lrt / Heap / 8:PThreads
结果
CoreMark Size:表示 CoreMark 基准测试 的 代码 和 数据 大小,单位 是 字节。在 这个 例子 中, CoreMark Size 为 666 字节,指 的 是 整个 CoreMark 测试代码 的 大小。 Total ticks:表示测试 过程 中 CPU 使用 的 总 时钟 周期 数。比如: 16665 表示 测试 总共 耗费 了 16665 个 时钟 周期。 Total time (secs):表示测试 所用 的 总 时间,单位 是 秒。 Iterations/Sec:每秒执行 的 迭代 次数,即 单位 时间 内 程序运行 的 次数,这里 是 6600 次 / 秒,即 评分 公式 的 coremark分数。Iterations:表示整个 测试 过程 中 执行 的 总 迭代 次数。 110000 表示 CoreMark 基准 测试 在 16.665 秒 的 时间 里 执行 了 110000 次测试 循环。 seedcrc: CRC 校验:这些是 循环 冗余 校验( CRC)值,用于 验证 测试 的 正确性。 Compiler flags: 编译器标志,这里 是 -O3和-lrt。CoreMark 1.0: 对关键 信息 的 汇总 , 6600 是 CoreMark 性能 得分,表示 每秒 迭代 次数,这个 值越 高,表示 处理器 性能 越强。
4.5.10.4. 测试指标
以下

CoreMark Iterations/Sec:表示每秒 执行 的 CoreMark 基准 测试 迭代 次数,通常 反映 处理器 的 性能。越高 的 迭代 次数 意味着 更强 的 计算能力。 CPU Clock (MHz):处理器的 时钟 频率,单位 是 MHz(兆赫兹)。它 反映 了 处理器 运行 的 速度,时钟 频率 越高,理论 上 处理器 每秒 可以 执行 的 操作 越 多。 CPU Cores:处理器的 核心 数, CoreMark 可以 在 单核 或 多 核 模式 下 进行 测试。
分数标准
-O3编译优化 的 CoreMark :在 x5 平台 上,单核 分数 应 达到 X > 4.2 。 -O2编译优化 的 CoreMark :在 x5 平台 上,单核 分数 应 达到 X > 3.7 。
如何理解评分标准
这
-O3 优化
是 GCC 和 其他 编译器 中 的 最高 优化 级别,通过 激进 的 优化 策略 来 提高 执行 速度。-O3 优化 级别 会 开启 很多 性能 优化 特性,如 循环展开、内联 函数 等,目标 是 获得 更 高 的 计算 性能。 -O2 优化 是
相对 较为 保守 的 优化 级别。相比 于 -O3 ,-O2 优化 不会 启用 一些 可能 导致 代码 大小 增加 的 激进 优化。因此,-O2 优化 通常 会 得到 更 平衡 的 性能 表现,并且 能 兼顾 性能 和 可移植性。
根据 -O3 优化CoreMark Score = 6600 /( 1500 x 1 ) = 4.4, 其
根据 -O3 优化CoreMark Score = 52948 /( 1500 x 8 ) ≈ 4.41 , 其
4.5.10.5. 常见问题
1. 问:需要-O2 和 -O3 编译
1. 答:测试-O2 编译app/platform_samples/chip_base_test/08_cpu_performance/coremark-main 路径
编译-O2 的 coremark 命令:
make PORT_DIR=aarch64 XCFLAGS="-O2 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55" REBUILD=1 run1.log
mv coremark.exe coremark_O2_single
编译 8 核-O2 的 coremark 命令:
make PORT_DIR=aarch64 XCFLAGS="-O2 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -DMULTITHREAD=8 -DUSE_PTHREAD -DVALIDATION_RUN=1 -lrt -pthread" REBUILD=1 run2.log
mv coremark.exe coremark_O2_mutli
编译-O3 的 coremark 命令:
make PORT_DIR=aarch64 XCFLAGS="-O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55" REBUILD=1 run1.log
mv coremark.exe coremark_O3_single
编译 8 核-O3 的 coremark 命令:
make PORT_DIR=aarch64 XCFLAGS="-O3 -funroll-all-loops -static --param max-inline-insns-auto=550 -DPERFORMANCE_RUN=1 -mcpu=cortex-a55 -DMULTITHREAD=8 -DUSE_PTHREAD -DVALIDATION_RUN=1 -lrt -pthread" REBUILD=1 run2.log
mv coremark.exe coremark_O3_multi