指令層級平行與亂序執行

超長指令字(VLIW)

/ V-L-I-W, "vee-liw" /

超純量核心在執行時、用硬體即時判斷哪些指令能一起走——像領班臨場決定把哪些訂單派給哪位廚師。VLIW(超長指令字)走相反路線:讓編譯器在程式還沒跑之前就先決定好,並把決定烤進指令本身。那個「超長」的字組就是一道胖指令,本身就已指名了好幾個要平行執行的運算。

具體來說,VLIW 機器有好幾個執行槽——比方說兩個整數單元、一個記憶體單元、一個分支單元。編譯器分析程式,找出獨立運算,把它們塞進一道長指令字,每個槽放一個運算;找不到足夠平行工作時,就用無運算(no-op)填補空槽。硬體接著只要把每個槽同步發射出去即可,完全不需要相依檢查邏輯。這把困難的排程工作從昂貴的執行時硬體,移到免費的編譯時軟體——其吸引力在於一台更簡單、更低功耗、潛在更寬的機器。

誠實的關鍵在於:為何 VLIW 在通用 CPU 上始終沒能取代超純量。編譯器得猜它事先無法完全知道的事——尤其是記憶體延遲(一次載入可能命中也可能未命中快取)以及分支往哪走——所以它的靜態排程常常偏保守,而且為某個寬度編譯的程式碼在另一寬度上跑得並不最佳(二進位相容性差)。Intel 的 Itanium(EPIC,VLIW 的近親)就是著名的前車之鑑。VLIW 反而在資料流規律且可預測的領域大放異彩——數位訊號處理器(DSP)以及部分 GPU 與 AI 加速器——在那裡編譯器確實能看清整張排程表。

一道 VLIW 字組可能編碼為:slot0 = add x3,x1,x2;slot1 = mul x6,x4,x5;slot2 = load x7,[x8];slot3 = nop。三個真實運算這個週期一起發射,因為編譯器已證明它們彼此獨立。

由編譯器(而非硬體)把平行運算打包進一道寬指令。

VLIW 並不只是「用軟體做的超純量、所以更好」。靜態排程無法對快取未命中這類執行時意外做出反應,正因如此通用 CPU 才保留了動態的亂序硬體。

又稱
very long instruction word超長指令字組