linux - 'perf stat' 结果中的停滞周期前端和停滞周期后端是什么?

标签 linux performance optimization computer-architecture cpu-architecture

有人知道性能统计结果中 stalled-cycles-frontendstalled-cycles-backend 是什么意思吗?我在互联网上搜索但没有找到答案。谢谢

$ sudo perf stat ls                     

Performance counter stats for 'ls':

      0.602144 task-clock                #    0.762 CPUs utilized          
             0 context-switches          #    0.000 K/sec                  
             0 CPU-migrations            #    0.000 K/sec                  
           236 page-faults               #    0.392 M/sec                  
        768956 cycles                    #    1.277 GHz                    
        962999 stalled-cycles-frontend   #  125.23% frontend cycles idle   
        634360 stalled-cycles-backend    #   82.50% backend  cycles idle
        890060 instructions              #    1.16  insns per cycle        
                                         #    1.08  stalled cycles per insn
        179378 branches                  #  297.899 M/sec                  
          9362 branch-misses             #    5.22% of all branches         [48.33%]

   0.000790562 seconds time elapsed

最佳答案

理论:

让我们从这个开始:现在的 CPU 是超标量的,这意味着它们每个周期 (IPC) 可以执行多条指令。最新的英特尔架构最多可支持 4 个 IPC(4 个 x86 指令解码器)。让我们不要将宏观/微观融合带入讨论以使事情变得更加复杂:)。

通常,由于各种资源争用,工作负载不会达到 IPC=4。这意味着 CPU 正在浪费周期(指令数量由软件给出,CPU 必须在尽可能少的周期内执行它们)。

我们可以将 CPU 花费的总周期分为 3 类:

  1. 指令停用的周期(有用的工作)
  2. 在后端花费的周期(浪费)
  3. 在前端花费的周期(浪费)。

要获得 4 的 IPC,循环退出的数量必须接近循环总数。请记住,在此阶段,所有微操作 (uOps) 从管道中退出并将其结果提交到寄存器/缓存中。在这个阶段,你甚至可以有超过 4 个 uOps 退出,因为这个数字是由执行端口的数量给出的。如果您只有 25% 的周期淘汰 4 uOps,那么您的总体 IPC 将为 1。

在后端停滞的周期是一种浪费,因为 CPU 必须等待资源(通常是内存)或完成长延迟指令(例如超越数 - sqrt、倒数、除法等.).

在前端停滞的周期是一种浪费,因为这意味着前端不会为后端提供微操作。这可能意味着您在指令缓存中有未命中,或尚未在微操作缓存中解码的复杂指令。即时编译的代码通常会表达这种行为。

另一个停滞原因是分支预测未命中。这就是所谓的不良投机。在这种情况下,发出了 uOps,但由于 BP 预测错误,它们被丢弃了。

分析器中的实现:

您如何解释 BE 和 FE 停滞周期?

不同的分析器对这些指标有不同的方法。在 vTune 中,类别 1 到 3 加起来可提供 100% 的周期。这很合理,因为要么你的 CPU 停滞(没有 uOps 正在退休)要么它执行有用的工作(uOps)退休。在此处查看更多信息:https://software.intel.com/sites/products/documentation/doclib/stdxe/2013SP1/amplifierxe/snb/index.htm

在 perf 中,这通常不会发生。这是一个问题,因为当您看到 125% 的周期在前端停滞时,您不知道如何真正解释这一点。您可以将 >1 指标与有 4 个解码器的事实联系起来,但如果您继续推理,那么 IPC 将不匹配。

更好的是,你不知道问题有多大。 125% 什么?那么#cycles 是什么意思呢?

我个人对 perf 的 BE 和 FE 停滞周期有点怀疑,希望这会得到解决。

也许我们会通过从这里调试代码得到最终答案:http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/builtin-stat.c

关于linux - 'perf stat' 结果中的停滞周期前端和停滞周期后端是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165299/

相关文章:

c - 线程,定期生成 VS。陷入无限临时循环?

c++ - make_shared<>() 中的 WKWYL 优化是否会为某些多线程应用程序引入惩罚?

c++ - 我正在创建一个程序来在 C++ 中为 Codechef 实现埃拉托色尼筛法。但我需要一种方法来优化大输入的程序 (10^9)

c - 相当于 c 中的 rm –rf

c++ - Linux,如何截屏,模拟鼠标移动

linux - linux内核中调用的pci驱动的probe函数在哪里

java - Java 是否适合 Multi-Tenancy SAAS 架构?

linux - 拒绝远程计算机上的 root 用户更改 LDAP 用户详细信息

java - StringBuilder 和 ResultSet 性能问题的可能原因是什么

windows - 什么会导致应用程序和系统变慢?