??個(gè)人主頁(yè):highman110
??作者簡(jiǎn)介:一名硬件工程師,持續(xù)學(xué)習(xí),不斷記錄,保持思考,輸出干貨內(nèi)容?
目錄
參考資料
前言
流水線
提高流水線效率的技術(shù)
超級(jí)流水線
超標(biāo)量
分支預(yù)測(cè)
亂序執(zhí)行
參考資料
(21條消息) 流水線、超流水線、超標(biāo)量(superscalar)技術(shù)對(duì)比(轉(zhuǎn))_沉迷科研劉昊然的博客-CSDN博客
圖解|30張圖,帶你深入理解CPU流水線和分支預(yù)測(cè)的那些事兒 - 知乎 (zhihu.com)
計(jì)算機(jī)體系結(jié)構(gòu)基礎(chǔ)(第3版)-胡偉武等-微信讀書 (qq.com)
前言
????????我們從某CPU官網(wǎng)可以看到某芯片的簡(jiǎn)介:
????????上圖中的亂序四發(fā)射超標(biāo)量流水線是什么意思呢?這些都是CPU指令執(zhí)行中的名詞,本文一次性講清楚。
流水線
?????? 流水線這個(gè)詞相信大家都不陌生了,很好理解,把一個(gè)耗時(shí)較長(zhǎng)的操作,分成一段一段的小操作,兩個(gè)不同大操作下的小操作可以并行執(zhí)行,這樣就比一個(gè)完整操作執(zhí)行完再做下一個(gè)操作的耗時(shí)更小,操作效率更高。比如說(shuō),把洗車分成噴水、打泡沫、刷洗、擦拭、吹干幾個(gè)工站,在第一輛車噴完水進(jìn)入打泡沫的工站后,下一輛車就可以進(jìn)來(lái)噴水了,而不用等前一輛全部洗完再進(jìn)來(lái),這樣效率大大提升,賺錢更多了。
????????計(jì)算機(jī)執(zhí)行指令一般包含以下過程:從存儲(chǔ)器取指令并對(duì)取回的指令進(jìn)行譯碼,從存儲(chǔ)器或寄存器讀取指令執(zhí)行需要的操作數(shù),執(zhí)行指令,把執(zhí)行結(jié)果寫回存儲(chǔ)器或寄存器。上述過程稱為一個(gè)指令周期。計(jì)算機(jī)不斷重復(fù)指令周期直到完成程序的執(zhí)行。以上指令執(zhí)行的各個(gè)小步驟就是流水線操作,常規(guī)的5級(jí)流水線如下:
1、取指令I(lǐng)F
????????取指令(Instruction Fetch,IF)階段是將一條指令從主存中取到指令寄存器的過程。
2、指令譯碼ID
????????取出指令后,計(jì)算機(jī)立即進(jìn)入指令譯碼(Instruction Decode,ID)階段。
????????在指令譯碼階段,指令譯碼器按照預(yù)定的指令格式,對(duì)取回的指令進(jìn)行拆分和解釋,識(shí)別區(qū)分出不同的指令類別以及各種獲取操作數(shù)的方法。
3、指令執(zhí)行EX
????????在取指令和指令譯碼階段之后,接著進(jìn)入執(zhí)行指令(Execute,EX)階段。
????????此階段的任務(wù)是完成指令所規(guī)定的各種操作,具體實(shí)現(xiàn)指令的功能。為此,CPU的不同部分被連接起來(lái),以執(zhí)行所需的操作。
4、訪存取數(shù)階段MEM
????????根據(jù)指令需要,有可能要訪問主存讀取操作數(shù),這樣就進(jìn)入了訪存取數(shù)(Memory,MEM)階段,此階段的任務(wù)是:根據(jù)指令地址碼,得到操作數(shù)在主存中的地址,并從主存中讀取該操作數(shù)用于運(yùn)算。
5、結(jié)果回寫WB
????????作為最后一個(gè)階段,結(jié)果寫回(Writeback,WB)階段把執(zhí)行指令階段的運(yùn)行結(jié)果數(shù)據(jù)寫回到某種存儲(chǔ)形式。
????????為了提升效率,通過流水線操作將順序執(zhí)行的指令操作并行起來(lái)執(zhí)行,如下圖:
????????總結(jié)起來(lái)CPU流水線技術(shù)就是一種將指令分解為多步,并讓不同指令的各步操作重疊,從而實(shí)現(xiàn)幾條指令并行處理,以加速程序運(yùn)行過程的技術(shù)。指令的每步有各自獨(dú)立的電路來(lái)處理,每完成一步,就進(jìn)到下一步,而前一步則處理后續(xù)指令,屬于CPU硬件電路層面的并發(fā)。
????????總結(jié)起來(lái)CPU流水線技術(shù)就是一種將指令分解為多步,并讓不同指令的各步操作重疊,從而實(shí)現(xiàn)幾條指令并行處理,以加速程序運(yùn)行過程的技術(shù)。指令的每步有各自獨(dú)立的電路來(lái)處理,每完成一步,就進(jìn)到下一步,而前一步則處理后續(xù)指令,屬于CPU硬件電路層面的并發(fā)。
提高流水線效率的技術(shù)
????????在標(biāo)準(zhǔn)流水線基礎(chǔ)上,還想再繼續(xù)提高操作效率該怎么辦呢?
????????常見的提高流水線效率的技術(shù)包括超級(jí)流水線、轉(zhuǎn)移預(yù)測(cè)技術(shù)、亂序執(zhí)行技術(shù)、超標(biāo)量(又稱為多發(fā)射)技術(shù)等,技術(shù)很多,這里只是簡(jiǎn)單介紹,后面爭(zhēng)取專門寫幾篇文章。
超級(jí)流水線
????????超級(jí)流水線以增加流水線級(jí)數(shù)的方法來(lái)縮短機(jī)器周期,相同的時(shí)間內(nèi)超級(jí)流水線執(zhí)行了更多的機(jī)器指令。采用簡(jiǎn)單指令以加快執(zhí)行速度是所有流水線的共同特點(diǎn),但超級(jí)流水線配置了多個(gè)功能部件和指令譯碼電路,采用多條流水線并行處理,還有多個(gè)寄存器端口和總線,可以同時(shí)執(zhí)行多個(gè)操作,因此比普通流水線執(zhí)行的更快,在一個(gè)機(jī)器周期內(nèi)可以流出多條指令。
????????一般而言,CPU執(zhí)行一條指令需要經(jīng)過以下階段:取指->譯碼->地址生成->取操作數(shù)->執(zhí)行->寫回,每個(gè)階段都要消耗一個(gè)時(shí)鐘周期,同時(shí)每個(gè)階段的計(jì)算結(jié)果在周期結(jié)束以前都要發(fā)送到階段之間的鎖存器上,以供下一個(gè)階段使用。所以,每個(gè)時(shí)鐘周期所消耗的時(shí)間就是由以上幾個(gè)階段中的耗時(shí)最長(zhǎng)的那個(gè)決定的。假設(shè)耗時(shí)最長(zhǎng)的階段耗時(shí)為s秒,那么時(shí)鐘頻率就只能設(shè)計(jì)到1/s赫茲(這里不考慮階段間信號(hào)傳遞的時(shí)間和鎖存器的反應(yīng)時(shí)間)。
????????那么,要提高時(shí)鐘頻率,一種可能的方法就是減小每個(gè)階段的時(shí)間消耗。其中一種最簡(jiǎn)單的辦法,就是將每個(gè)階段再進(jìn)行細(xì)分成更小的步驟,同樣是細(xì)分后的每個(gè)階段,單個(gè)階段的運(yùn)算量小了,單位耗時(shí)s也就減少,這樣實(shí)際上就是提高了時(shí)鐘頻率。這種將標(biāo)準(zhǔn)流水線細(xì)分的技術(shù),就是超級(jí)流水線技術(shù)。當(dāng)然,流水線和超級(jí)流 水線之間并沒有很明顯的區(qū)別。這樣的技術(shù),雖然提高了CPU的主頻,但是也帶來(lái)了很大的副作用:
????????首先,假設(shè)不使用流水線情況下,某指令的執(zhí)行時(shí)間為s,指令執(zhí)行結(jié)果保存在寄存器中的時(shí)間為d,將其改為N級(jí)流水線,由于細(xì)分后的每一個(gè)階段都要在其后使用寄存器保存結(jié)果,因此將一個(gè)階段細(xì)分為N個(gè)子階段并不能讓單位時(shí)間減少到s/N, 而是s/N + d, 其中d為寄存器的保存結(jié)果時(shí)間。這實(shí)際上就是增加了多余的時(shí)間消耗。
????????其次,隨著流水線級(jí)數(shù)的加深,一旦分支預(yù)測(cè)出現(xiàn)錯(cuò)誤,會(huì)導(dǎo)致CPU中大量的指令作廢,這樣的消耗是十分巨大的。
????????以上原因,也就是什么Pentium IV具有31級(jí)的流水線,指令的執(zhí)行效率卻趕不上只有14級(jí)流水線的Pentium M,高流水線級(jí)數(shù)的處理器是追求更高的主頻,以獲取更高的吞吐率和性能,而低流水線級(jí)數(shù)的處理器的功耗更低,提高能效比。
超標(biāo)量
????????超標(biāo)量技術(shù)。初看的時(shí)候容易把超標(biāo)量和超級(jí)流水線搞混。工藝技術(shù)的發(fā)展使得在20世紀(jì)80年代后期出現(xiàn)了超標(biāo)量處理器。超標(biāo)量結(jié)構(gòu)允許指令流水線的每一階段同時(shí)處理多條指令,換句話說(shuō),可以理解為同時(shí)有多條流水線在處理指令。其實(shí)質(zhì)是以空間換取時(shí)間。而超流水線是通過細(xì)化流水、提高主頻,使得在一個(gè)機(jī)器周期內(nèi)完成一個(gè)甚至多個(gè)操作,其實(shí)質(zhì)是以時(shí)間換取空間。類似上文提到的5級(jí)單流水線被稱為標(biāo)量流水技術(shù),而CPU中有多條并行執(zhí)行的流水線技術(shù)稱為超標(biāo)量流水技術(shù)。舉個(gè)簡(jiǎn)單的例子,一個(gè)洗車店,如果噴水、打泡沫、刷洗、擦拭、吹干這幾個(gè)工站都是只有一個(gè),那就是標(biāo)量流水,如果這些工站都各有一個(gè)以上,那就是超標(biāo)量流水。
????????在單流水線結(jié)構(gòu)中,指令雖然能夠重疊執(zhí)行,但仍然是順序的,每個(gè)周期只能發(fā)射(issue)或退休(retire)一條指令。超級(jí)標(biāo)量結(jié)構(gòu)的cpu支持指令級(jí)并行,每個(gè)周期可以發(fā)射多條指令(2-4條居多,文章開頭列的某CPU簡(jiǎn)介中的4發(fā)射指的就是每個(gè)周期可以發(fā)射4條指令),從而提高cpu處理速度。超級(jí)標(biāo)量機(jī)能同時(shí)對(duì)若干條指令進(jìn)行譯碼,將可以并行執(zhí)行的指令送往不同的執(zhí)行部件,在程序運(yùn)行期間,由硬件(通常是狀態(tài)記錄部件和調(diào)度部件)來(lái)完成指令調(diào)度。超級(jí)標(biāo)量機(jī)主要是借助硬件資源重復(fù)(例如有兩套譯碼器、ALU、訪存部件等)來(lái)實(shí)現(xiàn)空間的并行操作。
分支預(yù)測(cè)
????????轉(zhuǎn)移預(yù)測(cè)技術(shù),又叫分支預(yù)測(cè)。先解釋一下為什么要做分支預(yù)測(cè)。假設(shè)有如下一段程序要執(zhí)行:
????????int a = 某輸入值;
????????int b = 某輸入值;
????????if(a>3)
?????? ????????int c = b + a;
????????else
????????????????int c = b - a;
????????上面涉及到條件判斷帶來(lái)的轉(zhuǎn)移,上面的各條語(yǔ)句雖然名義上是順序執(zhí)行,但是CPU是流水線執(zhí)行指令操作的,一些步驟是并行走,同時(shí)某些步驟之間有先后依賴關(guān)系,加上條件的判斷,就會(huì)發(fā)生指令的轉(zhuǎn)移,一旦發(fā)生指令轉(zhuǎn)移,就要排空后面的流水線,且要從轉(zhuǎn)移的目標(biāo)地址重新取指令,這就是轉(zhuǎn)移開銷。
????????轉(zhuǎn)移指令或分支指令會(huì)打斷流水線中指令的處理,因?yàn)樘幚砥鳠o(wú)法確定該指令的下一條指令,直到分支執(zhí)行完畢。流水線越長(zhǎng),處理器等待的時(shí)間便越長(zhǎng),因?yàn)樗仨毜却种е噶钐幚硗戤?,才能確定下一條進(jìn)入流水線的指令。這顯然也流水線處理的初衷是相悖的,為了解決這一問題,就需要分支預(yù)測(cè)技術(shù)。
????????馮·諾依曼結(jié)構(gòu)指令驅(qū)動(dòng)執(zhí)行的特點(diǎn),使轉(zhuǎn)移指令成為提高流水線效率的瓶頸。典型應(yīng)用程序平均每5~10條指令中就有一條轉(zhuǎn)移指令,而轉(zhuǎn)移指令的后續(xù)指令需要等待轉(zhuǎn)移指令執(zhí)行結(jié)果確定后才能取指,導(dǎo)致轉(zhuǎn)移指令和后續(xù)指令之間不能重疊執(zhí)行,降低了流水線效率。隨著主頻的提高,現(xiàn)代處理器流水線普遍在10~20級(jí)之間,由于轉(zhuǎn)移指令引起的流水線阻塞成為提高指令流水線效率的重要瓶頸。
????????轉(zhuǎn)移預(yù)測(cè)技術(shù)可以消除轉(zhuǎn)移指令引起的指令流水線阻塞。轉(zhuǎn)移預(yù)測(cè)器根據(jù)當(dāng)前轉(zhuǎn)移指令或其他轉(zhuǎn)移指令的歷史行為,在轉(zhuǎn)移指令的取指或譯碼階段預(yù)測(cè)該轉(zhuǎn)移指令的跳轉(zhuǎn)方向和目標(biāo)地址并進(jìn)行后續(xù)指令的取指。轉(zhuǎn)移指令執(zhí)行后,根據(jù)已經(jīng)確定的跳轉(zhuǎn)方向和目標(biāo)地址對(duì)預(yù)測(cè)結(jié)果進(jìn)行修正。如果發(fā)生轉(zhuǎn)移預(yù)測(cè)錯(cuò)誤,還需要取消指令流水線中的后續(xù)指令。為了提高預(yù)測(cè)精度并降低預(yù)測(cè)錯(cuò)誤時(shí)的流水線開銷,現(xiàn)代高性能處理器采用了復(fù)雜的轉(zhuǎn)移預(yù)測(cè)器。
????????例如,可以在取指部件中設(shè)置一位標(biāo)志記錄上一條轉(zhuǎn)移指令的跳轉(zhuǎn)方向,碰到轉(zhuǎn)移指令,不用等該轉(zhuǎn)移指令執(zhí)行結(jié)果,就根據(jù)該標(biāo)志猜測(cè)跳轉(zhuǎn)方向進(jìn)行取指。對(duì)于C語(yǔ)言中的“for(i=0,i<N,i++)”類的循環(huán),這種簡(jiǎn)單的轉(zhuǎn)移猜測(cè)就可以達(dá)到(N-1)/(N+1)的準(zhǔn)確度,當(dāng)N很大時(shí)準(zhǔn)確度很高。
亂序執(zhí)行
????????亂序執(zhí)行技術(shù)。如果指令i是條長(zhǎng)延遲指令,如除法指令或Cache不命中的訪存指令,那么在順序指令流水線中指令i后面的指令需要在流水線中等待很長(zhǎng)時(shí)間。亂序執(zhí)行技術(shù)通過指令動(dòng)態(tài)調(diào)度允許指令i后面的源操作數(shù)準(zhǔn)備好的指令越過指令i執(zhí)行(需要使用指令i的運(yùn)算結(jié)果的指令由于源操作數(shù)沒有準(zhǔn)備好,不會(huì)越過指令i執(zhí)行),以提高指令流水線效率。為此,在指令譯碼之后的讀寄存器階段,應(yīng)判斷指令需要的操作數(shù)是否準(zhǔn)備好。如果操作數(shù)已經(jīng)準(zhǔn)備好,就進(jìn)入執(zhí)行階段;如果操作數(shù)沒有準(zhǔn)備好,就進(jìn)入稱為保留站或者發(fā)射隊(duì)列的隊(duì)列中等待,直到操作數(shù)準(zhǔn)備好后再進(jìn)入執(zhí)行階段。為了保證執(zhí)行結(jié)果符合程序規(guī)定的要求,亂序執(zhí)行的指令需要有序結(jié)束。為此,執(zhí)行完的指令均進(jìn)入一個(gè)稱為重排序緩沖(Re-Order Buffer,簡(jiǎn)稱ROB)的隊(duì)列,并把執(zhí)行結(jié)果臨時(shí)寫入重命名寄存器。ROB根據(jù)指令進(jìn)入流水線的次序,有序提交指令的執(zhí)行結(jié)果到目標(biāo)寄存器或存儲(chǔ)器。CDC6600和IBM 360/91分別使用記分板和保留站最早實(shí)現(xiàn)了指令的動(dòng)態(tài)調(diào)度。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-771675.html
????????就像保留站和重排序緩沖用來(lái)臨時(shí)存儲(chǔ)指令以使指令在流水線中流動(dòng)更加通暢,重命名寄存器用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)以使數(shù)據(jù)在流水線流動(dòng)更加通暢。保留站、重排序緩沖、重命名寄存器都是微結(jié)構(gòu)中的數(shù)據(jù)結(jié)構(gòu),程序員無(wú)法用指令來(lái)訪問,是結(jié)構(gòu)設(shè)計(jì)人員為了提高流水線效率而用來(lái)臨時(shí)存儲(chǔ)指令和數(shù)據(jù)的。其中,保留站把指令從有序變?yōu)闊o(wú)序以提高執(zhí)行效率,重排序緩存把指令從無(wú)序重新變?yōu)橛行蛞员WC正確性,重命名寄存器則在亂序執(zhí)行過程中臨時(shí)存儲(chǔ)數(shù)據(jù)。重命名寄存器與指令可以訪問的結(jié)構(gòu)寄存器(如通用寄存器、浮點(diǎn)寄存器)相對(duì)應(yīng)。亂序執(zhí)行流水線把指令執(zhí)行結(jié)果寫入重命名寄存器而不是結(jié)構(gòu)寄存器,以避免破壞結(jié)構(gòu)寄存器的內(nèi)容,到順序提交階段再把重命名寄存器內(nèi)容寫入結(jié)構(gòu)寄存器。兩組執(zhí)行不同運(yùn)算但使用同一結(jié)構(gòu)寄存器的指令可以使用不同的重命名寄存器,從而避免該結(jié)構(gòu)寄存器成為串行化瓶頸,實(shí)現(xiàn)并行執(zhí)行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-771675.html
到了這里,關(guān)于【計(jì)算機(jī)體系結(jié)構(gòu)】什么是流水線?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!