多态性的代价

用户名

我正在看下面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页。

  1. 我是否正确,因为前两个MOV指令都只占用2个CPU周期(它们都需要移动内存来注册)?我以为调用虚拟方法的速度比这慢?

  2. 在第178页的指令等待时间表中,该调用的等待时间为2个CPU周期(我认为呢?)。CALLCALL“ r”(寄存器)和CALL“ m”(存储器)相对,“近”是什么意思

  3. 因此,根据Fog手册,上述ASM确实需要6个CPU周期,我没有误解任何内容吗?

编辑:我将虚拟函数调用更改为vtable中的第二个。

osgx

我是否正确,因为前两个MOV指令都只占用2个CPU周期(它们都需要移动内存来注册)?我以为调用虚拟方法的速度比这慢?在第178页的指令等待时间表中,该调用的等待时间为2个CPU周期(我认为呢?)。

不,仅在最小延迟中有2个CPU周期。

让我们检查一下Agner的表格http://www.agner.org/optimize/instruction_tables.pdf

整数指令。

指令操作数uops融合域uops未融合域(p015 p0 p1 p5 p23 p4)延迟互惠吞吐量注释

Inst   Oper        fus p23 p4  Latency Rec.
MOV r32/64,m32/64   1   1        2     0.5

要找到时间,当指令产生结果时,应使用“等待时间”列。每个动作的延迟时间为2个周期,并且仅列出最小值(请参见“列标题的说明”中的检查文本-“延迟-这是指令在相关性链中生成的延迟。数字是最小值。高速缓存未命中,未对准...可能会大大增加时钟计数。”)

如果您有许多不同的多态调用,则可能不会缓存它们所需的内存。我们知道,从高速缓存和内存延迟不同的评论,并全部通过测量相关的长链MOV小号一样mov eax, [eax]; mov eax, [eax]; mov eax, [eax]; ...常春藤的值是:命中L1 = 4个周期,命中L2 = 11个周期,命中L3 = 30-40个周期,未命中的高速缓存和访问内存= 32个周期+ 60 ns(在3 GHz时,每个ns 3个周期> 200周期)。甚至没有简单的情况可以得到2个周期的延迟(哪个比LLU更接近ALU?对于重新排序的负载来说,只有72个条目的负载缓冲区?),并且第二次也没有机会有2个周期的延迟mov(其操作数为第一动作的结果,因此在第一动作退役之前没有任何乱序执行)。

在表中http://instlatx64.atw.hu/从链接昂纳的链接有常春藤报告InstLatX64的英特尔酷睿i7-3770K,3700兆赫与aida_bench64.dll制作

27 AMD64:MOV r64,[m64] L:1.14ns = 4.0c T:0.14ns = 0.50c

此表显示L了L1缓存命中的真实延迟(),为4个周期。

相同的数据(L1为4c,L2为12c,L3为26-31c)在64-ia-32-architectures-optimization-manual.pdf第46页“ 2.2.5.1加载和存储操作概述”中的表“ 2- 10查找顺序和加载延迟”

因此,根据Fog手册,上述ASM确实需要6个CPU周期,我没有误解任何内容吗?

在最佳情况下,如果在关键路径上以无序= 2个周期的形式尽早执行首次加载,则为最佳状态。L1中的第二个负载命中=关键路径上的4个周期;2个call执行周期BTB(分支目标预测/间接分支目标)成功,当您从呼叫的单个地址始终跳到同一目标(或跳到具有周期性模式的少量目标)时,这种可能性更大-您将有8个周期来确认该分支被预测为正确,可能会因目标功能的OoO执行而被部分隐藏。

如果L1 / L2中有任何负载丢失,则应添加相应的缓存延迟。如果L3未命中,则增加200个循环。

如果BTB未命中,您将有至少15个周期的罚款(请检查Agner的microarchitecture.pdf,第27页,“ 3.7 Intel Sandy Bridge和Ivy Brindge中的分支预测;误判罚款”)-缓存的uops;针对L1i中的目标的更多信息。您可以在同一microarchitecture.pdf第25页“ 3.5 PM和Core2中的分支预测;用于间接跳转和调用的模式识别”和“用于间接跳转和间接调用的BTB组织。”中阅读有关较旧的BTB的信息。

非常有用的文档来自英特尔:“英特尔®64和IA-32架构优化参考手册” 64-ia-32-architectures-optimization-manual.pdf它具有调优建议和有关性能计数器的信息,这将帮助您获得代码的实际延迟和遗漏率(请参阅B.6.3.2节“虚拟表和间接调用”)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章