我正在尝试使用RDPMC
指令来计算失效指令,正如《英特尔软件开发人员手册》第3卷附录A(性能监控部分(所述:
•失效的指令--事件选择C0H,单元掩码00H此事件统计失效时的指令数。对于由多个微操作组成的指令,此事件统计指令的最后一个微操作的失效。带有REP前缀的指令计数作为一条指令(不是每次迭代(。多操作指令的最后一个微操作失效前的故障不计算在内。
我使用了这里的答案来启用Linux内核模式模块中的性能计数器。
如您所见(RDPMC
说明(:
将ECX寄存器中指定的40位性能监视计数器的内容加载到寄存器EDX:EAX中。EDX寄存器加载计数器的高阶8位,EAX寄存器加载低阶32位。奔腾®;Pro处理器有两个性能监视计数器(0和1(,分别通过在ECX寄存器中放置0000H或0001H来指定。
之后,我将0设置为RAX
并执行RDPMC
(在用户模式下(,但在多次执行RDPMC
之后,EDX:EAX
仍然为零。
所以我的问题是:
- 如何在用户模式下统计特定进程上的失效指令
Event select C0H
和Umask 00H
有什么区别,我想知道如何使用C0H
和00H
我将0放入RAX并执行RDPMC
选择器进入ECX,而不是EAX。
如何在用户模式下统计特定进程上的失效指令?
如果您希望Linux虚拟化上下文开关和CPU迁移上的性能计数器,以按进程而不是按CPU跟踪,请使用perf stat ./a.out
。或者,如果您手动编程性能计数器,请确保将进程固定到核心。
我经常用perf stat -etask-clock,context-switches,cpu-migrations,page-faults,cycles,branches,instructions,uops_issued.any,uops_executed.thread ./a.out
来评测东西。(例如,请参阅x86的MOV真的可以"免费"吗?为什么我不能复制它?(。
Perf的instructions
事件使用失效的指令计数器。(实际上,它使用固定计数器来处理该事件,而不是使用一个可编程计数器上的插槽。(
非通用uarch特定事件(如uops_issued.any
(的符号名称过去仅在ocperf.py
包装脚本中可用,但Arch Linux上的perf 4.15.gd8a5b8
直接支持它们。我认为这种变化是最近才发生的。
Event select C0H和Umask 00H之间有什么区别,我想知道如何使用C0H和00H?
您必须使用正确的事件和单元掩码对可编程计数器进行编程。umask通常选择一些相关事物的变体。看见http://oprofile.sourceforge.net/docs/intel-haswell-events.php获取每个事件的umask值在Haswell上的作用列表。
除了Linux中庞大而复杂的perf
子系统外,已经有一些开源库用于对性能计数器进行编程,以设置从用户空间读取性能计数器。参见Perf过度计算简单的CPU绑定循环:神秘的内核工作?libpfc
,其中包括一个演示
如果你只想使用它,你真的不需要自己写。