【发布时间】: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