我打算测量L1,L2,L3未命中分支预测未命中的PMU计数器,我已经阅读了相关的英特尔文档,但我不确定下面的情况。请注意一些吗?
//assume PMU reset and PERFEVTSELx configurtion done above
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start) //PMU start counters
my_program();
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_stop) ///PMU stop
//now reading PMU counters
1.如果我的进程在my_program()运行时被安排出来并安排到另一个核心,会发生什么?
2.如果进程预定并再次安排回同一核心,同时其他一些进程重置PMU计数器会发生什么?
如何确保我们从PMU计数器读取正确的值。?
机器详细信息:带有Linux内核3.10.0-327.22.2.el7.x86_64的CentOS,通过Intel(R)Core(TM)i7-3770 CPU @ 3.40GHz
启动
由于
答案 0 :(得分:1)
OP发起的the Intel forum thread摘要:
Linux perf
子系统虚拟化性能计数器,但这意味着您必须使用系统调用而不是rdpmc
来读取它们,以获取完整的虚拟化64位值当前在建筑性能计数器寄存器中的任何内容。
如果您想在自己的代码中使用rdpmc
以便自行测量,请将每个线程固定到核心,因为上下文切换不会保存/恢复PMC。没有简单的方法可以避免测量核心上发生的所有,包括中断处理程序和其他获得时间片的进程。这可能是一件好事,因为您需要考虑内核开销的影响。
来自John D. McCalpin博士的更多有用的引用(" Bandwidth博士"):
对于内联代码检测,您应该能够使用" perf事件" API,但文档很少。 http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html
提供了一些资源您可以使用" pread()"在/ dev / cpu / * / msr上读取设备文件 MSR - 这可能比基于IOCTL的代码更容易阅读。该 代码" rdmsr.c"和" wrmsr.c"来自" msr-tools-1.3"提供优秀 实例
有许多方法可以保留和分享 性能计数器,包括仅软件和组合 硬件+软件方法,但在这一点上没有 "标准"做法。 (看起来英特尔有一个基于硬件的 使用MSR 0x392 IA32_PERF_GLOBAL_INUSE的方法,但我不知道是什么 平台支持它。)
您的问题
如果我的进程在my_program()运行时被安排出来并安排到另一个核心会发生什么?
您会看到随机垃圾,如果另一个进程在您的进程的时间片段之间重置PMC,则相同。