以動態調度、多發射和推測來開發指令級並行

近期因相關課程須要完成一個關於指令級並行(ILP)的彙報,個人主題爲「以動態調度、多發射和推測來開發ILP」,是教材《計算機體系結構——量化研究方法》的第三章第九節內容,這裏記錄下來,用於之後回顧。
筆記分爲如下幾個部分:算法

  • 複習
    • 流水線
    • 流水線冒險
  • 動態調度
  • 推測
  • 多發射
  • 將它們結合起來

複習

首先來介紹一下什麼是流水線以及使用流水線所產生的一些問題設計

流水線

流水線是一種用來將多個指令重疊執行的技術。

上圖是一個簡單的例子,不使用流水線技術時,處理器每800ps完成一條指令,爲了提升執行指令的吞吐量,將指令的執行劃分爲五個階段(取指、譯碼、執行、訪存、寫回)並添加相應的運算單元后,處理器就能夠重疊執行指令了,如上圖中的第二張圖所示,修改後的流水線每200ps就能夠執行完一條指令,提升了吞吐量,能夠看到流水線只是提升了處理器執行指令的吞吐量,並無減少天天指令的執行週期,第二張圖中執行每條指令仍是須要800ps。
這裏插入簡單介紹一些經典五級流水線每一個階段:blog

  • 取指(IF),從指令存儲器中讀取指令
  • 譯碼(ID),對指令進行解析,同時讀取寄存器
  • 執行(EX),執行操做或者計算地址(對於載入/存儲指令)
  • 訪存(MEM),從數據寄存器中讀取操做數(對於載入/存儲指令)
  • 寫回(WB),將結果寫回寄存器

流水線冒險

可是指令之間會存在一些數據相關等問題,因此流水線技術也會有一些侷限性,接下來介紹三種常見的流水線冒險排序

  • 結構冒險,即硬件不支持多條指令在同一個時鐘週期中執行。
  • 數據冒險,發生在因爲一條指令必須等待另外一條指令的完成而形成的流水線停頓的狀況下。具體有兩個緣由:
    • 數據依賴,也叫作真數據相關。就是兩條指令間存在一個寫後讀(RAW)問題,也就是第一條指令要寫的數據,恰好要被第二條指令使用,而又由於第一條指令須要在流水線的第5個階段(寫回)纔會真正將數據寫入寄存器中,而第二條指令在流水線第3個階段(執行)就須要這個數據了,因此產生了這種真數據相關,能夠經過旁路(bypassing)技術和停頓(也稱爲氣泡)方法來解決。
    • 名稱依賴,也就是兩條指令對同一個寄存器進行讀後寫(WAR)或者寫後寫(WAW),和上面的寫後讀不同,讀後寫和寫後寫不會產生數據流動,也就是兩條指令之間其實不是真正的數據相關,只是由於要操做同一個寄存器而產生的依賴關係,能夠經過寄存器重命名(register renaming)方法來解決。


上圖是一個經過旁路技術來解決寫後讀問題的例子,第一條指令修改了寄存器s0的數據,第二條指令須要讀取s0的數據,旁路技術經過在獲得s0數據的那個週期,直接將數據經過一個旁路送到須要這個數據的地方,能夠看那條藍色的線路,正常狀況下第一條指令須要在WB階段才能修改s0的值,但經過旁路,能夠在EX階段得到數據後直接送到第二條指令的譯碼(ID)階段,避免產生停頓。接口


上圖是另一個例子,因爲這個例子中第一條指令是一個載入指令,必需要等到MEM階段才能獲得數據,可是第二條指令在EX階段就要使用數據了,咱們沒法將將來的數據送給如今,因此這種狀況下沒法使用旁路技術,因此能夠看見兩條指令間有一個停頓,即藍色的氣泡(bubble)。開發

  • 控制冒險,由於決策依賴於一條指令的結果,而這條指令正在執行中而發生。簡單來講就是由於條件判斷語句,在分支被解析前不能得知指令是否須要執行,會影響流水線的吞吐量。解決方法有停頓、分支預測(branch prediction)和延遲分支(delayed branch)。


上圖是使用分支預測來解決分支冒險的例子,第二條指令須要一個判斷,而判斷的結果不能很快獲得,爲了避免產生停頓,因此處理器預測這條指令不會跳轉,因此處理器繼續執行第三條指令而不是停頓等待結果,分支預測簡單的說就是爲了避免停頓,因此就預測一個結果,讓處理器先去執行那條預測的指令,分支預測技術還有其餘的細節,若是感興趣能夠去閱讀教材,這裏不是重點。io


上圖中分支預測失敗,因此對中止執行以前預測獲得的指令,即簡單的插入氣泡,而後去執行正確的指令。基礎

關於延遲分支技術,簡單來講就是在分支解析的時候,去執行一條與分支無關的指令來避免流水線停頓。擴展

