特定处理器上的性能监视计数器(RDPMC)



我正在尝试使用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仍然为零。

所以我的问题是:

  1. 如何在用户模式下统计特定进程上的失效指令
  2. Event select C0HUmask 00H有什么区别,我想知道如何使用C0H00H

我将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,其中包括一个演示

如果你只想使用它,你真的不需要自己写。

相关内容

  • 没有找到相关文章

最新更新