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

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

问题描述:

从逻辑上讲,对任何CPU存储变量的写入都应该比各自的内存操作更快,因为不会有缓存未命中的机会。这些状态被缓存在CPU中,并且在下一个VMLAUNCH/VMRESUME操作之前它们不会更改任何CPU状态。因此,它们应该比存储器地址上的等效操作更快为什么VMREADs/VMWRITEs比内存读/写操作慢

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

英特尔方法的收益应该比AMD更快VMExit/VMResume次。但是,英特尔将放弃增加新指令的灵活性。

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

+2

'vmread'和'vmwrite'不仅仅是一个加载和存储。它们执行额外的检查(例如,VMCS字段必须存在)和操作(VMCS链接用于映射的VMCS)。另外,我不确定Intel是否保证所有的VMCS都必须被缓存,所以仍然会出现正常的负载。 –

+1

你说他们慢点的基础是什么?据我了解,在目前的处理器中,它们比L1命中速度稍慢,但比实际存储器要快许多倍。 – prl

+0

@prl:是吞吐量还是延迟?微码指令的吞吐量可能比L1D的加载或存储更差,但更好的延迟很容易相信。我根本没有使用它们,我只是用面值来回答我的答案。但是玛格丽特指出,他们对写作做了额外的检查,这使得片段比我想象的更好。 –

定期内存读取/写入操作使用专用硬件来优化它们,因为真正的程序充满了它们。

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


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

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

Nehalem每个时钟只能加载和/或存储一次,而不像Sandybridge家族可以每个时钟执行2次加载。但是段寄存器读取可能不会更快。

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