我正在使用 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