CPU指令执行及流水线(超标量、多发射、乱序执行)
用生活例子引入流水線邏輯:**
為什么要引入流水線(流水線誕生之前):
首先計算機是通過CPU執行指令來實現運行并計算的,計算機在設計之初,每條指令只能串行執行,意思就是等第一條指令執行完,第二條指令才能開始執行,這樣顯然效率太低。
流水線設計原理:
然而指令執行過程有很多階段,比如經典的五級流水線結構,把指令執行的階段分成五級,分別為取指、譯碼、執行、訪存、寫回,就像手機組裝生成線上的把組裝、檢測、包裝一樣,不同階段是不一樣的工人在干活,同樣五級流水線中的每一級用的也是不一樣的CPU部件。在手機組裝過程中,第一個人組裝完第一臺手機就把第一臺交給測試工人,組裝工人繼續組裝第二臺手機。測試工人也一樣測試完第一臺就交給下個包裝工人,自己繼續測試第二臺。所以有人想辦法借鑒組裝手機這種思想去構造流水線,第一條指令取指完,就把這條指令交給譯碼部件,自己繼續取指第二條,這樣的話從第5個時間段開始,每個部件都在自己忙活,不存在之前的串行問題,5個時間內,每個部件只上一個時間的班,其余時間都歇著。這就是流水線技術。
多發射:
但是隨著集成電路發展,很多人不滿足這樣的效率,萌生出一次我直接執行兩條毫無關系的指令。也就是一次發射兩條指令。多發射就是這個意思。顯然生活中肯定一心不能二用,但是現在可以增加部件,也就是組裝線上坐多個人也就是多條流水線,實現了多發射。
亂序執行:
由于在指令在一定邏輯上只能按照順序執行,比如疫情期間在家辦公,計劃的順序是起床、等快遞來送菜、做早飯、吃早飯、回復郵件、開始工作。但是快遞小哥遲遲不來,咱們是不是得一直等著他來送菜再進行下面的事情?顯然不會,你一定會把等菜、做飯、吃飯等一系列步驟放著,先去執行另一系列的步驟(發郵件、工作),因為這兩個系列的步驟是完全不相關的。放在CPU中的邏輯時,某條指令需要訪存,訪存的時候多級cache不命中、內存缺頁等原因導致訪存時間延長,這個時候是不是也像快遞小哥遲遲不來一樣,這個時候咱們就要先放棄這一系列的事情,先去執行后面的與之無關指令。等訪存結束再去回去執行之前被耽擱的指令,這就是亂序執行(因為指令的順序被打亂了)。這樣的代價在哪里?,為什么叫亂序執行,不叫亂序提交,那就是因為提交順序(最后結果)必須正確,比如一個寄存器按照原本的順序是 被改成3、3被訪問、被改成5、5被訪問,顯然前兩個跟后兩個沒有關系,如果出現了亂序執行,先執行了后兩個,那么寄存器最后結果就是3了,后續跟這個寄存器打交道的指令都會出錯(原本希望最后是5),所以提交順序一定要正確,所以設計了保留站和ROB(重排序緩沖),那就是標記指令本來的執行順序,在寫回(最后一級流水線)的時候、如果比自己標記好小的指令不提交,自己就在ROB中呆著等待原本在自己前面的指令提交。這樣就保證了既節省時間又能正確提交。
超標量:
上面是說的都是一個核同時只能執行一條指令,超標量就是一個核同時可以指令兩條指令。
總結
以上是生活随笔為你收集整理的CPU指令执行及流水线(超标量、多发射、乱序执行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTFd平台搭建
- 下一篇: 实时音频编解码之二编码学数学知识