# Superscalar and dynamic pipelining ## Multiple Issue Static multiple issue 和Dynamic multiple issue 是現代電腦處理器中用於提高性能的兩種技術。 * Static multiple issue: 在Static multiple issue中,編譯器負責將可以同時執行的指令進行分組。這些指令然後被打包到“發行插槽”中,這些插槽代表處理器可以同時發行的指令數量。編譯器檢測並避免發生危害,即某個指令由於依賴於前一個指令的結果而無法進行。通過仔細的指令調度和分配,編譯器旨在最大程度地利用處理器的資源。 * Dynamic multiple issue: 在Dynamic multiple issue中,處理器本身 Dynamic地檢查指令流,並決定每個周期發布哪些指令。這個決定是基於各種因素,包括資源的可用性、指令之間的依賴關係以及處理器的當前狀態。編譯器可以通過重新排序指令來幫助這個過程,以減少依賴關係並提高並行執行的潛力。在運行時,CPU使用先進的技術來解決危害,例如無序執行、推測和依賴跟蹤。 #### 比較: Static multiple issue主要依賴於編譯器的優化和指令調度,這些工作在編譯階段完成。處理器按照編譯器分組的指令執行。 Dynamic multiple issue將更多的決策權交給處理器本身,使其能夠適應程序執行的 Dynamic性。這可能會導致更有效的資源利用,但需要更複雜的硬體支援來重新排序指令和解決依賴關係。 ## Speculation 推測是一種處理指令的方法,它「猜測」該指令應該做什麼。這樣可以盡快開始操作,然後檢查猜測是否正確: 如果猜測正確,則完成操作。 如果猜測錯誤,則回滾並執行正確的操作。 這種方法在 Static 和 Dynamic多重發行中都很常見。以下是一些例子: 對分支結果進行推測:如果實際執行的路徑與預測的不同,則進行回滾。 對加載進行推測:如果加載的位置在後續有更新,則進行回滾。 編譯器和硬體的推測是針對指令執行的兩種不同方式: * 編譯器推測: * 編譯器可以重新排序指令,例如將加載指令放在分支指令之前。 * 它可以包含「修正」指令,以從不正確的推測中恢復。 * 硬體推測: * 硬體可以提前查找要執行的指令,並將結果緩存直到確定實際需要它們為止。 * 在不正確的推測時,硬體可以清空緩存,以確保不會使用錯誤的結果。 當在一個被推測執行的指令上發生異常時,可能會引發一些問題: * Static 推測: * 在 Static 推測中,可以通過新增指令集架構(ISA)支持來推遲異常的發生。這意味著在執行推測指令時,當檢測到異常情況時,不立即處理異常,而是將其標記為待處理狀態,直到確定這個指令是實際執行的。如果最終確定執行該指令,則會處理異常;如果不執行,則可以丟棄標記的異常。 * Dynamic 推測: * 在 Dynamic 推測中,當異常發生在一個推測執行的指令上時,可以將異常緩存,直到該指令的執行完成。然而,由於 Dynamic推測可能導致指令的執行順序與程序控制流的實際執行順序不一致,因此可能永遠不會執行完該指令,導致異常無法被處理。在這種情況下,需要機制來檢測並適當地處理這些未處理的異常。 Static multiple issue是指編譯器將指令分組成“發行封包”的過程: * 發行封包是一組指令,它們可以在同一個時脈周期內發布。 * 發行封包的組成取決於所需的流水線資源。 * 可以將發行封包想象為一個非常長的指令: * 它指定了多個並行操作。 * 因此,這種概念類似於非常長指令字(VLIW)架構。 ## Scheduling Static Multiple Issue 在進行靜態多重發行的調度時,編譯器必須處理以下問題: * 消除危害(Hazards):編譯器必須移除或解決指令之間的相依關係,以確保在發行封包中不存在相依關係。這可以透過重新排序指令來實現,將相依關係低的指令放在同一個發行封包中或者不同的發行封包中。 * 發布封包內部無相依性:在每個發布封包內部,指令之間不應該存在相依關係。這意味著在同一個發布封包中的指令應該是獨立的,可以並行執行。 * 可能的跨封包相依性:雖然在發布封包內部沒有相依關係,但可能會存在跨封包的相依關係。在某些指令集架構中,跨封包的相依關係是允許的,但在其他架構中可能是不允許的。編譯器必須了解目標指令集架構的規範,以確保正確處理跨封包相依性。 * 必要時填充 nop 指令:為了保持發布封包的結構完整性,有時候可能需要在指令之間插入 nop(No Operation)指令。這些 nop 指令可以填充空間或等待其他指令的完成。