管線化與危障
結構危障(structural hazard)
回到自助洗衣店:假設你只有一台烘乾機。多數時候沒問題,但總會有一分鐘,第一籃想繼續烘,「同時」第二籃也洗好了、也要用烘乾機。它們不能都用。一籃必須等。結構危障正是這樣——位於不同管線階段的兩條指令,在同一週期需要同一塊硬體,而硬體不夠分。
教科書上的案例是記憶體。在五階段管線裡,IF 階段正從記憶體提取一條指令,而往回兩階、處於 MEM 階段的某條載入或儲存,正想讀或寫資料記憶體——兩者同在一個週期。若機器只有單一、共享、單埠的記憶體,這兩次存取就會相撞,一個必須停頓。經典的修法是給處理器分開的指令記憶體與資料記憶體(或分開的快取),讓指令提取與資料存取永不相爭——這正是真實晶片把第一層快取拆成 I-cache 與 D-cache 的原因之一,呼應了哈佛架構。其他結構危障來自無法在一週期內又讀又寫的暫存器檔,或單一共享的功能單元。
結構危障是最容易在設計上消除的一族,因為解法通常只是加硬體:第二個記憶體埠、複製的單元、能每週期做兩讀一寫的暫存器檔。這就是為什麼設計良好的 RISC 管線基本上沒有結構危障——它們多花一點矽,把它們徹底移除。當結構危障確實留存時(常為了省面積或功耗),唯一的辦法就是讓較年輕的指令停頓,直到資源空出來。
若只有單一統一記憶體:在第 4 週期,指令 I4 在 IF(從記憶體提取),而 I1 在 MEM(從同一記憶體讀資料)。一個埠、兩個請求——結構危障。拆成分開的 I-cache 與 D-cache,兩者就能在同一週期進行,危障消失。
單一記憶體埠在提取與資料存取相撞時迫使停頓;分開的指令與資料記憶體則消除這個衝突。
結構危障是組織上的選擇,不是必然。它們反映了為省成本而刻意共享硬體的決定;花下那些矽,它們就消失,這就是為什麼它們是現代設計中最罕見的危障。
又稱
另見