首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >特定处理器上的性能监视计数器(RDPMC)

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

Stack Overflow用户
提问于 2018-07-15 08:11:28
回答 1查看 1.2K关注 0票数 1

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

所以我的问题是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 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 ,其中包括一个演示。**

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51346543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档