我试图使用RDPMC指令来计算退役指令,正如英特尔软件开发人员手册第3卷附录A(在性能监控部分)所提到的:
·退出指令--事件选择C0H,U掩膜00H此事件计数退休时的指令数。对于由多个微操作组成的指令,此事件计算指令的最后一个微操作的退休时间。带有REP前缀的指令算作一条指令(不是每次迭代)。多操作指令的最后一次微操作退休前的故障不计算在内。
我使用来自这里的答案来启用Linux模块的性能计数器。
从这里 (RDPMC的描述)中可以看到:
将ECX寄存器中指定的40位性能监视计数器的内容加载到寄存器EDX:EAX中.EDX寄存器用计数器的高阶8位加载,EAX寄存器用低阶32位加载。Pentium Pro处理器有两个性能监视计数器(0和1),它们分别是通过将0000H或0001H放置在ECX寄存器中指定的。
在此之后,我将0放入RAX并执行RDPMC (在用户模式下),但是在RDPMC多次执行之后,EDX:EAX仍然为零。
所以我的问题是:
Event select C0H和Umask 00H有什么区别,我想知道如何使用C0H和00H发布于 2018-07-15 11:00:46
我将0放入RAX并执行RDPMC。
选择器进入ECX,而不是EAX。
如何在用户模式下计算特定进程上的退役指令?
如果您希望Linux在上下文切换和CPU迁移上虚拟化性能计数器,那么可以使用perf stat ./a.out来跟踪基于每个进程而不是基于每个CPU的性能计数器。或者,如果您正在手动编写性能计数器,请确保将您的流程固定在一个核心上。
我经常用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事件使用退出计数器的指令。(实际上,它为该事件使用固定计数器,而不是在一个可编程计数器上使用一个插槽。)
像uops_issued.any这样的非泛型uarch式事件的符号名称过去只能在ocperf.py包装脚本中使用,但是Arch上的perf 4.15.gd8a5b8直接支持它们。我认为这一变化是最近发生的。
事件选择C0H和U掩膜00H有什么区别,我想知道如何使用C0H和00H?
您必须用正确的事件和单元掩码对可编程计数器进行编程。人们通常会选择一些相关事物的变体。有关每个事件在Haswell上所做的umask值的列表,请参见http://oprofile.sourceforge.net/docs/intel-haswell-events.php。
除了Linux中庞大的一个复杂的perf子系统之外,已经有几个开放源码库来编程perf计数器,以便从用户空间读取它们。参见 Perf过多计算简单的CPU绑定循环:神秘的内核工作? for ,其中包括一个演示。**
如果你只想使用它,你真的不需要写你自己的东西。
https://stackoverflow.com/questions/51346543
复制相似问题