从逻辑上说,写入任何CPU存储的变量都应该比相应的内存操作更快,因为没有缓存丢失的机会。这些状态被缓存在CPU中,并且在下一个VMLAUNCH/VMRESUME操作之前不会更改任何CPU状态。因此,它们应该比对内存地址的等效操作更快。
当查看AMD和Intel提供的不同虚拟化解决方案时,就会出现这个问题。Intel已经规定,所有对VMCS数据结构的更改都应该通过VMREAD/VMWRITE接口,而不是通过常规内存R/W操作。然而,AMD不构成任何这样的限制,它的VMCB区域是通过常规的内存操作来修改的。
英特尔方法的收益应该是更快的VMExit/VMResume时间和AMD。然而,英特尔将在灵活性方面加入新的指令。
然而,实际上,VMREAD/VMWRITE操作比常规内存操作要慢。这对我来说没有任何意义。
发布于 2017-10-12 09:26:46
常规的内存读写是用专用硬件来处理的,以优化它们,因为真正的程序中充满了它们。
大多数工作负载在修改特定的CPU控制寄存器上花费的时间不多,因此对这些指令的内部处理通常没有经过很大的优化。在内部,它可以被微编码(即从微码ROM解码到多个uop)。
段寄存器可能不是一个很好的类比,因为编写段寄存器会触发CPU从GDT / LDT加载描述符。但根据阿格纳雾氏试验的说法,mov sr, r
每13个周期的吞吐量就有一个,并且可以解码到6uop(从微码)。(他停止为以后的CPU测试段寄存器。)实际上,我不确定这是在16位还是32位模式。如果是16位的实模式,那么写段寄存器不会读取描述符;它只是更新基和限制。
读取段寄存器更快:每个时钟一个。但这仍然比读取普通寄存器慢(常规mov
指令在Nehalem上的吞吐量为0.33c )。
Nehalem每个时钟只能加载和/或存储一次,而沙桥家族每个时钟只能加载2次。但段寄存器读取速度可能不会更快。
移动到/从控制寄存器可能会更慢,因为它比段寄存器更少见。
https://stackoverflow.com/questions/46705614
复制相似问题