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