我想知道如何使用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%。现在的问题是,这两个值中哪个值是正确的计算?还是两种方法都不对?
答案 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