資料層級平行:SIMD、向量與 GPU

吞吐量處理器(throughput processor)

兩家餐廳。一家是高級餐館,只有一位技藝高超的主廚,盡人類所能最快地把每道菜擺盤——你這位獨自用餐的客人以破紀錄的速度拿到餐點。另一家是自助餐線,二十位廚師各做一個簡單步驟;任何一個托盤要花點時間走完整條線,但廚房一小時供應一千個托盤。那位高手是延遲最佳化的處理器(CPU);那條自助餐線是吞吐量處理器。吞吐量處理器造來在許多工作上把每秒完成的總工作量最大化,即使犧牲任何單一工作完成的速度。

這兩種設計下相反的硬體賭注。延遲最佳化的 CPU 把它的電晶體花在讓單一執行緒變快:大快取以免等記憶體、深度亂序執行、分支預測、高時脈——全為了縮短一條指令流的路徑。吞吐量處理器(標準範例是 GPU)則把電晶體花在許多簡單核心與許多在飛行中的執行緒上。它不用大快取對抗記憶體延遲;它靠「總有另一個就緒的執行緒可在某個執行緒等待時跑」來隱藏延遲——於是會讓 CPU 閒置的記憶體停頓,對吞吐量機器而言只是換去做別的工作。寬度與佔用率,而非單執行緒速度,是它的貨幣。

這個誠實的定位很要緊,因為兩者不是排名高下,而是各有專長。吞吐量處理器在你有數千個獨立工作(像素、陣列元素、矩陣項目)時很棒,在你只有一條長的相依鏈時很糟——沒有第二個執行緒可躲,而且每一步都個別地慢。這跟「GPU 不只是更快的 CPU」是同一個真理,只是用架構的語言講。真實系統是異質的:延遲最佳化的 CPU 跑序列、多分支的控制邏輯,把規律、平行的大宗交給吞吐量處理器。為一個工作量選錯了——把序列程式塞 GPU,或把大規模平行的數字運算困在 CPU——會浪費掉大部分硬體。

同樣的晶片預算,兩種哲學:CPU 可能花在 8 個強大核心、配巨大快取與深度亂序機制(對一個快執行緒很棒);GPU 花在數千個纖細核心、配少量快取但容得下數萬個執行緒(對總工作量很棒)。在序列工作上 CPU 贏;在百萬元素的平行工作上 GPU 大幅領先。

吞吐量處理器用許多執行緒隱藏延遲,而非用大快取對抗它;它的目標是每秒總工作量,不是單一工作的速度。

吞吐量最佳化不是「優於」延遲最佳化——它是專門化。把一個序列、相依的工作放到吞吐量處理器上,它會爬行,因為「用其他執行緒隱藏延遲」的把戲沒有其他執行緒可用。

又稱
throughput-oriented processorthroughput-optimized core吞吐量導向處理器