为什么VMREAD / VMWRITE比内存读/写操作慢

时间:2017-10-12 09:07:42

标签: x86-64 intel virtualization amd

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

在研究AMD和英特尔提供的不同虚拟化解决方案时,会出现这个问题。英特尔已要求对VMCS数据结构的所有更改应始终通过VMREAD / VMWRITE接口,而不是通过常规内存R / W操作。但是,AMD没有提出任何此类限制,并且其VMCB区域通过常规内存操作进行修改。

与AMD相比,英特尔方法的收益应该是更快的VMExit / VMResume时间。但是,英特尔会在增加新指令时放松灵活性。

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

1 个答案:

答案 0 :(得分:1)

定期内存读/写由专用硬件处理,以优化它们的地狱,因为真正的程序充满了它们。

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

段寄存器可能不是一个很好的类比,因为写一个触发器会触发CPU从GDT / LDT加载描述符。但是根据Agner Fog's testing for Nehalemmov sr, r每13个周期吞吐量有一个,并且解码为6个uop(来自微代码)。 (他不再为以后的CPU测试段寄存器的内容。)实际上,我不确定它是在16位还是32位模式下。如果它是16位实模式,那么写段寄存器不会读取描述符;它只是更新基数和限制。

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

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

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