我知道寫入組合寫入將被緩存,並且不會直接到達內存。 但是,程序員有必要在其他人可以訪問之前清楚地刷新此內存?是否需要刷新由程序員明確寫入組合內存?
我從圖形驅動程序代碼中得到了這個問題。例如,CPU填充頂點緩衝區(映射爲WC)。但在GPU訪問它之前,我在代碼中看不到任何刷新操作。 架構(x86)已經爲我們照顧過了嗎?有關於此的更多詳細信息?
我知道寫入組合寫入將被緩存,並且不會直接到達內存。 但是,程序員有必要在其他人可以訪問之前清楚地刷新此內存?是否需要刷新由程序員明確寫入組合內存?
我從圖形驅動程序代碼中得到了這個問題。例如,CPU填充頂點緩衝區(映射爲WC)。但在GPU訪問它之前,我在代碼中看不到任何刷新操作。 架構(x86)已經爲我們照顧過了嗎?有關於此的更多詳細信息?
根據英特爾®64和IA-32架構軟件開發人員手冊卷3A:系統編程指南,第1部分(2012年8月版本,但不應改變),第11.3.1節,緩衝區必須被刷新:
驅逐WC緩衝區的協議是依賴於實現的,不應該依靠軟件來依賴系統內存一致性。當使用WC存儲器類型時,軟件必須對將數據寫入系統存儲器被延遲這一事實敏感,並且在需要系統存儲器一致性時必須故意清空WC緩衝器。
如果圖形驅動程序實際上並沒有刷新寫結合緩衝液,然後將它們取決於系統的特定時間和/或緩衝器大小(在假定隨後的WC寫入將被分配給所述緩衝器,這不是結構上保證)。這可能在普通工作負載下的現有系統上工作(或似乎工作),但它在體系結構上不能保證工作。由於大量的序列化事件將刷新寫入組合緩衝區,所以很可能存在刷新操作/事件,但不是明顯的(如同SFENCE那樣)。從64和IA-32架構軟件開發人員手冊(052版本,2014年9月),第3卷,第緩存可用的11.3方法:
如果WC緩衝器部分地填充,寫操作可以被延遲,直到序列化事件的下一次出現;如SFENCE或MFENCE指令,CPUID執行,對未高速緩存的內存的讀取或寫入,中斷髮生或LOCK指令執行。
例如,寫入GPU寄存器(如果映射到未高速緩存的存儲器)將刷新寫入組合緩衝器。
非常詳細的答案。它使我困惑了很長時間。現在很清楚。 Thx很多! – 2014-09-25 04:50:22