骯髒的位追蹤
本文說明從 Windows 11 版本 24H2 (WDDM 3.2) 開始支援的髒位追蹤功能。 支援 GPU 平行處理裝置 上即時移轉的驅動程式也必須支援骯髒的位追蹤。
簡介
隨著雲端案例中的 GPU 變得更受歡迎,因此越來越多的需要確保虛擬機從一部實體主機移轉至另一部實體主機維持合理的效能。 這不僅需要減少用戶的影響,也為了避免在移轉 VM 時發生 TCP 要求逾時等問題。
在實體主機之間傳輸記憶體內容是在兩次整體傳遞中完成:
Brownout:在棕色期間,虛擬機仍在執行中,但系統會執行反覆儲存任何臟數據。 目標是,在每次反覆運算期間所擷取的數據量會變小,直到其聚合在可快速複製的數據子集上為止。 此數據量會根據計算機的工作負載而有所不同,且不保證會聚合至任何特定大小。
封鎖:在停電期間,虛擬機會暫停,並複製所有剩餘的臟數據。 此復本可確保目的地機器上產生的數據狀態與來源相同。
若沒有髒位追蹤,系統必須在停電期間依賴 GPU 框架緩衝區 (VRAM) 的單一完整複本。 若要支援棕色傳遞,硬體必須能夠主動追蹤已抹除的記憶體頁面,並將其回報給 OS,讓 OS 只知道要複製的記憶體。
詳細設計
報告功能
在配接器初始化期間, Dxgkrnl 會查詢驅動程式,以詢問硬體所使用之臟位平面格式的相關信息;也就是每一位所代表的頁面大小(或數據量)。
啟動和停止髒擷取
如果追蹤髒資訊對硬體的效能具有很高的成本,則只有在棕色期間才啟用骯髒的追蹤是合理的。 在此期間,將移轉成本降至最低,比追蹤的潛在效能影響更重要。
不過,如果對效能沒有任何影響或微不足道,一律啟用此行為會有好處。 有些使用者可能不會在其 VM 上執行繁重的 GPU 工作負載,因此記憶體可能不會從頭被嚴重地抹除。 藉由在啟動時啟用骯髒的位追蹤,則布朗出線的第一個反覆專案可以立即使用髒數據,而不需要完整復本框架緩衝區。 如果使用者已擷取的記憶體數量很小(例如,使用者主要是CPU工作負載),則移轉的成本節省可能會相當顯著。
查詢臟位
Dirty 資訊會以骯髒頁面的位平面表示。 位平面中的每個位都代表一個記憶體的「頁面」。 臟數據的頁面大小不需要與 GPU 上虛擬尋址的自然頁面大小一致(例如 4KB/64KB)。 它可以是最適合特定硬體的任何專案。 驅動程式會在初始化期間報告此頁面大小。
在棕色期間, Dxgkrnl 會查詢硬體,以尋找每個反覆專案之間的臟數據。 此時,驅動程式必須能夠以不可部分完成的方式查詢和重設位平面數據。 也就是說,硬體必須能夠在單一不可部分完成的作業中查詢值,並將其重設為零,以避免遺失臟資訊中的數據。
虛擬機不一定全部移轉至相同的目的地,因此會針對每個虛擬 GPU 實例進行畫面緩衝區移轉。 因此,驅動程式必須能夠查詢代表該特定虛擬 GPU 實例之整體框架緩衝區之指定子範圍的位平面資訊。 例如,8 GB GPU 分割四種方式必須能夠個別查詢和重設每個 2 GB VRAM 範圍的位,而不會影響其他臟位數據。
DDI 變更
功能
下列上限會新增至 DXGK_QUERYADAPTERINFOTYPE。
DXGKQAITYPE_DIRTYBITTRACKINGCAPS
系統現在會呼叫 KMD 的 DxgkDdiQueryAdapterInfo 函式,並在適配卡初始化期間呼叫DXGKQAITYPE_DIRTYBITTRACKINGCAPS DXGK_QUERYADAPTERINFOTYPE,以判斷用於骯髒位追蹤的驅動程式和硬體功能。
KMD 應該填入 pOutputData 指向的所提供DXGK_DIRTY_BIT_TRACKING_CAPS結構。
DXGKQAITYPE_DIRTYBITTRACKINGSEGMENTCAPS
如果 KMD 將 DirtyBitTrackingSupported 設定為 TRUE,系統會呼叫 KMD 的 DxgkDdiQueryAdapterInfo 函式,並針對系統上的每個記憶體區段呼叫 DXGK_QUERYADAPTERINFOTYPE DXGKQAITYPE_DIRTYBITTRACKINGSEGMENTCAPS,以查詢有關髒位追蹤支持的資訊。
KMD 應該填入 pOutputData 指向的提供的DXGK_DIRTY_BIT_TRACKING_SEGMENT_CAPS結構。
記憶體基礎 DIS
追蹤 VRAM 上的修改作業適用於可能不連續支援的配置。 例如,即時移轉中的初始用法適用於虛擬函式框架緩衝區保留的追蹤。 因此,在追蹤臟位時所代表的實體位址是由代表所操作配置的範圍集合所組成。
請務必確保作業符合相同的範圍。 在許多情況下,此比對必須是介面的強制不變,以確保正確追蹤狀態。 為了協助進行 KMD 的追蹤,會引進下列介面: