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