PRT(Pending Request Table)是 GPU 中用于管理 未完成內存請求(outstanding memory requests)的一種硬件結構,旨在高效處理大規模并行線程的內存訪問需求。與傳統的 MSHR(Miss Status Handling Registers)不同,PRT 的設計更適應 GPU 的 warp 級并行性,顯著提升了內存子系統的吞吐量和并發能力。以下從工作原理、優勢、與 MSHR 的對比等方面詳細解析 PRT 技術。
1. PRT 的核心設計思想
PRT 的核心是為 每個 warp 的內存指令(如加載或存儲)分配一個獨立的條目,而非為每個內存請求分配資源。這一設計充分利用了 GPU 的 warp 執行模型(32 個線程以 SIMD 方式并行執行),通過合并一個 warp 內所有線程的內存請求,減少對硬件資源的占用。
- 條目內容:
每個 PRT 條目包含以下信息:- 內存指令的 目標地址塊(如全局內存地址)。
- 線程掩碼(標識哪些線程需要該數據)。
- 地址偏移(記錄每個線程在目標地址塊內的偏移量)。
- 未完成請求計數器(跟蹤該指令關聯的內存請求數量)。
2. PRT 的工作流程
-
內存指令執行:
當 warp 執行一條內存指令(如LDG
加載指令)時,GPU 的 Load/Store 單元會 合并線程的訪問請求。例如,若多個線程訪問同一緩存行,則合并為一個內存請求。 -
PRT 條目分配:
- 若發生緩存未命中(數據不在 L1/L2 緩存中),分配一個 PRT 條目。
- 每個 PRT 條目對應一個 warp 的內存指令,而非單個線程或單個地址請求。
-
生成內存請求:
- 合并后的請求被發送到顯存(DRAM)或 L2 緩存。
- 每個請求包含:
- 目標地址塊(如 128 字節的緩存行地址)。
- PRT 條目標識符(用于后續數據分發)。
- 線程掩碼(標記哪些線程需要該數據)。
-
數據返回與分發:
- 當顯存返回數據時,根據 PRT 條目中的 地址偏移,將數據分發到各線程的寄存器。
- 例如,若線程 0 需要地址塊內偏移 4 字節的數據,則從返回的緩存行中提取對應位置的數據。
-
釋放 PRT 條目:
- 當所有關聯的內存請求完成,且數據分發完畢后,釋放 PRT 條目。
3. PRT 的關鍵優勢
-
高并發處理能力
PRT 的未完成請求數 僅受限于每個 SM 的 PRT 條目數量,而非線程數或未合并訪問數。例如,在 Kepler 架構中,每個 SM 有 44 個 PRT 條目,每個條目可處理一個 warp 的 32 個線程請求,理論最大并發請求數為:
[
44 , \text{條目} \times 32 , \text{線程/warp} = 1408 , \text{未完成請求}
]
相比 Fermi 的 MSHR(128 請求/SM),并發能力提升 11 倍。 -
對未合并訪問的容忍性
MSHR 在未合并訪問(如隨機內存訪問)時,需要為每個未合并請求分配獨立條目,容易導致資源耗盡。而 PRT 的條目與 warp 指令 綁定,無論線程訪問是否合并,每個指令僅占用一個 PRT 條目。這使得 PRT 在 非連續內存訪問場景 下表現更優。 -
簡化硬件資源管理
PRT 通過合并 warp 級請求,減少了對細粒度資源(如每個線程的請求跟蹤)的需求,降低了硬件復雜度。
4. PRT 與 MSHR 的對比
特性 | MSHR | PRT |
---|---|---|
設計目標 | 跟蹤每個緩存行未命中請求 | 跟蹤每個 warp 的內存指令 |
條目分配粒度 | 每個緩存行一個條目 | 每個 warp 內存指令一個條目 |
合并能力 | 有限(如 8 個線程合并) | 天然支持整個 warp(32 線程)合并 |
未完成請求上限 | 受限于條目數(如 Fermi 的 128) | 受限于條目數 × warp 線程數(如 1408) |
適用場景 | 連續內存訪問(高合并率) | 任意內存訪問模式(包括隨機訪問) |
5. PRT 的實際應用與優化啟示
-
對開發者的意義
- Kepler 及后續架構:開發者無需過度優化內存合并,可更靈活設計內存訪問模式。
- 控制 warp 指令并發數:避免單個 SM 內過多 warp 同時發起內存指令,以防 PRT 條目耗盡。
-
對架構設計的啟示
- 擴展 PRT 條目數:增加 PRT 條目可進一步提升并發能力(如 NVIDIA 后續架構的改進)。
- 結合緩存優化:PRT 與 L1/L2 緩存協同工作,需平衡緩存命中率與顯存帶寬利用率。
6. 論文中的實驗驗證
論文通過 Thread-Latency 圖 驗證了 PRT 的優勢:
- Kepler(Tesla K20):當每個線程發起 2-3 次內存請求時,PRT 條目飽和點對應于 44 個 warp 指令(圖 9-10),而非線程數或請求數,表明其設計基于 warp 級管理。
- 對比 Fermi:Fermi 的 MSHR 在未合并訪問時快速飽和(圖 3-4),而 Kepler 的 PRT 在相同場景下表現更優。
參考資料
- https://slideplayer.com/slide/8276701/
- https://www.ahmado.com/profile/lashgar/files/16acmcan.pdf