我正计划测量一级、二级、三级未命中分支预测未命中的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.当我的_program()正在运行时,如果我的进程被调度到另一个内核,会发生什么情况?
2.如果进程被调度出去,并再次调度回同一个内核,同时一些其他进程重置PMU计数器,会发生什么情况?
如何确保我们从PMU计数器中读取的值正确。?
机器详细信息:CentOS,带Linux内核3.10.0-327.22.2.el7.x86ʂ,配备Intel(R)Core(TM)i7-3770 CPU,3.40GHz
谢谢

最佳答案

OP开始的the Intel forum thread总结:
Linuxperf子系统虚拟化性能计数器,但这意味着您必须使用系统调用(而不是rdpmc)读取它们,才能获得完整的虚拟化64位值,而不是体系结构性能计数器寄存器中当前的值。
如果您想在自己的代码中使用rdpmc以便它可以测量自己,请将每个线程固定到一个核心,因为上下文开关不保存/恢复pmc。没有简单的方法可以避免测量核心上发生的所有事情,包括中断处理程序和其他获得时间间隔的进程。这可能是件好事,因为您需要考虑内核开销的影响。
John D.McCalpin博士(以下简称“带宽博士”)的更多有用引述:
对于内联代码检测,您应该能够使用“perf events”API,但文档很少。一些资源可在http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html
您可以在/dev/cpu/*/msr设备文件上使用“pread()”来读取
MSRs——这可能比基于IOCTL的代码更容易阅读。这个
“msr-tools-1.3”中的“rdmsr.c”和“wrmsr.c”代码提供了极好的
例子。
有很多方法可以保留和共享
性能计数器,包括仅软件计数器和组合计数器
硬件+软件方法,但在这一点上
“标准”方法。(看起来英特尔有一个基于硬件的
使用MSR 0x392 IA32性能全局应用的方法,但我不知道
平台支持它。)
你的问题
如果我的进程在我的_program()运行时被调度到另一个内核,会发生什么情况?
您将看到随机垃圾,如果另一个进程在您的进程的时间段之间重置pmc,则会看到随机垃圾。

08-05 10:18