如何使用 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.any
和 cpu_clk_unhalted.ref_tsc
进行计算,我现在想知道这是否是正确的方法。相比之下,PAPI 使用硬件计数器 PAPI_TOT_INS
和 PAPI_TOT_CYC
来计算 IPC。
经过一些测量我得出结论:
inst_retired.any:u
好像和PAPI_TOT_INS
一样
cpu-cycles
好像和PAPI_TOT_CYC
一样
在示例基准测试中,cpu-cycles
与 cpu_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
)
我想知道如何使用 perf 正确测量每个周期的指令。作为参考:http://www2.engr.arizona.edu/~tosiron/papers/SPEC2017_ISPASS18.pdf 使用 inst_retired.any
和 cpu_clk_unhalted.ref_tsc
进行计算,我现在想知道这是否是正确的方法。相比之下,PAPI 使用硬件计数器 PAPI_TOT_INS
和 PAPI_TOT_CYC
来计算 IPC。
经过一些测量我得出结论:
inst_retired.any:u
好像和PAPI_TOT_INS
一样
cpu-cycles
好像和PAPI_TOT_CYC
一样
在示例基准测试中,cpu-cycles
与 cpu_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
)