【问题标题】:Performance Monitoring Counter (RDPMC) on a specific processor特定处理器上的性能监控计数器 (RDPMC)
【发布时间】:2018-12-23 02:22:57
【问题描述】:

我正在尝试使用 RDPMC 指令来计算已停用的指令,并且正如英特尔软件开发人员手册第 3 卷附录 A(在性能监控部分)所述:

• 指令已停用 — 事件选择 C0H,Umask 00H 此事件计算引退时的指令数。对于包含多个微操作的指令, 此事件计算指令的最后一个微操作的退出。带有 REP 前缀的指令计数 作为一条指令(不是每次迭代)。多操作指令的最后一个微操作退出前的故障 不计算在内。

我使用来自here 的答案来启用 Linux Kernel-Mode 模块的性能计数器。

here可以看出(RDPMC的描述):

将 ECX 寄存器中指定的 40 位性能监控计数器的内容加载到寄存器 EDX:EAX 中。 EDX 寄存器加载计数器的高 8 位,EAX 寄存器加载低 32 位。 Pentium® Pro 处理器有两个性能监控计数器(0 和 1),它们分别通过在 ECX 寄存器中放置 0000H 或 0001H 来指定。

之后,我将 0 放入 RAX 并执行 RDPMC(在用户模式下),但在 RDPMC 执行多次后,EDX:EAX 仍然为零。

所以我的问题是:

  1. 如何统计用户模式下特定进程的 Retired Instructions?
  2. Event select C0HUmask 00H有什么区别,我想知道C0H00H怎么用?

【问题讨论】:

    标签: assembly x86 intel intel-pmu


    【解决方案1】:

    我把 0 放到 RAX 并执行 RDPMC

    选择器进入 ECX,而不是 EAX。

    如何统计用户态特定进程的Retired Instructions?

    如果您希望 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 来分析内容。 (例如,查看Can x86's MOV really be "free"? Why can't I reproduce this at all? 中的输出)。

    Perf 的instructions 事件使用Instructions Retired 计数器。 (实际上,它使用该事件的固定计数器,而不是用完其中一个可编程计数器上的插槽。)

    uops_issued.any 这样的非通用 uarch 特定事件的符号名称过去只能在 ocperf.py 包装脚本中使用,但 Arch Linux 上的 perf 4.15.gd8a5b8 直接支持它们。我认为这种变化是最近才发生的。

    Event select C0H和Umask 00H有什么区别,我想知道C0H和00H怎么用?

    您必须使用正确的事件和单位掩码对可编程计数器进行编程。 umask 通常选择一些相关事物的变体。有关每个事件的 umask 值在 Haswell 上的作用列表,请参阅 http://oprofile.sourceforge.net/docs/intel-haswell-events.php


    除了 Linux 中的大型复杂 perf 子系统之外,已经有一些开源库用于编程性能计数器以设置从用户空间读取它们。请参阅 Perf overcounting simple CPU-bound loop: mysterious kernel work? 获取 libpfc,其中包括演示。

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

    【讨论】:

    • 这是a summary,我写了一些方法来读取进程中的性能计数器。如果我现在开始并且真的想要进程内读取而不需要运行包装进程(如 likwid),我会使用 jevents。
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2016-12-04
    • 2019-07-18
    • 1970-01-01
    • 2023-02-19
    相关资源
    最近更新 更多