動態調度

這裏不會過多介紹動態調度,個人重點在推測和多發射,這裏主要列舉動態調度的特色:軟件

  • 亂序執行
  • 亂序完成
  • 非精確異常,一種由於亂序完成而致使的問題,即在發生異常時,有一些本不該該被執行的指令已經被執行了,或一些本應該被執行的指令卻還未被執行。
  • Tomasulo算法,一種動態調度使用的算法

動態調度的執行指令過程分爲發射、執行、寫結果三個部分。

推測

推測技術主要是爲了克服控制相關的限制,去開發更多的ILP。

思想:

  • 同動態分支預測選擇要執行哪些指令
  • 利用推測,能夠在解決控制相關問題以前執行指令(可以撤銷錯誤推測序列的影響)
  • 進行動態調度,以應對基本模塊不一樣組合方式的調度

特色:

  • 亂序執行
  • 額外的指令提交
  • 重排序緩衝區
  • 順序提交

咱們來看一下基於硬件推測的基本結構圖:

其中紅色框是在動態調度結構的基礎上進行改變的部分,黃色框是動態調度結構的重點部分,接下來進行解釋。

重排序緩衝區(reorder buffer,簡稱ROB):這是推測新加入的一個硬件,由於有了ROB,在推測的指令執行過程當中的寫結果後又多加了一個指令提交,因此推測下的指令執行有四部分,分別是發射、執行、寫結果和提交。ROB中擴展了寄存器集,會在必定時間內保存指令的結果,這段時間從完成該指令的相關運算算起,到該指令提交完畢爲止,寄存器和存儲器只有在指令提交以後纔會被更新(即咱們很是肯定該指令會被執行),所以ROB是在指令執行完畢到指令提交這段時間內提供操做數。ROB相似於Tomasulo算法中的存儲器緩衝區,因此將載入緩衝區(load buffers,第二個紅色框)旁邊的存儲器緩衝區集成到ROB中了。

保留站(reservation stations,簡稱RS):保留站提供了寄存器重命名功能,解決了WAR和WAW問題,它爲等待發射的指令緩衝操做數,基本思想是:保留站在一個操做數可用時立刻提取並緩衝它,這樣就再也不須要從寄存器中獲取該操做數。此外,等待執行的指令會指定保留站,爲本身提供輸入。最後,在對寄存器連續進行寫入操做而且重疊執行時,只會實際使用最後一個操做更新寄存器。在發射指令時,會將待用操做數的寄存器說明符改名,改成保留站的名字,這就實現了寄存器重命名功能。

公共數據總線(common data bus,簡稱CDB):CDB將操做數從保留站中傳遞給全部須要它的功能單元,而不須要通過寄存器,加快了指令的執行。


上圖是一些指令在執行過程當中的某一個時刻的狀況,其中最上面的兩條指令是在動態調度狀況下的執行狀況,它們分別指向在推測狀況下的執行狀況,能夠看出,在動態調度下,由於亂序執行,這兩個指令已經執行結束並寫入寄存器了。而在推測下一樣的指令已經完成了執行,但因爲這兩條指令以前的MUL.D指令還未完成指令提交,因此這兩條指令也不容許完成指令提交。
這一區別意味着具備ROB的處理器能夠在維持精確異常的同時動態執行代碼。

多發射

多發射處理器的目標就是容許在一個時鐘週期中發射多條指令,分爲如下三類:

  • 靜態調度超標量處理器
  • 動態調度超標量處理器
  • VLIW(超長指令字)處理器

它們的區別在於,靜態調度採用循序(也就是順序)執行,動態調度採用亂序執行,它們在每一個週期發射的指令數是可變的,而VLIW處理器每一個時鐘週期發射固定數目的指令。


上圖是一個簡單的循環例子,在不使用任何技術的狀況下,執行一次循環並獲得一個結果須要9個週期。


上圖代碼使用了循環展開和靜態調度技術,獲得一個結果須要3.5個週期。


上圖代碼使用了循環展開、靜態調度和VLIW技術,獲得一個結果須要1.29個週期。


上圖對幾種不一樣處理器所使用的技術和各自的應用進行了總結。

將它們結合起來

最後咱們將動態調度、推測和多發射技術結合起來,基本結構以下:

能夠看到這個結構在推測的結構的基礎上增添了浮點乘法單元和整數單元,支持了具備分離整數、載入/存儲和浮點單元的多發射超標量流水線。

這篇文章大體介紹了以動態調度、推測和多發射技術來開發ILP的基本概念,須要讀者瞭解基本的五級流水線和動態調度技術,更多的細節能夠參考我在文章開頭說到的教材。

參考:

  • 《計算機體系結構——量化研究方法》
  • 《計算機組成與設計——硬件/軟件接口》
相關文章
相關標籤/搜索