程式設計師的 CPU 微架構

超純量執行(superscalar execution)

管線化讓中央處理器靠重疊各階段而大約每週期完成一條指令。超純量中央處理器更進一步:它擁有重複的硬體,因此能在「同一個」週期內抓取、解碼並完成「不只一條」指令。如果說管線是一條生產線,那麼超純量處理器就是好幾條並排運轉的生產線,共用一個前端來餵它們。

具體而言,一個超純量核心以它的寬度來描述——它每週期能發射幾條指令。一個 4 寬的核心,最佳情況下每個時脈能完成四條指令;現代高效能核心常為 4 到 8 寬。為此晶片擁有多份執行資源(好幾個算術單元、不只一個載入/儲存單元等等),每個週期它試著找出好幾條可以一起啟動的獨立指令。理論峰值是每週期「寬度」條指令,以 IPC(每週期指令數)表示;真實程式很少達到峰值,因為它無法總是供應足夠多的獨立工作。

對程式設計師而言的深層重點是:這個寬度是硬體開發指令層級平行(instruction-level parallelism)的能力,而除非你的程式裡確實含有可平行執行的獨立指令,否則它就被浪費了。一條長長的運算鏈、其中每一步都相依於前一步(相依鏈),無論機器多寬都填不滿它——它受限於延遲、而非寬度。這正是為何兩段指令數相同的程式,速度可能相差好幾倍:一段暴露出超純量核心能吸收的平行性,另一段則是一條序列鏈,每個週期都讓大多數執行單元閒著。

s1 += a[i]; s2 += a[i+1]; s3 += a[i+2]; s4 += a[i+3]; 用四個獨立的累加器,每週期餵給 4 寬核心四個平行的加法。天真的單累加器迴圈 s += a[i] 是一條相依鏈,以一次加法的延遲速度運行,讓其他單元閒著。

相同的加法、相同的總數——但打破相依鏈讓寬核心能平行地做它們。

寬度是上限、不是保證:一條完全序列的相依鏈,在 2 寬與 8 寬核心上跑得一樣快。編譯器與程式設計師必須暴露獨立的工作,超純量的寬度才會有意義。

又稱
multiple-issuewide issue超標量多發射