如何使用PEBS测量IPC?

时间:2011-01-27 09:32:01

标签: x86 ipc performancecounter

PEBS是Intel CPU为采样性能监视器提供的采样机制。

是否可以使用PEBS来衡量流程的IPC? PEBS如何确定何时采样?

1 个答案:

答案 0 :(得分:3)

查看我对Do Core i3/5/7 CPUs provide a mechanism to measure IPC?的回答,以获取监视器名称来计算IPC。

是的,可以使用pfmon / pebs来获得IPC的近似值:

pfmon --smpl-module=pebs -ecpu_clk_unhalted --inv=1 --counter-mask=1 --long-smpl-periods=2660000 -uk -- foo 

pfmon --smpl-module=pebs -einstructions_retired --inv=1 --counter-mask=1 --long-smpl-periods=2660000 -uk -- foo

有两次使用pebs的pfmon运行。它们将为整个程序和每个函数提供instructions_retired和cpu_clk_unhalted样本计数的比率。

当每个2660000th事件(对于pfmon在上面运行)到位时,PEBS会进行采样。当pfmon启动时,它要求CPU计算特殊msr寄存器中的性能事件。 CPU将为进程计数事件,OS将在context_switch上保存不同进程的MSR。此外,当事件计数器的值为> = 2660000时,pfmon要求CPU给出异常。当异常发生时,pfmon将记录当前指令的EIP(并将其转换为函数名)并重置性能监视器。

PS使用来自linux内核的perf工具非常容易计算IPC: https://perf.wiki.kernel.org/index.php/Tutorial

每个进程:

perf stat -B -ecycles:u,instructions:u  dd if=/dev/zero of=/dev/null count=2000000

2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 1.91559 s, 535 MB/s

 Performance counter stats for 'dd if=/dev/zero of=/dev/null count=2000000':

    1,993,541,603 cycles
      764,086,803 instructions             #      0.383 IPC

       1.916930613  seconds time elapsed

系统范围(-a开关):

perf stat -B -ecycles:u,instructions:u -a sleep 5

 Performance counter stats for 'sleep 5':

      766,271,289 cycles
      596,796,091 instructions             #      0.779 IPC

       5.001191353  seconds time elapsed