4、CPU性能测试:CoreMark标准测试、Dhrystone测试、多核负载均衡分析

CPU性能测试,说白了就是看看这颗芯片到底有多能打。在座舱系统里,CPU要同时处理导航、语音、仪表、娱乐等多个任务,性能不够就会卡顿,甚至黑屏。我见过不少项目,前期选型只看主频,结果跑起来才发现单核性能根本扛不住。

今天咱们就聊聊三个核心测试:CoreMark、Dhrystone,还有多核负载均衡分析。这些都是我实际项目中反复用过的,踩过坑,也总结了一些经验。

4.1 CoreMark标准测试

CoreMark是目前业界最主流的CPU性能基准测试之一。它不像某些跑分软件那样只测浮点或整数运算,而是模拟了真实嵌入式场景中的多种工作负载。

CoreMark测试的内容包括:

  • 列表操作(查找、排序、插入、删除)
  • 矩阵运算(矩阵乘法、矩阵转置)
  • 状态机模拟
  • CRC校验

我个人习惯用CoreMark来评估座舱SoC的单核性能。为什么?因为它测试的是处理器执行真实代码的能力,而不是单纯的理论峰值。

关键指标:CoreMark/MHz。这个值越高,说明每MHz能完成的工作越多。座舱芯片通常要求在2.0以上才算合格。

在QNX上跑CoreMark很简单。我一般这样操作:

# 下载CoreMark源码
wget https://github.com/eembc/coremark/archive/main.zip

# 解压并进入目录
unzip main.zip
cd coremark-main

# 编译(针对QNX aarch64)
make PORT_DIR=posix CC=aarch64-unknown-nto-qnx8.0.0-gcc

# 运行
./coremark.exe

跑完之后,你会看到类似这样的输出:

2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 12345
Total time (secs): 12.345
Iterations/Sec   : 810.04
Iterations       : 10000
Compiler version : GCC 8.3.0
Compiler flags   : -O2 -DPERFORMANCE_RUN=1
CoreMark Score   : 810.04

嗯,这里要注意:一定要用-O2或-O3优化编译。我见过有人用-O0跑,结果分数直接腰斩,还以为芯片有问题。

我的经验:在座舱项目中,我通常会在不同频率下跑CoreMark,比如1.2GHz、1.5GHz、1.8GHz,然后绘制一条频率-性能曲线。这样能看出芯片的线性度,也能发现散热降频的拐点。

4.2 Dhrystone测试

Dhrystone是更老牌的CPU性能测试,主要衡量整数运算能力。虽然它已经有些年头了,但在嵌入式领域依然有参考价值。

Dhrystone测试的特点:

  • 纯整数运算,不涉及浮点
  • 测试字符串操作、指针、函数调用等
  • 结果以DMIPS(Dhrystone Million Instructions Per Second)表示

为什么还要用Dhrystone?因为座舱系统中大量代码是C/C++写的,整数运算占了很大比重。CoreMark虽然更全面,但Dhrystone在评估编译器优化效果时特别有用。

注意:Dhrystone的代码量很小,容易受缓存影响。我曾经在某个项目中发现,同样的芯片,L1缓存大小不同,Dhrystone分数能差30%。所以对比时一定要确保缓存配置一致。

在QNX上跑Dhrystone,我一般用这个流程:

# 获取Dhrystone源码(网上有很多版本,我用的是经典版)
wget http://www.netlib.org/benchmark/dhrystone-c.tar.gz
tar -xzf dhrystone-c.tar.gz
cd dhrystone-c

# 编译
aarch64-unknown-nto-qnx8.0.0-gcc -O2 -o dhrystone dhry_1.c dhry_2.c

# 运行
./dhrystone

输出结果类似:

Dhrystone Benchmark, Version 2.1
Microseconds for one run through Dhrystone: 0.55
Dhrystones per Second:              1818181.8
VAX MIPS rating =                    1.03

这里有个坑:VAX MIPS rating是相对值,以VAX 11/780为基准(1 MIPS)。现代芯片动辄几百上千,这个数字看看就好,重点看Dhrystones per Second。

4.3 多核负载均衡分析

单核性能再强,也架不住座舱系统里几十个进程同时跑。多核负载均衡,说白了就是让每个核都忙起来,别让一个核累死,其他核闲死。

我在项目中遇到过这样的情况:某个核CPU占用率冲到95%,其他核只有20%。结果系统整体响应变慢,用户滑动屏幕都卡。这就是典型的负载不均。

多核负载均衡分析的关键指标:

指标 说明 理想值
CPU利用率标准差 各核利用率之间的差异程度 < 10%
最大核利用率 最忙核的利用率 < 80%
核间迁移次数 进程在不同核之间切换的频率 越低越好

在QNX上,我常用toppidin来观察负载分布:

# 查看每个核的利用率
pidin -p cpu

# 输出示例
CPU0:  45% user, 10% system, 45% idle
CPU1:  80% user,  5% system, 15% idle
CPU2:  30% user,  8% system, 62% idle
CPU3:  20% user,  5% system, 75% idle

看到CPU1跑到80%,其他核闲得发慌,这就是问题。

负载均衡分析步骤:

  1. pidin -p cpu采集各核利用率,持续30秒
  2. pidin -t查看每个线程的CPU亲和性
  3. 分析哪些进程占用了最多的CPU时间
  4. 检查是否有进程被绑定到了特定核

我曾经遇到一个案例:某个音频处理线程被绑定到了CPU0,而CPU0还要处理中断和调度。结果音频偶尔出现爆音。解决办法很简单——把音频线程迁移到空闲核上。

优化负载均衡的常用手段:

  • 调整亲和性:ThreadCtl(_NTO_TCTL_RUNMASK, ...)将关键线程绑定到特定核
  • 使用中断负载均衡:QNX支持将中断分配到不同核,避免中断风暴
  • 调整调度策略:对实时任务用FIFO调度,对普通任务用Round Robin

我的建议:不要盲目把所有线程都分散到所有核上。核间通信是有开销的。对于紧密耦合的任务,把它们放在同一个核上反而更快。你想想看,如果两个线程频繁交换数据,却分在两个核上,缓存命中率会大幅下降。

4.4 综合测试策略

在实际项目中,我不会只跑一个测试就下结论。我的做法是:

  1. 先跑CoreMark,评估单核综合性能
  2. 再跑Dhrystone,验证整数运算和编译器优化效果
  3. 最后做多核负载分析,确保系统能充分利用所有核

这三个测试结合起来,基本能全面反映CPU在座舱场景下的真实表现。我记得有一次,某款芯片CoreMark分数很高,但多核负载一上去就发热降频。这就是典型的「纸面性能」和「实际性能」的差距。

避坑指南:我曾经在测试时忽略了散热条件,结果跑出来的数据比量产车高了20%。后来才发现,测试时芯片是裸片加散热片,而量产时是封闭在座舱模块里。所以,一定要在目标散热条件下测试

好了,CPU性能测试这部分就聊到这儿。下一章咱们会讲内存和存储性能测试,那又是另一番天地了。