我正在使用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
perf stat
这样的已知良好的软件可以正常工作?(也许通过运行perf stat ./a.out
来检查指令和周期(以及平均时钟速度)的计数,以检查此代码或其他任何内容)。 - Peter Cordesperf
,没有出现任何问题。 - Throckmorton