指令層級平行與亂序執行

指令層級平行(instruction-level parallelism, ILP)

想像一張寫滿小雜事的待辦清單。有些雜事彼此相依——你得先煮好咖啡才能喝——但很多並不相依:澆花和收信毫無關係,所以多一雙手就能同時做。指令層級平行(ILP)正是把這個想法套用到一支程式內部的指令上:在單一 CPU 正在執行的指令流中,因為彼此不依賴對方的結果,原則上有多少道指令能在同一瞬間一起執行?

具體來說,假設程式包含:(1) a = b + c、(2) d = e + f、(3) g = a + d。指令 (1) 與 (2) 互不相依——誰都不需要對方的輸出——所以一台有兩個加法器的機器可以在同一週期內把兩者都做了。指令 (3) 必須等兩者,因為它要讀 a 與 d。這裡的 ILP 雖小但真實:三個運算中有兩個能重疊。ILP 是超純量發射、管線化與亂序執行都想收割的原料。充滿獨立工作的程式 ILP 高;環環相扣、每一步都餵給下一步的計算則幾乎沒有。

誠實的重點是:ILP 是程式的性質,而不只是硬體的性質。硬體(亂序引擎、多個執行單元)與編譯器(排程、迴圈展開)能揭露並利用 ILP,卻無法憑空造出演算法本身沒有的平行性。一條長依賴鏈會把你可能達到的最快速度封頂,無論機器多寬都一樣。這個天花板——ILP 的極限——正是業界最終轉向多核心、而非不斷加寬單核心的深層原因之一。

在簡單迴圈裡用 total += a[i] 對陣列求和的 ILP 很低——每次加法都依賴前一個 total。把它拆成四個部分和(s0,s1,s2,s3)、最後再合併,就揭露了 ILP:四條鏈彼此獨立,可以重疊執行。

互相獨立的指令可以重疊;一串相依的指令無法重疊,硬體再寬也沒用。

ILP 不是你能調的旋鈕;它是程式碼本身已具備多少獨立工作。宣稱「更寬」的核心會讓一切變快是誤導——有長依賴鏈的程式碼會完全用不到那些多出來的寬度。

又稱
ILP