如何阅读英特尔处理器的PMC(性能监控计数器)?

问题描述 投票:3回答:2

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

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

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;
}

参考英特尔手册(英特尔®64和IA-32架构软件开发人员手册第3B卷:系统编程指南中的18.2架构性能监控),在上面的代码中,我将“0x412e”(L3缓存未命中数)写入“0x187” “(IA32_PERFEVTSEL1 MSR)并读取”0xC2“(IA32_PMC1 MSR)。

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

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

如果你对此有任何想法,我将不胜感激。谢谢。

x86 intel inline-assembly performancecounter intel-pmu
2个回答
4
投票

您对PERFEVTSEL1的编程不完整。 PERFEVTSEL1

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

  • EN(启用计数器)标志(第22位) - 置位时,在相应的性能监视计数器中启用性能计数;清除时,相应的计数器被禁用。

-1
投票

你可以看看这个源代码HPCTestDrv.c

© www.soinside.com 2019 - 2024. All rights reserved.