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

X86 如何使用perf正确测量IPC(每个周期的指令数),x86,performancecounter,perf,papi,X86,Performancecounter,Perf,Papi,我想知道如何使用perf正确测量每个周期的指令。作为参考:使用inst\u retired.any和cpu\u clk\u unhalted.ref\u tsc进行计算,我现在想知道这是否是正确的方法。相比之下,PAPI使用硬件计数器PAPI_TOT_INS和PAPI_TOT_CYC计算IPC 经过一些测量,我得出结论: inst\u已退役。任何:u似乎与PAPI\u TOT\u INS cpu周期似乎与PAPI\u TOT\u CYC 在一个示例基准测试中,cpu周期与cpu\u clk\

我想知道如何使用perf正确测量每个周期的指令。作为参考:使用
inst\u retired.any
cpu\u clk\u unhalted.ref\u tsc
进行计算,我现在想知道这是否是正确的方法。相比之下,PAPI使用硬件计数器
PAPI_TOT_INS
PAPI_TOT_CYC
计算IPC

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

  • inst\u已退役。任何:u
    似乎与
    PAPI\u TOT\u INS
  • cpu周期
    似乎与
    PAPI\u TOT\u CYC

在一个示例基准测试中,
cpu周期
cpu\u clk\u unhalted.ref\u tsc
相差约25%。现在的问题是,这两个值中哪一个是正确的计算值?或者这两种方法都是错误的?

cpu周期是实际的核心时钟频率,随turbo/节能p状态而变化。如果你关心微体系结构的事情,比如你达到的每时钟4 UOP前端瓶颈有多接近,就使用它

cpu_clk_unhalted.ref_tsc
是参考循环,始终以(接近)cpu的额定/贴纸速度滴答作响。(例如,在我的4GHz i7-6700k上安装了固定的4008 MHz)。如果您关心每次的工作,包括在部分内存受限时选择涡轮增压或保持低时钟速度,请使用它(或
任务时钟
)。(取决于EPP能源性能首选项设置。)

有趣的事实:它使用与RDTSC相同的时钟源,但当时钟停止时(例如CPU频率转换期间),事件计数器不会滴答作响


(半相关:有关TSC和
rdtsc
的更多信息)

如果您提供有关应用程序、系统和系统配置的具体信息,我们可以给出更好的答案。