如何使用 PEBS 测量 IPC?

发布于 2024-10-14 05:52:26 字数 91 浏览 5 评论 0原文

PEBS 是 Intel CPU 提供的一种采样机制,用于采样性能监视器。

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

PEBS is a sampling mechanism that Intel CPUs provide for sampling performance monitors.

Is it possible to use PEBS to measure a process's IPC? How does PEBS determine when to sample?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

胡渣熟男 2024-10-21 05:52:26

看看我对 Do Core i3 的回答/5/7 CPU 提供了一种测量 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 样本计数的比率。

PEBS 在每 2660000 个事件(对于上面运行的 pfmon)到位时进行采样。当 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

Look at my answer to Do Core i3/5/7 CPUs provide a mechanism to measure IPC? to get monitor names to count an IPC.

Yes, it is possible to use pfmon/pebs to get approximate value of 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

There are two runs of pfmon with pebs usage. They will give you ratio of instructions_retired and cpu_clk_unhalted samples count for entire programm and for each function.

PEBS does sample when every 2660000th event (for pfmon runs above) is in place. When pfmon starts, it asks CPU to count performance events in special msr registers. CPU will count events for process, and OS will save MSR of different processes on context_switch. Also pfmon asks CPU to give an exception when the event counter will have value >= 2660000. When the exception occurs, pfmon will record EIP of current instruction (and translate it to function name) and reset performance monitor.

PS the counting of IPC is very easy with perf tool from linux kernel:
https://perf.wiki.kernel.org/index.php/Tutorial

per-process:

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

system-wide (-a switch):

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文