2017-10-12 64 views
0

從邏輯上講,對任何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的加載或存儲更差,但更好的延遲很容易相信。我根本沒有使用它們,我只是用面值來回答我的答案。但是瑪格麗特指出,他們對寫作做了額外的檢查,這使得片段比我想象的更好。 –

回答

1

定期內存讀取/寫入操作使用專用硬件來優化它們,因爲真正的程序充滿了它們。

大多數工作負載不會在修改特殊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次加載。但是段寄存器讀取可能不會更快。

移入/移出控制寄存器可能會更慢,因爲它比段寄存器更爲罕見。