use*_*112 5 cpu x86 assembly branch-prediction
我在x86-64中查看下面的虚方法调用:
mov     rcx, qword ptr [x]   
mov     rax, qword ptr [rcx]
call    qword ptr [rax+8]
以及Agner Fog的延迟表:
http://www.agner.org/optimize/instruction_tables.pdf
当我使用Ivy Bridge CPU时,我正在查看第175页.
我是否正确,前两个MOV指令都只占用2个(它们都是移动存储器来注册)CPU周期?我以为对虚拟方法的调用比这慢?
在178页的指令延迟表中,它表示此调用的延迟是2个CPU周期(我认为?).CALL与CALL'r'(寄存器)和CALL'm'(存储器)相比,'near'意味着什么?
所以根据Fog小册子,上面的ASM确实需要6个CPU周期,我没有误解过任何东西?
编辑:我将虚函数调用更改为vtable中的第二个.
\n\n\n我是否正确,前两条 MOV 指令都只需要 2 个(它们都是将内存移动到寄存器)CPU 周期?我认为对虚拟方法的调用比这慢?\n 在指令延迟表第 178 页中,它表示此调用的延迟是 2 个 CPU 周期(我认为?)。
\n
不会,只有 2 个 CPU 周期,延迟极短。
\n\n让我们检查一下 Agner 的表格http://www.agner.org/optimize/instruction_tables.pdf
\n\n\n\n\n整数指令。
\n\n指令 操作数 uops 融合域 uops 未融合域 (p015 p0 p1 p5 p23 p4) 延迟 倒数吞吐量 注释
\n\nRun Code Online (Sandbox Code Playgroud)\nInst Oper fus p23 p4 Latency Rec.\nMOV r32/64,m32/64 1 1 2 0.5\n
要找到指令产生结果的时间,您应该使用“延迟”列。每个 mov 的延迟为 2 个周期,并且仅列出最小值(检查“列标题说明”中的文本 - “延迟 - 这是指令在依赖链中生成的延迟。数字是最小值。缓存未命中” 、错位……可能会大大增加时钟计数。”)
\n\n如果您有许多不同的多态调用,则它们所需的内存可能不会被缓存。我们从不同的评论中了解到缓存和内存延迟,所有这些都是通过长链依赖来MOV测量的mov eax, [eax]; mov eax, [eax]; mov eax, [eax]; ...。Ivy 的值为:L1 命中 = 4 个周期,L2 命中 = 11 个周期,L3 命中 = 30-40 个周期,高速缓存和访问存储器未命中 = 32 个周期 + 60 ns(在 3 GHz 下,每 ns 3 个周期 > 200)周期)。甚至不存在获得 2 个周期延迟的简单情况(什么比 L1 更接近 ALU?只有 72 个条目的加载缓冲区用于重新排序加载?),并且第二个不会有 2 个周期延迟mov(其操作数是第一个 mov 的结果,因此在第一个 mov 退休之前没有任何乱序执行的情况)。
在Agner 链接链接的表http://instlatx64.atw.hu/中,有使用 aida_bench64.dll 制作的Ivy InstLatX64 for Intel Core i7-3770K, 3700 MHz的报告
\n\n\n\n\n27 AMD64 :MOV r64, [m64] L: 1.14ns= 4.0c T: 0.14ns= 0.50c
\n
此表显示了LL1 缓存中命中的实际延迟 ( ),4 个周期。
64-ia-32-architectures-optimization-manual.pdf第 46 页“2.2.5.1 加载和存储操作概述”部分中的相同数据(L1 为 4c,L2 为 ~12c,L3 为 26-31c) ,表“2- 10 查找顺序和加载延迟"
\n\n\n\n\n所以根据 Fog 小册子,上面的 ASM 确实需要 6 个 CPU 周期,我没有误解任何东西?
\n
在最好的情况下,当第一次加载提前执行时,关键路径上的乱序 = 2 个周期;L1 中的第二次负载命中 = 关键路径上的 4 个周期;2个周期call执行;BTB(分支目标预测/间接分支目标)是成功的,当从调用的单个地址总是跳转到同一目标(或具有周期性模式的少量目标)时,这种情况更有可能发生——您将有 8 个周期来确认该分支被预测正确,这可能被目标函数的 OoO 执行部分隐藏。
如果 L1/L2 中出现任何加载未命中,则应添加相应的缓存延迟。如果 L3 未命中,则添加 200 个周期。
\n\n如果 BTB 未命中,您将受到至少 15 个周期的惩罚(请查看Agner 的 microarchitecture.pdf,第 27 页“3.7 Intel Sandy Bridge 和 Ivy Brindge 中的分支预测;错误预测惩罚”)- 对于缓存的 uops;L1i 中的目标有更多信息。您可以在同一 microarchitecture.pdf 第 25 页“3.5 PM 和 Core2 中的分支预测;间接跳转和调用的模式识别”和“BTB 组织..用于间接跳转和间接调用”中阅读有关旧版 BTB 的信息。
\n\n非常有用的文档来自 Intel:“Intel\xc2\xae 64 和 IA-32 架构\n优化参考手册” 64-ia-32-architectures-optimization-manual.pdf。它包含调整建议和有关性能计数器的信息,这将帮助您获得代码的实际延迟和错过率(请查看 B.6.3.2 部分“虚拟表和间接调用”)。
\n