whetstone CPU 性能基准测试指南
[ English | 简体中文 ]
本文档为 openvela 系统的开发者和性能工程师提供 whetstone 基准测试工具的详细使用指南。whetstone 是一个经典的综合性基准测试程序,旨在通过执行一系列标准化的计算任务,精确评估系统的浮点与整数运算性能。
一、概述
whetstone 是一个用于评估处理器算术性能的命令行工具。它通过执行一组包含浮点运算、整数运算、函数调用和数组访问等在内的混合计算任务,得出一个标准化的性能评分。
测试结果可以帮助开发者:
- 量化评估处理器的浮点运算单元 (Floating-Point Unit, FPU) 性能。
- 分析不同编译器优化等级 (
-O2,-O3等) 对代码执行效率的影响。 - 在不同硬件平台或系统配置之间进行算术性能对比。
二、系统配置
在运行测试前,您必须在 defconfig 文件中启用以下 Kconfig 选项,以确保 whetstone 测试套件及其依赖项被正确编译。
# 编译 Whetstone 基准测试工具
CONFIG_BENCHMARK_WHETSTONE=y
# Whetstone 测试的核心是浮点运算,必须启用 C 库的浮点支持
CONFIG_LIBC_FLOATINGPOINT=y
三、使用方法
whetstone 工具通过简单的命令行接口启动,并支持参数来控制测试的负载。
1、命令语法
whetstone [-c <iterations>] [<loops>]
2、参数说明
| 参数 | 说明 | 是否必需 | 默认值 |
|---|---|---|---|
[<loops>] |
模块循环次数。一个位置参数,用于设定每个内部测试模块的执行循环次数。增大此值会显著增加单个测试模块的计算量和执行时间。 | 否 | 1000 |
-c <iterations> |
总测试轮数。一个可选参数,用于设定整个 whetstone 测试套件的重复执行次数。 |
否 | 1 |
3、执行示例
-
执行一次标准测试:使用默认参数,每个模块循环 1,000 次,整个测试执行 1 轮。
whetstone -
增加每个模块的计算负载:每个模块循环 100,000 次,整个测试执行 1 轮。这适用于需要更长运行时间以获取稳定平均值的场景。
whetstone 100000 -
重复执行多次测试:每个模块循环 100,000 次,并且整个测试套件重复执行 10 轮。
whetstone 100000 -c 10
四、结果解读
测试完成后,whetstone 会输出测试配置、总耗时以及最终的性能评分。
1、示例输出
ap> whetstone 100000
Loops: 100000, Iterations: 1, Duration: 5 sec.
C Converted Double Precision Whetstones: 2.00 MWIPS
Loops: 100000: 每个模块执行了 100,000 次循环。Iterations: 1: 整个测试套件执行了 1 轮。Duration: 5 sec: 总耗时为 5 秒。C Converted Double Precision Whetstones: 2.00 MWIPS: 最终性能评分为 2.00 MWIPS。
2、关键指标说明
-
MWIPS / KWIPS
- 含义:
whetstone的性能单位,分别是 MWIPS (Mega Whetstone Instructions Per Second) 和 KWIPS (Kilo Whetstone Instructions Per Second)。 - 计算:
KIPS = (100.0 * loop * 1) / (执行时间(秒) * 1000),该值根据固定的基准任务量、测试循环次数 (loops和-c参数) 以及总执行时间计算得出。它是一个标准化的分数,分值越高,代表处理器的算术性能越强。 - 单位换算: 当评分低于 1 MWIPS (即 1000 KWIPS) 时,结果会以 KWIPS 显示。
- 含义:
五、测试模块详解
whetstone 基准测试由 11 个精心设计的计算模块组成,全面覆盖了不同的运算类型:
- 模块 1-4:基础浮点运算/数组操作/条件判断
- 模块 5:被省略的整数运算模块
- 模块 6:复杂整数运算
- 模块 7:三角函数计算(含反三角函数)
- 模块 8:过程调用测试
- 模块 9:数组索引测试
- 模块 10:简单整数运算
- 模块 11:数学函数链式调用
六、openvela 移植说明
此版本的 whetstone 针对嵌入式实时系统进行了关键优化。
- 优化的计时器精度: 原版
whetstone只有测试时间达到秒级才能得到结果。移植到 openvela 的版本达到毫秒级别就有精度输出。这使得在高性能的嵌入式 CPU 上,即使运行较少的循环次数,也能快速获得稳定且准确的性能数据。