概觀
指令追蹤擷取可協助您最佳化遊戲對主機記憶體與指令快取的使用。PIX 會記錄擷取執行期間所執行之每個 CPU 指令的資料。接著會使用快取模擬分析所有記憶體載入與儲存指令。模擬結果可用來:- 識別哪些函式造成最多快取遺漏,以及將最多資料載入快取。也會識別造成快取遺漏的特定 C++ 原始程式碼行與組譯指令。
- 檢視每個 CPU 核心與模組的快取命中與遺漏統計資料。
- 以視覺方式呈現每個快取行的使用效率。指令追蹤擷取會顯示快取行中有哪些位元組被存取,以及存取每個位元組的程式碼。也會提供資料結構資訊,協助您最佳化資料配置,以充分利用記憶體快取。
進行擷取
指令追蹤會從擷取開始時起,記錄指定數目之 CPU 指令的資料。要擷取的指令數目,是在開始擷取之前,使用 CPU Instruction Trace Options 窗格上的 Instructions per thread to capture 欄位指定。請注意,您指定的指令數目會針對遊戲處理程序中執行的每個執行緒進行擷取。PIX 也可以選擇性地記錄每個原始程式碼行與組譯指令所存取之資料類型的相關資訊。選取 Track Data Types 核取方塊,即可在擷取中新增資料類型資訊。 指定指令數目與類型追蹤選項後,選取 Capture 按鈕即可開始擷取。
指令追蹤版面配置
- Summary。提供遊戲與主機中資料快取及指令快取互動方式的摘要。
- Instruction Table。顯示針對指定函式執行的 CPU 指令。也會提供所存取之資料類型,以及哪些組譯指令造成資料快取遺漏的資訊。
- Source。顯示指定函式的 C++ 原始程式碼。也會提供所存取之資料類型,以及哪些原始程式碼行造成資料快取遺漏的資訊。
- Callgraph。顯示擷取期間執行之所有函式的呼叫圖。此檢視可用來檢查每次呼叫的各種統計資料,包括快取遺漏次數、依指令類型的細分等。也提供函式蝴蝶檢視,可用來瀏覽指定函式的呼叫端與被呼叫端。
- Memory Regions。提供一組位址範圍之記憶體存取模式的詳細資料。
- Memory Region Details。顯示存取目前所選區域中記憶體的 C++ 原始程式碼行與組譯指令,以提供更進一步的快取行分析。
Capture Summary
指令追蹤擷取開啟時會顯示摘要版面配置,提供遊戲與系統中記憶體快取及指令快取互動方式的分析。也會提供警告,例如從寫入合併記憶體讀取。 摘要頁面的 Execution Summary 區段會顯示擷取的一些基本統計資料,包括依類型細分的指令,以及載入與儲存的資料量。




Instruction Table
Instruction Table 版面配置可用來檢查針對指定函式所執行的 CPU 指令集合。會為每個執行的指令提供執行次數與快取遺漏次數。如果開始擷取之前選取了 Track Data Types 選項,也會顯示每個指令所存取的資料類型。通常是透過按一下 Summary 版面配置中函式旁的超連結,瀏覽至 Instruction Table 版面配置。



Source
Source 版面配置可用來檢查指定函式的 C++ 原始程式碼。通常是透過按一下 Summary 版面配置中函式旁的超連結,或在 Summary 版面配置或 Instruction Table 版面配置中選取 Goto Source 操作功能表項目,瀏覽至此版面配置。


Callgraph
指令追蹤包含一個版面配置,顯示擷取期間執行之所有函式的呼叫圖。每個執行過程式碼的執行緒都是樹狀結構中的最上層節點。檢視中的欄集合可用來檢查每次呼叫的各種統計資料,包括快取遺漏次數、依指令類型的細分等。可以使用 Event List Counters 面板自訂要顯示的欄集合。





Memory Regions
Memory Regions 版面配置提供一組位址範圍之記憶體存取模式的詳細資料。這些詳細資料包括每個快取行中被存取的個別位元組集合,以及與每次記憶體存取相關聯的函式與資料類型集合。當 Memory Regions 版面配置顯示的資料範圍限定於特定函式時最為實用。常見的工作流程是使用 Summary 版面配置或 Callgraph 版面配置識別造成資料快取遺漏的函式,然後使用 Callgraph 版面配置中的操作功能表瀏覽至 Memory Regions 版面配置。在下圖中,根據 Callgraph 版面配置中顯示的高快取遺漏次數,名為 UpdateCommonObjects 的函式已被識別為值得關注的函式。使用 Scope Memory Analysis to only this node 操作功能表項目瀏覽至 Memory Regions 版面配置。



Memory Region Details
Memory Region Details 版面配置透過提供 Source Memory Access 檢視,提供更進一步的快取行分析。此檢視提供與組譯指令及資料類型資訊交錯顯示的 C++ 原始程式碼,確切顯示函式中有哪些行影響該記憶體區域。以綠色反白顯示的原始程式碼行與組譯行正在存取記憶體區域中的資料。在 Accessing Functions 檢視中選取不同的函式,會以所選函式的特定資訊更新 Byte Access Map 與 Source Memory Access 檢視。
最佳做法與限制
指令追蹤會顯示 L1 與 L2 資料快取遺漏。當擷取是針對 XBOX Series X 開發套件或 XBOX Series S 測試套件進行時,也會提供 L3 遺漏。這些計數會出現在整個擷取的各種版面配置中。快取遺漏次數是根據快取模擬,而不是根據實際的硬體計數器或事件。之所以使用模擬,是因為指令追蹤會對每個執行的指令產生額外處理,這會扭曲任何實際的硬體計數器。不過,在分析快取模擬所產生的資料時,有一些因素需要考量。- 快取被假設為冷快取,因此初始遺漏可能不準確。
- 未模擬載入快取行的延遲。
- 未模擬回寫 (預設的快取記憶體) 以外的記憶體類型。
- 未模擬硬體預先擷取器。
- 由於未完整模擬非循序執行,因此未模擬任何推測性記憶體存取。
