我有一个程序,它使用perf_event.h来计算特定运行进程的IPC。我读取INSTRUCTIONS计数器和CPU_CYCLES计数器来执行此操作。
我的问题是关于INSTRUCTIONS计数器返回的值。它是否包含浮点操作?如果不是,我如何得到这个值?
注意:我说的是perf_event.h,但是,是的,我也在谈论
perf
,我提到的计数器是您可以通过命令perf list
找到的计数器。
在英特尔架构上(我猜对其他人来说也是一样的),是的,它包含浮点指令。如果你看一下内核代码中的arch/x86/kernel/cpu/perf_event_intel.c
。您将看到instructions
事件被映射到0x00c0
:
[PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0
英特尔软件开发手册第19.1章说这个事件计数Instruction retired
,即所有被"证明"为流程确实需要的完成的指令(现代处理器执行的指令比程序流程需要的指令多得多)。这被称为"投机执行",见这里)