管線化與危障

管線氣泡(pipeline bubble)

再想像那條裝配線,並想像一台什麼都沒載的推車經過——一台空車,每位工人都盡責地對它「處理」一番、其實什麼都沒做,只為了讓生產線步調一致地前進。那台空車就是管線氣泡:管線中一個不載任何真實指令的槽,是當機器必須等待、而時脈不能停下時刻意注入的空隙。

氣泡是停頓在管線內部的實體實現方式。當危障偵測邏輯判定一條指令必須等,它不能單純暫停時脈——後段階段每個週期仍需要一件明確的事可做。於是它凍結管線前端,並在停頓之後的那一階注入一個氣泡:一條控制訊號全設為「什麼都不做」的指令——不寫任何暫存器、不碰任何記憶體、不改任何狀態。隨著時脈跳動,這個氣泡像真指令一樣往後流過剩下的階段,無害地佔用它們的硬體,而它後面真正的指令則被押後了一個週期。

氣泡是每次停頓看得見的足跡,數氣泡正是估算管線損失效能的方法。每個氣泡都是某階段沒做有用工作的一個週期——所以一支程式裡 n 個氣泡就多 n 個週期,把有效的每指令週期數推到理想值之上。氣泡從哪來?載入-使用危障注入一個氣泡;以停頓處理的分支會注入氣泡直到分支解出;誤測的分支則清空錯路指令、換成氣泡。把氣泡最小化——靠前饋、預測與巧妙的指令排程——是管線設計日常工藝的一大部分。

在 lw x1, 0(x2); add x3, x1, x4 之後的一週期停頓,在管線圖上呈現為它們之間的一個氣泡:在那個週期,EX 階段沒處理任何真實的東西。一個迴圈這樣做 1000 次,就是 1000 個額外週期——可直接量測為抬高的 CPI。

氣泡是一個「什麼都不做」的槽,流過各階段,是停頓的實體化身,也是損失週期的直接成本。

氣泡不等於程式設計師寫的 nop。nop 是二進位檔裡的真實指令;氣泡是硬體當場注入、從未存在於程式中的東西。兩者都佔一個什麼都不做的槽,但只有一個是你的責任。

又称
bubbleno-oppipeline nop氣泡空泡