如何使用 perf 正确测量 IPC(每周期指令数)

How to correctly measure IPC (Instructions per cycle) with perf

我想知道如何使用 perf 正确测量每个周期的指令。作为参考:http://www2.engr.arizona.edu/~tosiron/papers/SPEC2017_ISPASS18.pdf 使用 inst_retired.anycpu_clk_unhalted.ref_tsc 进行计算,我现在想知道这是否是正确的方法。相比之下,PAPI 使用硬件计数器 PAPI_TOT_INSPAPI_TOT_CYC 来计算 IPC。

经过一些测量我得出结论:

在示例基准测试中,cpu-cyclescpu_clk_unhalted.ref_tsc 相差约 25%。现在的问题是,这两个值中哪一个是正确的计算值?或者两种方法都错了?

cpu-cycles 是实际的内核时钟频率,它随 turbo/power-save P-states 而变化。如果您关心微体系结构的事情,例如您实现的每时钟前端瓶颈有多接近 4 微指令,请使用它。

cpu_clk_unhalted.ref_tsc 是参考周期,并且始终以(接近)CPU 的额定/标签速度滴答作响。 (例如,我的 4GHz i7-6700k 上固定的 4008 MHz)。如果您关心每次的工作,包括选择加速或在部分内存受限时保持低时钟速度,请使用它(或 task-clock)。 (取决于 EPP 能源性能偏好设置。)

有趣的事实:它使用与 RDTSC 相同的时钟源,但事件计数器在时钟停止时不计时,例如在 CPU 频率转换期间)。

(半相关:How to get the CPU cycle count in x86_64 from C++? 了解更多关于 TSC 和 rdtsc