谷歌基准测试 负性能计数器

3

我正在使用Google/benchmark进行项目,刚开始尝试使用--benchmark_perf_counters标志。显然我做错了什么,因为性能计数器经常是负数。我假设这是一个溢出问题,但我仍然不太理解计数器的工作方式。

例如,第一个基准测试中CACHE-MISSES的值为0,而第二个基准测试却为-372k。这两个值都对我来说没有意义。(这两个基准测试在参数和运行时间上非常相似)

我正在Ubuntu 18.04上运行,使用Intel(R) Xeon(R) Gold 6138 CPU。Google benchmark版本为1.6.1,我已安装libpfm4-dev库。我使用--benchmark_perf_counters=CYCLES,INSTRUCTIONS,CACH-MISSES调用我的基准测试二进制文件。

-----------------------------------------------------------------------------------------------------
Benchmark                                           Time             CPU   Iterations UserCounters...
-----------------------------------------------------------------------------------------------------
bit::shift_left (small) (AA)                     3.15 ns         3.15 ns    221185726 CACHE-MISSES=0 CYCLES=11.0005 INSTRUCTIONS=15
bit::shift_left (small) (UU)                     2.65 ns         2.65 ns    254254663 CACHE-MISSES=-372.709k CYCLES=553.131k INSTRUCTIONS=372.709k
boost::shift_left (small) (AA)                   2.71 ns         2.71 ns    258007443 CACHE-MISSES=-367.288k CYCLES=-367.288k INSTRUCTIONS=3.87586n
std::shift_left (small)                          23.5 ns         23.5 ns     29812478 CACHE-MISSES=-3.17853M CYCLES=-102.703 INSTRUCTIONS=-972.747n

1
在哪个系统上?操作系统、CPU、软件版本是什么? - Peter Cordes
@PeterCordes 我已经更新了问题并提供了那些信息。 - Throckmorton
我假设你正在裸机上运行,或者以其他方式可以访问工作的性能计数器,因此像perf stat这样的已知良好的软件可以正常工作?(也许通过运行perf stat ./a.out来检查指令和周期(以及平均时钟速度)的计数,以检查此代码或其他任何内容)。 - Peter Cordes
是的,我已经在同一台机器上多次使用了 perf,没有出现任何问题。 - Throckmorton
1个回答

1

我曾经遇到过同样的问题!升级到最新版本的Google Benchmark(1.7.0)解决了这个问题,现在我的性能计数器结果很清晰易懂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接