PMU适用于多线程环境

时间:2016-08-09 10:59:48

标签: c linux multithreading intel

我打算测量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

启动

由于

1 个答案:

答案 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,则相同。