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

时间:2018-07-20 08:35:42

标签: x86 performancecounter perf papi

我想知道如何使用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。

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

  • inst_retired.any:u似乎与PAPI_TOT_INS
  • 相同
  • cpu-cycles似乎与PAPI_TOT_CYC
  • 相同

在示例基准测试中,cpu-cyclescpu_clk_unhalted.ref_tsc的差异约为25%。现在的问题是,这两个值中哪个值是正确的计算?还是两种方法都不对?

1 个答案:

答案 0 :(得分:3)

cpu-cycles是实际的核心时钟频率,它随Turbo /省电P状态而变化。如果您关心微体系结构方面的事情,例如要达到的每个时钟前端瓶颈4微秒的距离,请使用它。

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

有趣的事实:它使用与RDTSC相同的时钟源,但是事件计数器在时钟暂停时不会滴答,例如在CPU频率转换期间)。 Lost Cycles on Intel? An inconsistency between rdtsc and CPU_CLK_UNHALTED.REF_TSC