SIMD 與 SIMT 的差異:執行模型、程式撰寫、分支、記憶體存取比較
SIMD 與 SIMT 都是以 1 道指令對大量資料進行相同運算,但從程式看到的樣貌不同。SIMD 是 CPU 的向量指令,由程式設計師或編譯器將資料排列在寬度固定的向量暫存器中,並明確地使用指令。SIMT 是 GPU 的方式,只要以一般方式撰寫 1 個執行緒的處理,硬體就會將 32 個等數量的執行緒集結成 warp,以相同指令執行。每個執行緒也可以撰寫分支,但若 warp 內的分支走向不同,就會依序執行兩條路徑,效率因而下降。
| 項目 | SIMD | SIMT |
|---|---|---|
| 執行模型 | 以 1 道指令同時處理排列在向量暫存器中的多個元素 | 由集結成 warp 的大量執行緒同時執行 1 道指令。每個執行緒擁有自己的暫存器 |
| 從程式看到的樣貌 | 意識著向量寬度撰寫。使用內建函式、組合語言或編譯器的自動向量化 | 將 1 個執行緒的處理寫成純量程式碼。由硬體進行集結 |
| 平行寬度 | 由暫存器寬度決定。例:512 位元可容納 16 個 32 位元的數 | warp 的寬度(32 個執行緒等)。整顆晶片可同時保有數萬個執行緒 |
| 分支的處理 | 無法撰寫各元素的分支。以比較結果的遮罩計算兩邊後再選擇 | 可依執行緒撰寫。若 warp 內分歧,會依序執行兩條路徑,讓不符合的執行緒閒置(分支發散) |
| 有效元素的管理 | 由程式設計師或編譯器以帶遮罩的指令或混合指令明確指定 | 由硬體自動管理有效的執行緒 |
| 記憶體存取 | 擅長一次讀取連續的位址。分散的位址以收集、分散(gather/scatter)指令處理,但速度慢 | 每個執行緒可以自由指定位址。相鄰執行緒讀取相鄰位址時可合併存取(coalescing) |
| 記憶體延遲的隱藏方式 | 大容量快取、亂序執行、預取 | 切換大量 warp,在某些 warp 等待期間執行其他 warp |
| 在弗林分類法中的定位 | SIMD 本身 | 以執行緒形式呈現的一種 SIMD |
| 代表性用途 | CPU 的向量指令。影像與聲音處理、加密、矩陣運算的迴圈等 | GPU 的 warp。圖形、AI 的訓練與推論、科學計算等大規模平行計算 |
數值為具代表性的大致參考值,會因世代或產品而異。