圖形處理器(GPU)
想像你要批改一份極難的考卷,相對於批改一萬份簡單的考卷。對那一份難卷,你想要一位能快速追完冗長曲折推理的傑出教授——那是 CPU。對那一萬份簡單卷,你想要一座坐滿助手的體育場,每人平行批改幾份;沒有一個是天才,但合起來一眨眼就完成——那是 GPU。圖形處理器(GPU)是一塊有數百到數千個簡單核心的晶片,造來一次做大量直截了當的工作,而非快速做少量困難的工作。
GPU 生來是為了畫圖,而那種工作量正是資料層級平行的完美寫照:一個螢幕有數百萬個像素,你對每個像素做大致相同的著色運算,彼此獨立。於是硬體被塑造成相符的形狀——許多小型算術單元,分組到讓一條指令驅動一整束單元去處理不同的資料(SIMT 模型),並以極高的記憶體頻寬撐著,好餵飽所有那些單元。大約 2007 年,人們意識到這同一台機器能加速任何大規模平行的運算,不只是像素——物理模擬、科學計算,尤其是深度學習核心的矩陣乘法。這種改作他用稱為 GPGPU,即 GPU 上的通用運算。
關鍵且誠實的定位:GPU 不只是更快的 CPU,把它當成那樣會帶來壓垮性的失望。GPU 在規律、平行、算術繁重、有數千個獨立元素的工作上大勝;它對序列、多分支、對延遲敏感的程式很差——一條相依的決策鏈在 GPU 上跑得慢,因為它的強項是寬度,不是任何單一執行緒的速度。CPU 是延遲最佳化的(盡快完成一件工作);GPU 是吞吐量最佳化的(每秒完成最多總工作)。它們是夥伴而非對手:CPU 跑程式的邏輯,把龐大的平行數字運算交給 GPU,而一項真實的成本就是把資料在兩者之間的連線上來回搬動。
把兩個 4096x4096 的矩陣相乘約有 1370 億次乘加,全部獨立。有少數核心的 CPU 慢慢輾過去;有數千核心的 GPU 把它們攤到所有車道上,完成得快得多——但前提是矩陣先被複製進 GPU 記憶體,而那次複製本身就是一項值得衡量的成本。
GPU 用單執行緒速度換取純粹的寬度:數千個簡單核心擅長規律的平行工作,卻在序列、多分支的程式上跌跤。
最大的誤解是把 GPU 當成單純更快的 CPU。它不是——它是一台吞吐量引擎。序列、多分支或對延遲敏感的程式在 GPU 上可能比在 CPU 上更慢,而把資料搬進搬出裝置在小問題上可能完全抵銷加速。