1

我正在使用 perf 工具在 Linux 中分析我的程序,当检查报告时,我发现一个地方真的让我感到困惑。我在下面附上几行报告:

  0.94 :          451ab5:       mov    (%r15),%r8
  0.44 :          451ab8:       mov    0x40(%rsp),%r15
  0.45 :          451abd:       mov    (%rsi),%rsi
  0.14 :          451ac0:       mov    (%r8,%rdi,4),%edi
  5.41 :          451ac4:       prefetcht0 (%rsi)
  0.11 :          451ac7:       lea    (%r15,%rdi,4),%rdi
  0.34 :          451acb:       mov    (%rdi),%r8d
  5.62 :          451ace:       add    %r8d,%eax
  0.18 :          451ad1:       prefetchnta (%rbx,%r8,4)
 24.46 :          451ad6:       mov    %r8,%r11
  0.11 :          451ad9:       mov    %eax,(%rdi)
  0.05 :          451adb:       mov    0x4(%rdx),%eax
  0.02 :          451ade:       lea    0x0(,%rax,4),%edi

我的困惑是为什么这条线(mov %r8,%11)花费这么多时间,据我了解,这条指令只将寄存器中的数据移动%r8%r11. 中的数据%r8加载到位置451acb

我的猜测是这条指令 ( mov (%rdi),%r8d) 只是触发了一个读取动作,但实际上并没有“阻塞”,当指令需要使用寄存器的内容时r8​​,它会“阻塞”直到内容被加载到 CPU 缓存中。

我的问题是我猜对了吗?

CPU : 英特尔 E5-2660 v4

4

0 回答 0