X86 64 为什么VMREADs/VMWRITEs比内存读/写操作慢

X86 64 为什么VMREADs/VMWRITEs比内存读/写操作慢,x86-64,intel,virtualization,amd-processor,X86 64,Intel,Virtualization,Amd Processor,从逻辑上讲,写入任何CPU存储变量的速度都应该快于相应的内存操作,因为不存在缓存未命中的机会。这些状态缓存在CPU中,并且在下一次VMLAUNCH/VMRESUME操作之前不会更改任何CPU状态。因此,它们应该比内存地址上的等效操作快 当看到AMD和Intel提供的不同虚拟化解决方案时,就会出现这个问题。英特尔规定,对VMCS数据结构的所有更改都应始终通过VMREAD/VMWRITE接口进行,而不是通过常规内存R/W操作。然而,AMD不构成任何此类限制,其VMCB区域通过常规内存操作进行修改 与

从逻辑上讲,写入任何CPU存储变量的速度都应该快于相应的内存操作,因为不存在缓存未命中的机会。这些状态缓存在CPU中,并且在下一次VMLAUNCH/VMRESUME操作之前不会更改任何CPU状态。因此,它们应该比内存地址上的等效操作快

当看到AMD和Intel提供的不同虚拟化解决方案时,就会出现这个问题。英特尔规定,对VMCS数据结构的所有更改都应始终通过VMREAD/VMWRITE接口进行,而不是通过常规内存R/W操作。然而,AMD不构成任何此类限制,其VMCB区域通过常规内存操作进行修改

与AMD相比,Intel方法的收益应该是更快的VMExit/VMResume时间。然而,英特尔将在灵活性方面松懈,增加新的指令


然而,实际上,VMREAD/VMWRITE操作比常规内存操作慢。这对我来说没有任何意义。

常规内存读/写操作由专用硬件处理,以优化它们,因为真正的程序中充满了它们

大多数工作负载不会花费太多时间来修改特殊的CPU控制寄存器,因此这些指令的内部处理通常不会进行大量优化。在内部,它可能是微代码(即从微代码ROM解码到多个UOP)


段寄存器可能不是一个很好的类比,因为写入段寄存器会触发CPU从GDT/LDT加载描述符。但是根据mov sr,r每13个周期有一个吞吐量,并且解码到6个UOP(来自微码)。(他停止为以后的CPU测试段寄存器的东西。)实际上,我不确定这是在16位还是32位模式下。如果是16位实模式,那么写入段寄存器并不读取描述符;它只是更新了基础和限制

读取段寄存器的速度更快:每个时钟读取一个。但这仍然比读取普通寄存器慢(常规
mov
指令在Nehalem上的吞吐量为0.33c)

Nehalem每个时钟只能加载和/或存储一次,而Sandybridge系列每个时钟可以加载2次。但段寄存器读取速度可能不会更快


从控制寄存器移入/移出控制寄存器可能更慢,因为它比段寄存器少见。

常规内存读/写由专用硬件处理,以优化它们,因为实际程序中充满了它们

大多数工作负载不会花费太多时间来修改特殊的CPU控制寄存器,因此这些指令的内部处理通常不会进行大量优化。在内部,它可能是微代码(即从微代码ROM解码到多个UOP)


段寄存器可能不是一个很好的类比,因为写入段寄存器会触发CPU从GDT/LDT加载描述符。但是根据mov sr,r每13个周期有一个吞吐量,并且解码到6个UOP(来自微码)。(他停止为以后的CPU测试段寄存器的东西。)实际上,我不确定这是在16位还是32位模式下。如果是16位实模式,那么写入段寄存器并不读取描述符;它只是更新了基础和限制

读取段寄存器的速度更快:每个时钟读取一个。但这仍然比读取普通寄存器慢(常规
mov
指令在Nehalem上的吞吐量为0.33c)

Nehalem每个时钟只能加载和/或存储一次,而Sandybridge系列每个时钟可以加载2次。但段寄存器读取速度可能不会更快


从控制寄存器移入/移出控制寄存器可能更慢,因为它比段寄存器少见。

vmread
vmwrite
不仅仅是一个加载和存储。它们执行附加检查(例如,VMCS字段必须存在)和操作(VMCS链接用于隐藏的VMCS)。另外,我不确定英特尔是否保证所有的VMC都必须缓存,所以正常加载仍然可能发生。你凭什么说它们较慢?据我所知,在当前的处理器中,它们的速度比一次一级命中稍慢,但比实际进入内存的速度快很多倍。@prl:这是吞吐量还是延迟?微代码指令可能比L1D加载或存储的吞吐量差,但更好的延迟很容易让人相信。我根本没用过它们,我只是从表面上看问题来写我的答案。但Margaret的观点是,他们在书写时会做额外的检查,这比我想象的更好。谢谢大家的评论和回复。我对VMReads/VMWrites特别困惑,因为它们不会更改任何当前的来宾/主机状态。此外,没有对VMReads/VMWrites进行检查(我的意思是在字段上),而是对VMEntry进行检查。有一些检查与正确的操作模式有关,但这些检查非常琐碎。总之,我只是想比较Intel架构和AMD架构,当常规内存操作可以完成相同的工作时,似乎没有其他有效的理由来引入单独的指令。我知道我遗漏了什么。
vmread
vmwrite
不仅仅是一个加载和存储。它们执行附加检查(例如,VMCS字段必须存在)和操作(VMCS链接用于隐藏的VMCS)。另外,我不确定英特尔是否保证所有的VMC都必须缓存,所以正常加载仍然可能发生。你凭什么说它们较慢?据我所知,在当前的处理器中,它们的速度比一次一级命中稍慢,但比实际进入内存的速度快很多倍。@prl:这是吞吐量还是延迟?微代码指令可能比L1D加载或存储的吞吐量差,但更好的延迟很容易让人相信。我根本没用过,我只是把这个问题从表面上讲给了wri