[architecture]-处理器的顺序和乱序执行
(說明:本文 不是博主原創文章,原文鏈接:https://aijishu.com/a/1060000000216149)
現在的處理器執行方式分為兩種,順序執行和亂序執行。根據不同的產品定位,不同的應用場景,所使用的微架構也是不相同的。
1、順序執行解析
順序執行的處理器一般用于低功耗類型的處理器,比如ARM公司的cortex-M系列都是順序執行的,如果要稍微性能和功耗兼顧的產品,也是使用的順序執行的方式。
何為順序執行,顧名思義,亦就是按照PC的取指順序,一條一條的執行。遇到數據相關性就停下等待,當然,可以進行 數據旁路的就進行數據旁路加快一下效率。
相比較之下,順序執行所需要的硬件開銷是比較小的。這是因為順序執行不需要考慮WAW沖突和WAR沖突。即寄存器重命名部件可考慮不使用,僅僅只需要考慮RAW沖突,而RAW沖突是無可避免的,只能通過數據旁路去優化,減少沖突所帶來的氣泡。
因為相關性的問題,順序執行一般最多使用雙發射結構,再多就浪費了,硬件開銷所收獲的性能就不成正比。同時,順序執行不需要額外的監管部件,大家都排好隊去執行的,最后按照順序提交即可。
在此解析一下cortex A53的流水線。ARM公司的cortex A53個人感覺是順序流水線的巔峰之作了。
Cortex A53是一個順序雙發射8級流水處理器。上圖看到最多是十級,那是因為支持NEON浮點運算單元,浮點運算單元時間會比較久。嚴格在算處理器流水線時,以標量運算為基準。A53在取指時花費三個時鐘周期,因為在這一階段,要做的事情還是比較多的,需要進行分支預測,而且由于是雙發的結構,為了提高效率,每次取回一個package的指令是4條,所以取完指令后,會將指令存入 Instruction Queue(指令隊列)中,避免后面執行指令沒那么快,導致指令丟失。
指令譯碼會有兩個譯碼單元同時進行譯碼,提高譯碼效率。譯碼完成后送入發射隊列中,在發射隊列里,會判斷指令功能,將指令分發到不同的執行單元中。例如,此時準備好的是一條浮點指令,便將浮點指令送入F0模塊中進行運算。是一條標量指令,則把該指令送入ALU運算單元中進行運算。
Cortex A53的coremark性能測試跑分大概在3.1分左右,不算高,但是它將性能和面積之間平衡做得是非常好的。在RISC-V指令集陣營中,不少公司都有產品對標A53處理器,性能是能達到,但是面積或多或少都會比之差一點。當然,ARM公司經過這么多年的經營,其生態是目前的RISC-V無法媲美的,RISC-V在嵌入式領域與ARM競爭目前是不占優勢的。
2、亂序執行解析
前文有說過,順序執行會受到RAW沖突,會造成一定的資源浪費,白白等待很長的時間。為了避免等待,那沒有數據相關性的指令是否就能提前去執行呢?那肯定是可以的,所以這就叫亂序執行了。亂序執行的處理器,只是在執行階段是亂的,在執行階段以前都是順序的,按順序去取指令,按順序去譯碼。到了分發段,準備好的指令,沒有相關性的指令就可以先行發射,去執行。但是要注意的是,亂序只是執行的時候是亂序,但是在最后提交指令的時候還是按照順序去提交。
就比如一個公司,有很多訂單,一個員工需要上一個員工的給他交接任務才能做,那么在等待的時候,這個員工先做其他的任務,等上一個員工的任務交接給他,他又繼續做該任務。最后公司提交這些訂單是按照時間順序提交給客戶的,畢竟先來后到。
因此,亂序執行需要一個監管部件,我們稱之為 ROB(Re-order Buffer),重排序緩存。
所有的指令都會存在這個單元中,進行備份,并且相應的狀態也一并保存。當指令執行完成時,ROB中該指令的狀態會被更新,就會將該指令去提交,并移出ROB中。可以把ROB模塊理解為一個FIFO,指令在分發段會按照順序把指令送入保留站,以及ROB模塊中,最后會根據指針去進行提交,后面的指令哪怕是執行完成,可以提交了,但是還未到它位置,就不會去提交它。
亂序所需要的硬件開銷不止增加ROB模塊一個而已,因為亂序執行打破了原有的規則,所以接踵而來的是會有WAW沖突和WAR沖突,這兩類沖突需要額外花費相應的硬件去解決掉。比如解決掉WAR沖突就需要使用寄存器重命名的方式去解決。寄存器重命名操作的本質是擴大可用寄存器,在上一篇文章有講,指令集定義的寄存器組是固定個數的,大家都會去使用,那么將這些寄存器的數量擴大后,可用的寄存器就多了。
比如在一個公司里,大家都需要把資料給到一位老總或者從這位老總手里拿資料,這位老總現在被一幫美女員工所占用,導致其他長得丑的員工沒機會去給資料或者拿資料。當然,老板愛美女,更愛江山,為了提高效率,早日開上寶馬,就請了一位秘書,說大家把資料給他也行,后面秘書把資料再轉交給老板就行。
以上是寄存器重命名操作的舉例。讀后寫(WAR)沖突,情況就是前一條指令需要讀一個寄存器,后面一條指令需要對該寄存器寫數據進去。如果后一條指令先執行完成,把數據寫到該寄存器了,那么前一條指令就極有可能讀到一個錯誤的數據。那先將后一條指令寫到另外一個寄存器,也就是上述說的招的秘書,等指令都執行完,再找機會把該寄存器的數據寫回到目標寄存器中。
而寫后寫(WAW)沖突有很多解決辦法。前一條指令會對某一個寄存器寫數據,后一條指令也是對該寄存器寫操作,那么最新的數據就是后一條指令所寫的數據,前一條指令的數據我們也就不怎么關心了。所以直接限制前一條指令不寫該寄存器了,直接把數據丟掉,讓后一條指令寫入。但是這樣的操作只適用于兩條連續的指令,若中間存在RAW沖突,就不太適用了。所以使用寄存器重命名的方式也可以解決此類沖突。
既然使用亂序執行方式了,那么處理器的執行效率也就提上來了,若此時運算單元跟不上,造成結構沖突,那就是一件很丟臉的事情。所以亂序執行的硬件開銷更多的都來源于此。浮點運算單元、ALU、訪存單元都有多個。并且發射通道也有很多,例如中科院剛剛發布的香山處理器,就是一個6發射的亂序處理器。伯克利大學RISC-V開源處理器Boom最大支持5發射。
3、總結
順序執行方式和亂序執行方式所應用的場景不同,所使用的架構也會不同。對于嵌入式應用產品(手機除外),一般使用順序執行的架構即可滿足。若面向于一些需要高性能的場景,如手機、電腦、服務器等,一般會采用亂序執行。但是手機這類產品不會單純的用亂序執行的大核,一般會大小核一起用,即亂序和順序的處理器都會使用。
順序執行方式的優勢在于硬件開銷小,功耗比較低,用于做控制,完成一些簡單運算綽綽有余。亂序執行方式的優勢在于運算快,對于跑稍微大一點的操作系統或者稍微大一點的運算優勢更大一點。在產品上這兩者之間如何結合,就需要經驗豐富的架構師和產品經理去衡量了。
總結
以上是生活随笔為你收集整理的[architecture]-处理器的顺序和乱序执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [FF-A]-02-Concepts
- 下一篇: [architecture]-DMB、D