【问题标题】:How to read PMC (Performance Monitoring Counter) of Intel processor?如何读取英特尔处理器的 PMC(性能监控计数器)?
【发布时间】:2018-08-17 04:06:52
【问题描述】:

我正在尝试使用 RDMSR 和 WRMSR 指令读取 PMC(性能监控计数器)。

在我的具有 Intel i7 6700 CPU (Skylake) 的 Linux 桌面上,我编写了一个简单的驱动程序代码:

static int my_init(void)
{
    unsigned int msr;
    u64 low, high;

    msr = 0x187;
    low = 0x412e;
    high = 0x0;

    asm volatile("1: wrmsr\n"
            "2:\n"
            : : "c" (msr), "a"(low), "d" (high) : "memory");

    msr = 0xC2;
    asm volatile("1: rdmsr\n"
            "2:\n"
            : "=a" (low), "=d" (high) : "c" (msr)); 

    printk("val: %lu\n", (low) | ((high) << 32));

    return  0;
}

参考 Intel 手册(18.2 ARCHITECTURAL PERFORMANCE MONITORING in Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide),在上面的代码中,我写了“0x412e”(# of L3 cache-misses)到“0x187”(IA32_PERFEVTSEL1 MSR)并读取“0xC2”(IA32_PMC1 MSR)。

但是,根据手册,必须在 EAX 中返回缓存未命中的数量:EDX(EAX 包含低位),实际上,0 作为低(EAX)和高(ECX)的值返回价值观。

我想知道如何使用 MSR 对(IA32_PERFEVTSELx 和 IA32_PMCx)监控 Intel CPU 的性能事件。更具体地说,缓存未命中的数量是我的目标。

如果您对此有任何想法,我将不胜感激您的建议。 谢谢。

【问题讨论】:

  • 顺便说一句,您没有编写自己的驱动程序。除了 Linux 的 perf 子系统之外,还有一些直接访问实现可以让您对性能计数器进行编程,然后在用户空间中使用 rdpmc 直接读取它们。例如@BeeOnRope 的uarch-bench 使用github.com/obilaniu/libpfc(SO 用户@Iwillnotexist)。还有 Agner Fog 的 testp 东西 (agner.org/optimize/#testp)。
  • 感谢您的评论。我会检查宏。通过使用它,我认为更容易实现我的目标。

标签: x86 intel inline-assembly performancecounter intel-pmu


【解决方案1】:

您对 PERFEVTSEL1 的编程不完整。

至少,您应该在第 22 位启用计数:

  • EN(启用计数器)标志(位 22)— 设置时,在相应的性能监控计数器中启用性能计数;当清零时,相应的计数器被禁用。

【讨论】:

  • 哇......你给了我一个很好的指导!我会立即尝试。非常感谢。
【解决方案2】:

您可以查看此源代码HPCTestDrv.c

【讨论】:

    猜你喜欢
    • 2023-02-19
    • 2018-12-23
    • 2018-05-16
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2016-03-22
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多