第6章-利用流水線(xiàn)提高性能WORD_第1頁(yè)
第6章-利用流水線(xiàn)提高性能WORD_第2頁(yè)
第6章-利用流水線(xiàn)提高性能WORD_第3頁(yè)
第6章-利用流水線(xiàn)提高性能WORD_第4頁(yè)
第6章-利用流水線(xiàn)提高性能WORD_第5頁(yè)
已閱讀5頁(yè),還剩100頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、文檔可能無(wú)法思考全面,請(qǐng)瀏覽后下載! 第6章 利用流水線(xiàn)提高性能隨著時(shí)間的推移,每個(gè)事物都按固有的規(guī)律發(fā)展變化,在舊的事物逝去的同時(shí),新的事物又產(chǎn)生了。Robert Herrick在1648年圣誕節(jié)前夜慶典上的講話(huà)6.1流水線(xiàn)概述16.2流水線(xiàn)的數(shù)據(jù)路徑176.3流水線(xiàn)的控制286.4數(shù)據(jù)冒險(xiǎn)與轉(zhuǎn)發(fā)376.5數(shù)據(jù)冒險(xiǎn)與阻塞496.6分支冒險(xiǎn)536.7異常606.8超標(biāo)量和動(dòng)態(tài)流水線(xiàn)646.9實(shí)際資料:PowerPC 64和Pentium Pro的流水線(xiàn)726.10謬誤和陷阱756.11結(jié)論776.12歷史回顧和參考文獻(xiàn)796.13重要術(shù)語(yǔ)836.14習(xí)題856.1流水線(xiàn)概述決不要浪費(fèi)時(shí)間。95

2、 / 105 -一個(gè)美國(guó)的諺語(yǔ)。流水線(xiàn)是一種實(shí)現(xiàn)多條指令重疊執(zhí)行的技術(shù)。目前,流水線(xiàn)技術(shù)是提高處理器處理速度的關(guān)鍵。本節(jié)依據(jù)上述諺語(yǔ)提供的內(nèi)涵對(duì)流水線(xiàn)的概念及其相關(guān)問(wèn)題進(jìn)行概述。如果你只是想對(duì)流水線(xiàn)技術(shù)有一個(gè)大概的了解,你可以集中精力看完本節(jié),然后直接跳到6.8節(jié)學(xué)習(xí)流水線(xiàn)的工作方式以及它對(duì)程序執(zhí)行性能的影響。如果你想對(duì)基于流水線(xiàn)技術(shù)的計(jì)算機(jī)進(jìn)行深入的了解,6.2到6.7詳細(xì)論述了本節(jié)涉及到的內(nèi)容。任何一個(gè)經(jīng)常光顧洗衣店的人都會(huì)不自覺(jué)的應(yīng)用流水線(xiàn)技術(shù)。非流水線(xiàn)方式的洗衣過(guò)程將包括如下幾個(gè)步驟:1. 把一批臟衣服放入洗衣機(jī)里清洗。2. 洗衣機(jī)洗完后,把衣服取出放入脫水機(jī)中。3. 衣服被甩干后,將

3、之從脫水機(jī)中取出,然后將衣服放在桌子上折疊起來(lái)。4. 衣服折疊好以后,請(qǐng)你的室友幫忙把桌子上的衣服拿走。當(dāng)你的室友把這批洗干凈了的衣服從桌子上全都拿走以后,再開(kāi)始洗下一批臟衣服。采用流水線(xiàn)的方法將節(jié)省大量的時(shí)間。如圖6.1所示,當(dāng)把第一批臟衣服從洗衣機(jī)里取出放入脫水機(jī)之后,你就可以把第二批臟衣服放入洗衣機(jī)里進(jìn)行清洗了。當(dāng)?shù)谝慌路凰Ω芍螅涂梢詫⑺鼈冋郫B起來(lái),同時(shí)把洗凈的下一批濕衣服放入脫水機(jī)中,同時(shí)再將下一批臟衣服放入洗衣機(jī)里清洗。下一步工作就是讓你的室友把第一批衣服從桌子上拿走,而你開(kāi)始折疊第二批衣服,這時(shí)脫水機(jī)中放的是第三批衣服,而且你就可以把第四批衣服放入洗衣機(jī)清洗了。這樣,所有的

4、洗衣步驟(即流水線(xiàn)的步驟)都在同時(shí)操作。一旦在每一操作步驟中都有獨(dú)立的工作單元時(shí),我們就可以采用流水線(xiàn)的方式來(lái)快速的完成任務(wù)了。流水線(xiàn)的奇妙之處在于,對(duì)于單獨(dú)的一批衣服來(lái)說(shuō),從它進(jìn)洗衣機(jī)到脫水機(jī),再到折疊、收拾,整個(gè)過(guò)程的總的處理時(shí)間并沒(méi)有縮短。而在有多批任務(wù)時(shí)流水線(xiàn)之所以快的原因是所有的工作都是在并行的進(jìn)行的。因此,單位時(shí)間內(nèi)能夠完成的工作量就大大的增加了。如果流水線(xiàn)的所有步驟所花費(fèi)的時(shí)間都相同并且有足夠多的工作可以做的話(huà),那么由于采用流水線(xiàn)帶來(lái)的速度的提高倍數(shù)與流水線(xiàn)的步驟的數(shù)目相同。一個(gè)采用流水線(xiàn)方式工作的洗衣房與非流水線(xiàn)方式工作的相比在速度上提高了四倍:前者洗完20批衣服所需的時(shí)間是洗

5、完1批衣服所需時(shí)間的4倍,而后者洗完20批衣服所需的時(shí)間是洗完一批衣服的20倍。在圖6.1中,流水線(xiàn)方式只將處理速度提高了2.3倍的原因是圖中只顯示了清洗四批衣服的處理過(guò)程。圖6.1 以洗衣店為例來(lái)類(lèi)比流水線(xiàn)的運(yùn)作過(guò)程。安妮,布朗,凱西和唐每個(gè)人都有一些臟衣服要清洗、脫水、折疊及儲(chǔ)存。洗衣機(jī)、脫水機(jī)、折疊機(jī)和儲(chǔ)存機(jī)每個(gè)都需要三十分鐘來(lái)完成各自的任務(wù)。順序的洗衣將花費(fèi)8個(gè)小時(shí)的時(shí)間洗完四批衣服,而流水線(xiàn)的洗滌方法只需要花費(fèi)3.5小時(shí)。圖中采用在這個(gè)二維時(shí)間軸上顯示4道工作的副本的方法來(lái)表示同一時(shí)間不同的處理步驟對(duì)應(yīng)的流水線(xiàn)步驟,而事實(shí)上我們每種洗衣設(shè)備都只有一臺(tái)。同樣的原理也可以應(yīng)用到處理器中,

6、即采用流水線(xiàn)方式執(zhí)行處理器指令。通常,一個(gè)MIPS指令包含如下五個(gè)處理步驟:1. 從內(nèi)存中讀取指令。2. 指令解碼的同時(shí)讀取寄存器(MIPS的指令格式允許同時(shí)進(jìn)行指令解碼和讀寄存器)。3. 執(zhí)行操作或計(jì)算地址。4. 在數(shù)據(jù)內(nèi)存中讀取操作數(shù)。5. 將結(jié)果寫(xiě)回寄存器。因此,本章討論的MIPS流水線(xiàn)具有五個(gè)處理步驟。正如流水線(xiàn)能加速洗衣店的工作一樣,下面的例子將說(shuō)明流水線(xiàn)如何加快指令的總體執(zhí)行時(shí)間。單周期指令模型與流水線(xiàn)性能例題:為了使問(wèn)題具體化,我們首先假設(shè)一個(gè)流水線(xiàn)結(jié)構(gòu)。在本例以及本章所剩余的部分內(nèi)容中,我們將只考慮以下的八條指令:load word(lw);store word(sw);add

7、(add);subtract(sub);and(and);or(or);set-less-than(slt)和branch-on-equal(beq)。本實(shí)例將比較流水線(xiàn)指令執(zhí)行與單周期指令執(zhí)行的平均執(zhí)行時(shí)間,其中在單周期模型中所有指令的執(zhí)行都花費(fèi)一個(gè)時(shí)鐘周期。本例中,主要功能單元的操作時(shí)間為內(nèi)存訪(fǎng)問(wèn):2ns;ALU操作:2ns;寄存器文件的讀與寫(xiě):1ns。(在第五章中我們已經(jīng)說(shuō)明在單周期模型中每一條指令都恰恰只花費(fèi)一個(gè)時(shí)鐘周期,因此,時(shí)鐘的周期必須延長(zhǎng)以滿(mǎn)足最慢的指令。)解:八條指令中每一條指令所需要的執(zhí)行時(shí)間如圖6.2所示。單周期模型的設(shè)計(jì)必須考慮到最慢的指令,在圖6.2中是 lw,因此,

8、每一條指令所需要的執(zhí)行時(shí)間為8ns。與圖6.1類(lèi)似,圖6.3比較了三條load word指令非流水線(xiàn)與流水線(xiàn)的方式的執(zhí)行過(guò)程,其中在非流水線(xiàn)模型中,第一條與第四條指令之間時(shí)間的差距是3x8=24ns。指令類(lèi)別指令預(yù)取寄存器讀取ALU操作數(shù)據(jù)訪(fǎng)問(wèn)寄存器寫(xiě)總的執(zhí)行時(shí)間Load word(lw)2ns1ns2ns2ns1ns8nsStore word(lw)2ns1ns2ns2ns7nsR-format(add,sub,and,or,slt)2ns1ns2ns1ns6nsBranch(beq)2ns1ns2ns5ns圖6.2由各操作組件計(jì)算出來(lái)的八條指令總的執(zhí)行時(shí)間。假設(shè)乘法器、控制單元、PC訪(fǎng)問(wèn)和

9、信號(hào)傳遞都沒(méi)有延時(shí)。圖6.3 單循環(huán)、非流水線(xiàn)的指令執(zhí)行過(guò)程(上圖) 與 流水線(xiàn)的指令執(zhí)行過(guò)程(下圖)。兩者采用相同的硬件組件,各組件的處理時(shí)間如圖6.2 。在此種情況下,指令的執(zhí)行速度提高了4倍,即從8ns降到了2ns。將本圖與圖6.1比較。在洗衣服的例子中,我們假設(shè)所有的處理過(guò)程的完成時(shí)間都是相等的。如果脫水機(jī)運(yùn)行得最慢,那么就把抽水的時(shí)間設(shè)定為各步驟需要的處理時(shí)間。計(jì)算機(jī)的流水線(xiàn)過(guò)程處理時(shí)間也是受限于最慢的處理資源,即ALU操作和內(nèi)存訪(fǎng)問(wèn)。同時(shí)我們假設(shè)對(duì)寄存器文件的寫(xiě)操作發(fā)生在時(shí)鐘周期的前半段,對(duì)寄存器文件的讀操作發(fā)生在時(shí)鐘周期的后半段,并且本章所有內(nèi)容都遵循這個(gè)假設(shè)。所有的流水線(xiàn)步驟都

10、只花費(fèi)一個(gè)時(shí)鐘周期的時(shí)間,所以,時(shí)鐘周期必須能夠滿(mǎn)足最慢的操作的執(zhí)行需要。這就象在單周期模型中雖然有些快的指令的執(zhí)行只需要5ns,但它必須選擇在最壞情況下的8ns做為時(shí)鐘周期一樣,流水線(xiàn)執(zhí)行模型的時(shí)鐘周期也必須選擇最壞情況下的2ns而不是有些步驟可以達(dá)到的1ns。流水線(xiàn)能夠?qū)⑿阅芴岣咚谋叮旱谝慌c第四條指令之間的時(shí)間差距縮短為3x2=6ns。我們可以把上面討論的流水線(xiàn)模型能夠獲得的性能加速比歸納成一個(gè)公式。如果流水線(xiàn)各階段操作平衡,那么在流水線(xiàn)機(jī)器上指令執(zhí)行時(shí)間為(在理想情況下):指令執(zhí)行時(shí)間(流水線(xiàn))=指令執(zhí)行時(shí)間(非流水線(xiàn))/流水線(xiàn)步驟數(shù)即在理想的情況下,流水線(xiàn)所帶來(lái)的加速比與流水線(xiàn)的執(zhí)行步

11、驟的數(shù)目相同。一個(gè)有五個(gè)執(zhí)行步驟的流水線(xiàn)能獲得加速比也是五。這個(gè)公式說(shuō)明一個(gè)有五個(gè)步驟的流水線(xiàn)在8ns的非流水線(xiàn)執(zhí)行時(shí)間或者1.6ns的時(shí)鐘周期的基礎(chǔ)上獲得獲得五倍的速度提高。然而,在例子中顯示,各個(gè)步驟間并不是完全的平衡的。另外,流水線(xiàn)中還包括一些常規(guī)的額外開(kāi)銷(xiāo)。所以,在流水線(xiàn)機(jī)器中每一條指令的執(zhí)行時(shí)間會(huì)超過(guò)這個(gè)最小的可能值,因此流水線(xiàn)能夠獲得加速比也就小于流水線(xiàn)的步驟數(shù)。此外,即使我們?cè)谇懊娴姆治鲋袛嘌阅軐⒅噶畹膱?zhí)行速度提高四倍,但本例子三條指令的執(zhí)行中并沒(méi)有反映出來(lái),它實(shí)際獲得的加速比為24ns/14ns。為什么實(shí)際的加速比小了許多呢?如果增加執(zhí)行指令的數(shù)目將會(huì)發(fā)生什么呢?我們首先將前面

12、的圖中的指令增加到1003條,也就是說(shuō)再在上面的流水線(xiàn)例子中加入一千條指令,每一條指令都將會(huì)使整個(gè)的執(zhí)行時(shí)間增加2ns,因此,整個(gè)的執(zhí)行時(shí)間就變成1000x2ns +14ns,即2014ns。在非流水線(xiàn)的例子中,我們也加入1000條指令,每條指令的執(zhí)行時(shí)間是8ns,因此整個(gè)的執(zhí)行時(shí)間為1000x8ns+24ns,即8024ns。在這種理想的條件下,非流水線(xiàn)程序與流水線(xiàn)程序的實(shí)際執(zhí)行時(shí)間的比值就非常接近與兩者指令執(zhí)行時(shí)間的比值,即為:8024ns/2014ns=3.988ns/2ns流水線(xiàn)所帶來(lái)的性能的提高是通過(guò)增加指令的吞吐率來(lái)實(shí)現(xiàn)的,而不是減小單條指令的執(zhí)行實(shí)現(xiàn)的。由于實(shí)際程序都會(huì)執(zhí)行成千上

13、萬(wàn)條指令,因此,指令的吞吐率是一個(gè)很重要的參數(shù)。設(shè)計(jì)流水線(xiàn)指令集盡管上面的例子只是對(duì)流水線(xiàn)的最簡(jiǎn)單的說(shuō)明,我們也能夠通過(guò)它討論如何設(shè)計(jì)MIPS指令集,即如何設(shè)計(jì)能以流水線(xiàn)方式執(zhí)行的指令集。首先,所有的MIPS指令的長(zhǎng)度都必須相同。這一限制將簡(jiǎn)化流水線(xiàn)的第一步預(yù)取指令與第二步指令解碼。在諸如80x86之類(lèi)的系統(tǒng)的指令集中,指令的長(zhǎng)度并不相同,從byte到17byte不等,這樣將會(huì)給流水線(xiàn)的執(zhí)行帶來(lái)更大的挑戰(zhàn)性。第二,MIPS只有很少的幾種指令格式,并且每一條指令中的源寄存器的位置都是相同的。這種對(duì)稱(chēng)性意味著流水線(xiàn)的第二個(gè)步驟在硬件確定提取的指令類(lèi)型的同時(shí)就能夠開(kāi)始讀寄存器文件。如果MIPS的指令

14、格式是非對(duì)稱(chēng)的,我們就需要將第二個(gè)步驟一分為二,從而使得流水線(xiàn)的步驟數(shù)變?yōu)榱ㄎ覀儾痪脤⒖吹捷^長(zhǎng)的流水線(xiàn)的缺點(diǎn))。第三,MIPS中的內(nèi)存操作數(shù)僅出現(xiàn)在load和store操作中。這一限制意味著可以利用執(zhí)行步驟計(jì)算內(nèi)存地址,就可以接著在下一個(gè)步驟訪(fǎng)問(wèn)內(nèi)存。如果我們可以在內(nèi)存中操作操作數(shù),就像在80x86中那樣,那么步驟與步驟將會(huì)擴(kuò)展為地址步驟,內(nèi)存步驟,和執(zhí)行步驟三步。第四,所有操作數(shù)必須在內(nèi)存中排成一列(詳情請(qǐng)查閱第三章軟硬件界面一節(jié)相關(guān)內(nèi)容)。因此,我們不需要擔(dān)心一個(gè)數(shù)據(jù)傳輸指令需要兩次內(nèi)存訪(fǎng)問(wèn)的情況,所請(qǐng)求的數(shù)據(jù)可以在一個(gè)的流水線(xiàn)步驟完成在處理器與內(nèi)存之間傳輸。流水線(xiàn)冒險(xiǎn)(pipeline

15、 hazard)流水線(xiàn)有這樣一種情況,在下一個(gè)時(shí)鐘周期中下一條指令不能執(zhí)行。這種情況稱(chēng)為流水線(xiàn)冒險(xiǎn)。我們將介紹三種流水線(xiàn)冒險(xiǎn)。介紹每種流水線(xiàn)冒險(xiǎn)時(shí)我們都首先利用前面關(guān)于洗衣過(guò)程的類(lèi)比作一簡(jiǎn)單的描述,然后給出計(jì)算機(jī)上流水線(xiàn)存在的相應(yīng)問(wèn)題及其解決方法。結(jié)構(gòu)冒險(xiǎn)第一種冒險(xiǎn)叫做結(jié)構(gòu)冒險(xiǎn)。即硬件不支持期望的多條指令在同一個(gè)時(shí)鐘周期執(zhí)行。在洗衣店例子中,如果用洗衣-脫水機(jī)代替獨(dú)立的洗衣機(jī)與脫水機(jī),或者如果我的室友正在做其它的事情而不能幫助我將衣服收拾好,都會(huì)發(fā)生結(jié)構(gòu)冒險(xiǎn)。如果發(fā)生上述情況,那我們精心構(gòu)筑起來(lái)的流水線(xiàn)就會(huì)被破壞。正如我們?cè)谏厦嫠f(shuō)的那樣,MIPS的指令集是為流水線(xiàn)設(shè)計(jì)的。因此,它就要求設(shè)計(jì)者

16、能夠非常容易的在設(shè)計(jì)流水線(xiàn)時(shí)避免結(jié)構(gòu)冒險(xiǎn)。假設(shè)圖6.3的流水線(xiàn)結(jié)構(gòu)只有一個(gè)內(nèi)存而不是兩個(gè)內(nèi)存,那么如果有第四個(gè)指令的話(huà),我們將會(huì)發(fā)現(xiàn),在某一個(gè)時(shí)鐘周期,第一條指令在訪(fǎng)問(wèn)內(nèi)存的同時(shí)第四條指令將會(huì)在同一內(nèi)存中預(yù)取指令。如果沒(méi)有兩個(gè)內(nèi)存的話(huà),流水線(xiàn)就會(huì)發(fā)生結(jié)構(gòu)冒險(xiǎn)。控制冒險(xiǎn)第二種冒險(xiǎn)叫做控制冒險(xiǎn)。這種冒險(xiǎn)會(huì)在下面的情況下出現(xiàn):決策依賴(lài)于一條指令的結(jié)果,而正好其他的指令在執(zhí)行中。假設(shè)洗衣店的店員們接到了一個(gè)令人高興的任務(wù):為一個(gè)足球隊(duì)清洗隊(duì)服。由于衣服非常的臟,我們需要確定清洗劑的用量以及水的溫度設(shè)置是否能夠?qū)⒁路逑锤蓛簦瑫r(shí)要保證不是過(guò)大以避免過(guò)度的磨損衣物。在洗衣店流水線(xiàn)中,店員只有等到第二步

17、甩干衣服以后才能確定是否需要改變洗衣機(jī)的設(shè)置。在這種情況應(yīng)該怎么辦呢?有兩種辦法可以解決洗衣店的控制冒險(xiǎn),同樣的方法也可以應(yīng)用到計(jì)算機(jī)中。阻塞:在第一批被甩干之前按串行的方式操作,并且重復(fù)這一過(guò)程直到找到正確的洗衣機(jī)設(shè)置為止。這種保守的方法當(dāng)然可以保證正常工作,但它的速度比較慢。計(jì)算機(jī)中的決策就是分支指令。如果計(jì)算機(jī)在一個(gè)分支前被阻塞,那么流水線(xiàn)就不得不暫停。假設(shè)我們可以加入足夠多的硬件使得能在流水線(xiàn)的第二階段測(cè)試寄存器、計(jì)算分支地址并更新PC(詳情參見(jiàn)6.6)。通過(guò)這些額外的硬件,包含的條件分支的流水線(xiàn)執(zhí)行情況如圖6.4所示。圖中如果分支失敗,指令lw在開(kāi)始執(zhí)行之前就要被阻塞了額外的2ns的

18、時(shí)鐘周期。圖6.4說(shuō)明了一個(gè)重要的流水線(xiàn)概念:正式的名稱(chēng)叫做流水線(xiàn)阻塞,但是它經(jīng)常被親昵的叫做氣泡(bubble)。我們經(jīng)常會(huì)在流水線(xiàn)中看到阻塞的發(fā)生。阻塞對(duì)分支性能的影響例題:評(píng)價(jià)分支阻塞對(duì)單位指令時(shí)鐘周期數(shù)(CPI)的影響。假設(shè)其它所有指令的CPI都為1。解:第三章的圖3.38顯示條件分支占gcc執(zhí)行指令的17%。由于其它指令的CPI都為1,而分支指令要多一個(gè)時(shí)鐘周期被阻塞,因此平均CPI為1.17。與理想的情況相比,現(xiàn)在的速度下降到了1.17倍(由于圖3.38還包括了分支指令slt與slti,而它們并不會(huì)阻塞,因此上述CPI只是一個(gè)近似值)。圖6.4 在每一個(gè)條件分支上阻塞是避免流水線(xiàn)控

19、制危險(xiǎn)的一種解決方法。本圖中在分支后有一步流水線(xiàn)阻塞(或者叫氣泡)。如果不能在第二步中解決分支問(wèn)題(這種情況在較長(zhǎng)的流水線(xiàn)中經(jīng)常發(fā)生),那么在分支結(jié)構(gòu)上的阻塞將導(dǎo)致更大的速度下降。對(duì)很多的計(jì)算機(jī)來(lái)說(shuō),這種阻塞的方法應(yīng)用代價(jià)太大。因此也就產(chǎn)生了另外一種消除控制冒險(xiǎn)的方法:預(yù)測(cè):如果你確信能正確的設(shè)置洗衣設(shè)備來(lái)洗滌那些隊(duì)服的話(huà),即你可以預(yù)測(cè)它的工作,那么就可以在第一批衣服甩干的同時(shí)清洗第二批衣服。這種做法在預(yù)測(cè)正確的時(shí)候不會(huì)降低流水線(xiàn)的速度,但是一旦預(yù)測(cè)錯(cuò)誤,就不得不將已經(jīng)洗過(guò)的隊(duì)服重新洗一遍。計(jì)算機(jī)的確是采用預(yù)測(cè)的方法來(lái)處理分支。一種簡(jiǎn)單的預(yù)測(cè)方法就是總預(yù)測(cè)分支會(huì)失敗。當(dāng)你預(yù)測(cè)正確(即分支失?。?/p>

20、的時(shí)候,流水線(xiàn)會(huì)全速的進(jìn)行處理。只有當(dāng)分支成立時(shí)流水線(xiàn)才會(huì)阻塞。圖6.5 給出了這樣一個(gè)例子。圖6.5 預(yù)測(cè)分支不會(huì)執(zhí)行是一種避免流水線(xiàn)控制冒險(xiǎn)的一種解決方法。上圖顯示的是分支沒(méi)有執(zhí)行的流水線(xiàn),下圖顯示的是分支發(fā)生了的流水線(xiàn)。一種更加成熟的分支預(yù)測(cè)方法是預(yù)測(cè)一些分支發(fā)生而預(yù)測(cè)另外一些分支不發(fā)生。如在上面的洗衣店的例子中,夜晚和主場(chǎng)比賽的對(duì)服使用一個(gè)洗衣設(shè)備設(shè)置而白天或客場(chǎng)比賽的對(duì)服則使用另一個(gè)設(shè)置。舉一個(gè)計(jì)算機(jī)的例子,在循環(huán)體的底部分支總是會(huì)跳回到循環(huán)體的頂部。由于分支總是被執(zhí)行并且總是向前跳轉(zhuǎn),因此我們可以預(yù)測(cè)分支會(huì)跳轉(zhuǎn)到前面的某一地址上。這種分支預(yù)測(cè)的方法依賴(lài)于一成不變的行為,它沒(méi)有考慮特

21、定的分支指令的特點(diǎn)。動(dòng)態(tài)硬件預(yù)測(cè)器與這種方法截然不同,它的預(yù)測(cè)依賴(lài)于每一條指令的行為,并且在整個(gè)的程序生命期內(nèi)可能改變分支的預(yù)測(cè)。與洗衣店的例子類(lèi)比,使用動(dòng)態(tài)預(yù)測(cè)方法,店員將會(huì)觀察制服的骯臟程度然后在假設(shè)一個(gè)洗衣設(shè)備設(shè)置,然后在本次預(yù)測(cè)的成功的基礎(chǔ)上調(diào)整下一次的預(yù)測(cè)行為。計(jì)算機(jī)中動(dòng)態(tài)預(yù)測(cè)方法的一種比較普遍的實(shí)現(xiàn)方法是保存每次分支的歷史紀(jì)錄,然后利用這個(gè)歷史紀(jì)錄來(lái)預(yù)測(cè)未來(lái)。這種硬件的方式能夠達(dá)到90%的正確性(參閱6.6)。當(dāng)預(yù)測(cè)錯(cuò)誤時(shí),流水線(xiàn)控制必須確保被錯(cuò)誤預(yù)測(cè)了的分支后面的指令不會(huì)生效并且必須在正確的分支地址處重新開(kāi)始啟動(dòng)流水線(xiàn)。如同其它解決控制冒險(xiǎn)的方法一樣,較長(zhǎng)的流水線(xiàn)會(huì)惡化預(yù)測(cè)的性能

22、,它將提高解決錯(cuò)誤預(yù)測(cè)的代價(jià)??刂泼半U(xiǎn)的解決辦法在6.6節(jié)中將有更加詳細(xì)的介紹。細(xì)節(jié):還有一種解決控制冒險(xiǎn)的方法,即延遲決定(delayed decision)。與洗衣店的例子類(lèi)比,每當(dāng)要決定如何洗衣服時(shí),就將一批非足球隊(duì)的衣服放進(jìn)洗衣機(jī)里,同時(shí)等待足球隊(duì)的制服被甩干。只要有足夠多不需要決策的臟衣服,這種方法就能夠很好的工作。在計(jì)算機(jī)中這種方法被稱(chēng)為延遲分支,在MIPS系統(tǒng)結(jié)構(gòu)中也得到了實(shí)際應(yīng)用。延遲分支發(fā)生分支的下一個(gè)順序的指令,而在一個(gè)指令的延遲之后再開(kāi)始執(zhí)行分支。由于編譯器會(huì)自動(dòng)的排列指令使得分支的行為達(dá)到程序員的要求,因此這個(gè)過(guò)程對(duì)MIPS的匯編程序員們是透明的。MIPS軟件會(huì)在延遲分

23、支指令的后面緊跟著放一條不受該分支影響的指令。發(fā)生了的分支會(huì)改變這條安全指令之后的指令的地址。在我們的例子中,圖6.4中分支前的指令add不影響分支,所以在圖6.6中就把它移到了分支之后的延遲分支時(shí)間片中。編譯器一般只能在大約50%的分支延遲時(shí)間片中放入有用的指令。如果流水線(xiàn)比五個(gè)步驟長(zhǎng)的話(huà),將會(huì)有更多的延遲分支時(shí)間片,這些時(shí)間片將更加難以填滿(mǎn)。圖6.6推遲分支是避免流水線(xiàn)控制冒險(xiǎn)的一種解決方法。流水線(xiàn)氣泡被add操作所代替。數(shù)據(jù)冒險(xiǎn)讓我們?cè)倩氐较匆碌甑睦?。假設(shè)你正在折疊一批衣服,而這批衣服的大多數(shù)都是短襪。你突然發(fā)現(xiàn)你的運(yùn)氣非常的不好。因?yàn)樵谶@一批當(dāng)中的所有短襪的另外一只都在另一批衣服中。

24、而那一批正在洗衣機(jī)中洗滌。你無(wú)法把手頭的這些短襪配對(duì),也就無(wú)法對(duì)它們進(jìn)行儲(chǔ)存,只有等到那一批衣服也被處理完,因而必須阻塞流水線(xiàn)。這種問(wèn)題在計(jì)算機(jī)當(dāng)中稱(chēng)為數(shù)據(jù)冒險(xiǎn):即一條指令依賴(lài)仍然在流水線(xiàn)當(dāng)中執(zhí)行的前一條指令的結(jié)果。舉個(gè)例子來(lái)說(shuō),假設(shè)我們有一條加法指令,它之后緊跟著一條減法指令,而減法指令要使用加法指令的和:Add $s0, $t0,$t1Sub $t2,$s0,$t3在沒(méi)有干涉的情況下,這一數(shù)據(jù)冒險(xiǎn)會(huì)嚴(yán)重的阻礙流水線(xiàn)。加法指令直到第五步才能寫(xiě)出它的結(jié)果,這就意味著我們必須在流水線(xiàn)當(dāng)中加入三個(gè)氣泡。雖然我們可以試圖依靠編譯器來(lái)避免這種數(shù)據(jù)冒險(xiǎn)的發(fā)生,但實(shí)際上這種努力是失敗的。因?yàn)檫@種相關(guān)性的發(fā)

25、生過(guò)于頻繁而且導(dǎo)致的延遲也過(guò)于長(zhǎng),因此不可能指望編譯器能把我們從這種困境當(dāng)中解脫出去。一種最基本的解決方法試圖不等待指令執(zhí)行結(jié)束來(lái)解決數(shù)據(jù)冒險(xiǎn)問(wèn)題。對(duì)于上述的代碼序列,一旦ALU生成了加法運(yùn)算的結(jié)果,我們就可以將它用作減法運(yùn)算的一個(gè)輸入項(xiàng)。從內(nèi)部資源中直接提前得到缺少的運(yùn)算項(xiàng)的過(guò)程稱(chēng)為轉(zhuǎn)發(fā)(forward)或者旁路(bypassing)。兩個(gè)指令中的轉(zhuǎn)發(fā)例題:對(duì)于上述的兩條指令說(shuō)明適用轉(zhuǎn)發(fā)如何將流水線(xiàn)步驟連接起來(lái)。圖6.7描述了流水線(xiàn)的五步的數(shù)據(jù)路徑。圖6.1中的洗衣店流水線(xiàn)類(lèi)似,每條指令的數(shù)據(jù)路徑排成一列。解:圖6.8 表示了把a(bǔ)dd 指令執(zhí)行后的$s0中的值作為sub指令執(zhí)行的輸入的轉(zhuǎn)發(fā)連

26、接。在圖6.8中,只有當(dāng)目標(biāo)步驟在時(shí)間上晚于源步驟時(shí)轉(zhuǎn)發(fā)的路徑才有效。例如,從前一條指令的內(nèi)存訪(fǎng)問(wèn)的輸出至下一條指令的輸入的轉(zhuǎn)發(fā)路徑就不可能有效,因?yàn)槟菢拥脑?huà)將意味著時(shí)間的倒流。轉(zhuǎn)發(fā)可以工作的非常好,其具體內(nèi)容將在6.4節(jié)中詳細(xì)介紹。然而它并不能夠防止所有的流水線(xiàn)阻塞的發(fā)生。例如,假設(shè)第一條指令不是add 而是載入$s0寄存器的內(nèi)容,正如圖6.8所描述的那樣,由于數(shù)據(jù)間的依賴(lài),所需要的數(shù)據(jù)只有在前一條指令流水線(xiàn)的第四步完成之后才能生效,這對(duì)于sub指令的第三步輸入來(lái)說(shuō)就太遲了。因此,如圖6.9所示,即使使用了轉(zhuǎn)發(fā)機(jī)制,在載入使用的數(shù)據(jù)冒險(xiǎn)中,流水線(xiàn)仍然不得不阻塞一個(gè)步驟。在6.5節(jié)我們將論述如

27、何通過(guò)流水線(xiàn)的硬件解決象這類(lèi)載入問(wèn)題。圖6.7指令流水線(xiàn)的圖形表示。其基本思想與圖6.1中的洗衣店流水線(xiàn)類(lèi)似。在本圖以及本章所有內(nèi)容中,我們使用圖形符號(hào)來(lái)代表流水線(xiàn)執(zhí)行各階段使用的物理資源。這些符號(hào)在五個(gè)流水線(xiàn)步驟中所代表的意義分別是:IF表示指令的預(yù)取,其外方框表示指令的內(nèi)存;ID表示指令的解碼或寄存器文件的讀取,外邊的虛線(xiàn)方框表示要讀取的寄存器文件;EX表示指令的執(zhí)行階段,外邊的圖符表示ALU;MEM代表內(nèi)存訪(fǎng)問(wèn)階段,包圍它的方框代表數(shù)據(jù)內(nèi)存;WB代表寫(xiě)回過(guò)程,包圍它的虛線(xiàn)方框代表被寫(xiě)回的寄存器文件。陰影表示該資源被指令所使用。因此MEM沒(méi)有陰影,因?yàn)閍dd指令在這一步并不讀取數(shù)據(jù)內(nèi)存。寄

28、存器文件或內(nèi)存上右半邊的陰影表示著它們?cè)诖瞬襟E中被讀取,左半邊的陰影表示它們?cè)诖瞬襟E中被寫(xiě)入。因此,由于第二步需要讀取寄存器文件,ID的右半邊有陰影,而由于第五步中需要寫(xiě)入寄存器文件,WB的左半邊有陰影。圖6.8 轉(zhuǎn)發(fā)的圖形表示。圖中的連接表示從 add指令的EX操作的輸出到sub指令的EX操作的輸入的轉(zhuǎn)發(fā)路徑。,從而替換掉在sub的第二步從寄存器$s0讀取的值。圖6.9 當(dāng)一條R型的指令之后緊跟著一條需要使用該數(shù)據(jù)的load指令時(shí),即使使用了轉(zhuǎn)發(fā)機(jī)制,仍然會(huì)產(chǎn)生一次阻塞。如果不進(jìn)行一次阻塞的話(huà),從內(nèi)存訪(fǎng)問(wèn)的輸出到執(zhí)行步驟的輸入之間的路徑在時(shí)間上將是倒著的,這顯然是不可能的。重新排列

29、代碼以避免流水線(xiàn)的阻塞例題:下面代碼是164頁(yè)圖3.23中的swap過(guò)程的一段,請(qǐng)找出其中的數(shù)據(jù)冒險(xiǎn)。#reg$t1has the address of vkLw$t0,0($t1)#reg $t0(temp)= vkLw$t2,4($t1)#reg$t2=vkSw$t2,0($t1)#vk=reg $t2Sw$t0,4($t1)#vk+1=reg $t0 (temp)將這一段指令重新排列以避免流水線(xiàn)阻塞。解:冒險(xiǎn)會(huì)在第二個(gè)lw和第一個(gè)sw之間的寄存器$t2上發(fā)生。交換兩條sw指令的順序就能排除掉這個(gè)冒險(xiǎn):# reg$t1 has the address of vklw$t0,0($t1)#

30、reg$t0 (temp)=vklw$t2,4($t1)# reg$t2 =vk+1sw$t0,4($t1)# vk+1 = reg $t0 (temp)sw$t2,0($t1)# vk = reg $t2注意,由于在lw寫(xiě)寄存器$t0與sw讀寄存器$t0之間仍然存在著一條指令,所以這樣交換之后不會(huì)產(chǎn)生新的冒險(xiǎn)。因此,在一臺(tái)具有轉(zhuǎn)發(fā)機(jī)制的機(jī)器上,執(zhí)行重新排列的代碼段只需要四個(gè)時(shí)鐘周期。軟硬件接口 在編譯器與硬件的設(shè)計(jì)復(fù)雜性進(jìn)行折衷的例子中,原始的MIPS處理器通過(guò)軟件在一條載入指令之后加入一條與之無(wú)關(guān)的指令的方法來(lái)避免阻塞流水線(xiàn)。這樣的載入過(guò)程叫做延遲載入。除440頁(yè)所提到的四種情況以外,轉(zhuǎn)發(fā)

31、還給MIPS系統(tǒng)結(jié)構(gòu)增加新的約束,即每一個(gè)MIPS指令都在指令執(zhí)行結(jié)束時(shí)寫(xiě)而且只寫(xiě)一個(gè)結(jié)果。如果一條指令中需要轉(zhuǎn)發(fā)多個(gè)結(jié)果或者在指令結(jié)束以前需要寫(xiě)回多個(gè)結(jié)果,轉(zhuǎn)發(fā)將變得更加困難。例如,在PowerPC的載入指令中就使用了更改尋址機(jī)制(參見(jiàn)第三章175頁(yè)),從而使得處理器必須能夠在每一條載入指令中轉(zhuǎn)發(fā)兩個(gè)結(jié)果。流水線(xiàn)概述的總結(jié)流水線(xiàn)是一種在順序指令流中利用指令間的并行性的技術(shù),其優(yōu)勢(shì)在于,與其它加速技術(shù)不同(參見(jiàn)第九章),它對(duì)程序員是不可見(jiàn)的。在以下幾節(jié)中,我們首先使用MIPS的指令子集lw,sw,add,sub,and,or,slt和beq(見(jiàn)第五章)及其簡(jiǎn)化的流水線(xiàn)方式介紹關(guān)于流水線(xiàn)的一些基

32、本概念,然后討論引入流水線(xiàn)所帶來(lái)的一些問(wèn)題以及流水線(xiàn)在一些典型情況下所能夠達(dá)到的性能。重點(diǎn):流水線(xiàn)增加了同時(shí)執(zhí)行的指令的數(shù)目以及指令開(kāi)始和結(jié)束的比率。流水線(xiàn)并不能夠減少單一指令的執(zhí)行時(shí)間。一個(gè)五個(gè)步驟的流水線(xiàn)仍然需要五個(gè)周期來(lái)完成一條指令。用第二章56頁(yè)的術(shù)語(yǔ)來(lái)描述就是流水線(xiàn)提高了指令的吞吐量而不是減少了單條指令的執(zhí)行時(shí)間。對(duì)流水線(xiàn)的設(shè)計(jì)者們來(lái)說(shuō)指令集即可能將事物簡(jiǎn)單化,也可能將事物復(fù)雜化。流水線(xiàn)設(shè)計(jì)者必須解決結(jié)構(gòu)冒險(xiǎn)、控制冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。而分支預(yù)測(cè)、轉(zhuǎn)發(fā)和阻塞機(jī)制能夠在保證得到正確結(jié)果的前提下提高計(jì)算機(jī)的性能。如果你想更快地瀏覽本章的話(huà),我們相信,在完成了本節(jié)的學(xué)習(xí)以后,你已經(jīng)具有足夠的背景

33、知識(shí),并且可以直接跳到6.8節(jié)與6.9節(jié)去了解一些先進(jìn)的流水線(xiàn)概念,如超標(biāo)量流水線(xiàn)與動(dòng)態(tài)流水線(xiàn),并且可以去了解流水線(xiàn)在當(dāng)前的一些微處理器中是如何工作的。如果你想更加深入的了解流水線(xiàn)技術(shù),在讀完第五章與本節(jié)后,6.2節(jié)將介紹為實(shí)現(xiàn)流水線(xiàn)數(shù)據(jù)路徑需要做出的改變,6.3節(jié)介紹流水線(xiàn)數(shù)據(jù)路徑的控制,6.4節(jié)中闡述為實(shí)現(xiàn)轉(zhuǎn)發(fā)對(duì)數(shù)據(jù)路徑及其控制的修改,6.5節(jié)介紹解決載入操作數(shù)據(jù)冒險(xiǎn)引起的阻塞及其需要對(duì)數(shù)據(jù)路徑和控制機(jī)制的修改,6.6節(jié)詳細(xì)介紹分支冒險(xiǎn)的解決方法,6.7節(jié)討論異常的處理。細(xì)節(jié):轉(zhuǎn)發(fā)這個(gè)名稱(chēng)來(lái)源于將結(jié)果從前面的指令直接發(fā)送到后面的指令的思想。旁路這個(gè)名稱(chēng)來(lái)源于把寄存器文件中的結(jié)果直接傳遞到需

34、要的單元中。6.2流水線(xiàn)的數(shù)據(jù)路徑圖6.10是摘自第五章的一個(gè)單時(shí)鐘周期的數(shù)據(jù)路徑。將指令劃分為五個(gè)階段意味著一個(gè)有五個(gè)步驟的流水線(xiàn),也就意味著在任何一個(gè)單時(shí)鐘周期內(nèi),最多會(huì)有五條指令被執(zhí)行。因此我們必須把數(shù)據(jù)路徑分為五個(gè)部分,每一部分用與它相對(duì)應(yīng)的指令執(zhí)行階段來(lái)命名。1 IF:指令預(yù)取2 ID:指令解碼,讀寄存器文件3 EX:執(zhí)行或計(jì)算地址4 MEM:數(shù)據(jù)內(nèi)存訪(fǎng)問(wèn)5 WB:寫(xiě)回圖6.10單周期周期的數(shù)據(jù)路徑(與358頁(yè)的圖5.17類(lèi)似)。指令的每一步在圖中由左至右映射到數(shù)據(jù)路徑上。唯一的例外是PC的更新與寫(xiě)回過(guò)程(如圖中彩色部分所示),它們發(fā)送ALU結(jié)果或內(nèi)存數(shù)據(jù)到左邊的寄存器文件中(通常用

35、彩色線(xiàn)代表控制,而在本圖中它們它們都是數(shù)據(jù)線(xiàn))。在圖6.10中,這五個(gè)步驟大致和數(shù)據(jù)路徑相符:指令與數(shù)據(jù)隨著執(zhí)行的過(guò)程從左到右一次在這這五步流過(guò)。讓我們?cè)僖淮位氐较匆碌昴莻€(gè)類(lèi)比中去,衣服沿著一條工作線(xiàn)依次被清洗、脫水和整理,而不會(huì)反過(guò)來(lái)移動(dòng)。然而,在這個(gè)從左到右的指令流中有兩個(gè)例外:l 寫(xiě)回階段,它把結(jié)果寫(xiě)回到數(shù)據(jù)路徑中間的寄存器文件中。l 選擇PC的下一個(gè)值,在PC+1與MEM階段的分支地址間進(jìn)行選擇。圖6.11指令按圖6.10中的單時(shí)鐘周期數(shù)據(jù)路徑執(zhí)行(假定以流水線(xiàn)的方式執(zhí)行)。與圖6.7到圖6.9類(lèi)似,本圖假設(shè)每一條指令有它獨(dú)立的數(shù)據(jù)路徑,并根據(jù)使用情況將相應(yīng)的部分涂上陰影。與這些圖不同

36、的是,流水線(xiàn)的每一步都用該步驟使用的實(shí)際資源部件標(biāo)示,分別對(duì)應(yīng)圖6.10中數(shù)據(jù)路徑的相應(yīng)部分。IM表示指令內(nèi)存與指令預(yù)取階段的PC,Reg表示指令解碼/寄存器文件讀取階段(ID)的寄存器文件和信號(hào)合成器,依此類(lèi)推。為了保持正確的時(shí)序,這種格式的數(shù)據(jù)路徑把寄存器文件從邏輯上劃分為兩個(gè)部分:寄存器讀?。↖D)階段的寄存器讀和寫(xiě)回(WB)時(shí)的寄存器寫(xiě)。這種雙重的應(yīng)用在圖中表示為:在ID階段當(dāng)它沒(méi)有被寫(xiě)入的時(shí)候,將沒(méi)有陰影的寄存器文件的左半部分用虛線(xiàn)表示,而在WB階段當(dāng)它沒(méi)有被讀時(shí),則將沒(méi)有陰影的右邊部分用虛線(xiàn)表示。與以前一樣,我們假設(shè)在時(shí)鐘周期的前半部分寫(xiě)寄存器文件而在時(shí)鐘周期的后半部分讀寄存器文件

37、。數(shù)據(jù)從右向左流動(dòng)并不會(huì)影響當(dāng)前的指令,流水線(xiàn)中只有當(dāng)前指令以后的指令才會(huì)受到這種數(shù)據(jù)的反向活動(dòng)的影響。需要注意的是第一個(gè)從右向左的箭頭會(huì)導(dǎo)致數(shù)據(jù)冒險(xiǎn),而第二個(gè)會(huì)導(dǎo)致控制冒險(xiǎn)。一種表示流水線(xiàn)的數(shù)據(jù)路徑的方法是假定每一條指令都有它獨(dú)立的數(shù)據(jù)路徑,然后把這些數(shù)據(jù)路徑放在同一時(shí)間軸上表示它們之間的關(guān)系。圖6.11在同一時(shí)間軸表示了圖6.3中指令執(zhí)行過(guò)程中各自的數(shù)據(jù)路徑,我們?nèi)匀皇褂脠D6.10中的格式來(lái)表示圖6.11中的關(guān)系。圖6.11看起來(lái)好像是三條指令需要三條數(shù)據(jù)路徑。在第五章我們?cè)黾恿吮4鏀?shù)據(jù)的寄存器,從而使得在指令的執(zhí)行過(guò)程中可以共享部分?jǐn)?shù)據(jù)路徑。在這里我們使用同樣的技術(shù)共享多條數(shù)據(jù)路徑。例如

38、,在圖6.11中指令內(nèi)存只在每條指令的五個(gè)步驟中的一步中用到,因此我們?cè)试S它在其它四步中被其它的指令共享。圖6.12 圖6.10數(shù)據(jù)路徑的流水線(xiàn)版本。流水線(xiàn)寄存器(圖中彩色部分所示)將流水線(xiàn)的各部分分開(kāi)。他們分別以被分開(kāi)的各步驟為標(biāo)志,例如,第一個(gè)被標(biāo)為IF/ID是因?yàn)樗鼘⒅噶畹念A(yù)取與指令的解碼階段分開(kāi)的緣故。為了儲(chǔ)存所有穿過(guò)它的由線(xiàn)條代表的數(shù)據(jù),寄存器的帶寬必須足夠大。例如,因?yàn)镮F/ID寄存器必須同時(shí)保存32位的從內(nèi)存中提取出來(lái)的指令及32位的PC增量的地址,它的帶寬必須是64位。我們將在本章中漸漸增加寄存器的帶寬的,目前另外三個(gè)流水線(xiàn)寄存器分別包含128位、97位和64位。為了在其它四步

39、中保持指令的各自的值,從指令內(nèi)存中讀出的數(shù)據(jù)必須保存在寄存器中。同樣的方法應(yīng)用到每個(gè)流水線(xiàn)步驟中,我們需要在圖6.10中各步驟間有分割線(xiàn)的地方都加入寄存器(這種變化與第五章中在從單時(shí)鐘周期到多時(shí)鐘周期變化時(shí)增加寄存器的方法類(lèi)似)。1再回到洗衣店類(lèi)比例子中,這時(shí)我們可以用籃子在兩個(gè)步驟之間存放下一步的衣服。圖6.12描述了流水線(xiàn)的數(shù)據(jù)路徑,其中流水線(xiàn)寄存器用高亮度重點(diǎn)表示。在每個(gè)時(shí)鐘周期中所有指令都會(huì)從一個(gè)流水線(xiàn)寄存器推進(jìn)到另一個(gè)流水線(xiàn)寄存器中。寄存器以被該寄存器分開(kāi)的兩個(gè)階段來(lái)命名,如IF和ID階段之間的流水線(xiàn)寄存器叫做IF/ID。需要注意的是在寫(xiě)回階段的后面沒(méi)有流水線(xiàn)寄存器。所有的指令都會(huì)更

40、新機(jī)器中的一些狀態(tài),如寄存器文件、內(nèi)存或者是PC等,因此各個(gè)流水線(xiàn)寄存器文件對(duì)于更新后的狀態(tài)來(lái)說(shuō)是多余的。例如,一條load指令會(huì)把它的結(jié)果放入32個(gè)寄存器中的某一個(gè)中,以后任何需要此數(shù)據(jù)的指令只需要簡(jiǎn)單的讀取相應(yīng)的寄存器就可以了(6.4節(jié)和6.5節(jié)中將詳細(xì)介紹如何解決流水線(xiàn)指令間存在的數(shù)據(jù)冒險(xiǎn),在此我們暫時(shí)忽略這個(gè)問(wèn)題)。為了描述流水線(xiàn)的工作方式,本章將使用一系列圖片來(lái)表示這些順序的操作。這些額外的內(nèi)容可能需要一定的時(shí)間去理解,但千萬(wàn)不要害怕,這些圖片實(shí)際上比它們看上去要容易理解,因?yàn)槟憧梢詫?duì)比的去觀察每一個(gè)時(shí)鐘周期內(nèi)所發(fā)生的變化。圖6.13到圖6.15表示了一條load 指令在通過(guò)流水線(xiàn)的

41、五個(gè)執(zhí)行步驟時(shí)數(shù)據(jù)路徑的活動(dòng)部分,在圖中它們都用高亮度重點(diǎn)表示。我們首先講解load 指令的因?yàn)槭撬谖鍌€(gè)步驟中一直是活動(dòng)的。正如圖6.7到圖6.12所顯示的那樣,當(dāng)寄存器或者是內(nèi)存被讀取時(shí)我們用在圖中高亮度表示它們的右半部分;而當(dāng)它們被寫(xiě)入的時(shí)候,我們?cè)趫D中用高亮度來(lái)表示其左半部分。我們把每一幅圖中活動(dòng)的流水線(xiàn)步驟用指令的縮寫(xiě)lw標(biāo)出。這五個(gè)步驟的情況如下: 指令的預(yù)?。簣D6.13的上圖表示指令使用PC中的地址被從內(nèi)存中讀取數(shù)據(jù),然后將數(shù)據(jù)放入了IF/ID流水線(xiàn)寄存器中(IF/ID流水線(xiàn)寄存器與378頁(yè)圖5.30中的指令寄存器類(lèi)似)。中的地址加然后存入中為下一個(gè)時(shí)鐘周期做準(zhǔn)備。增加后的地址同

42、時(shí)也存入了IF/ID流水線(xiàn)寄存器中以備以后的指令使用,如beq。計(jì)算機(jī)并不知道所預(yù)取的類(lèi)型,所以必須為可能的任何指令作準(zhǔn)備,并順著流水線(xiàn)傳遞所有可能有用的信息。 指令解碼與寄存器文件的讀取:圖6.13的下圖顯示的是IF/ID流水線(xiàn)寄存器的指令部分,它提供位的立即數(shù)(可擴(kuò)展為帶符號(hào)的位數(shù)),并讀取兩個(gè)寄存器的寄存器號(hào)。這三個(gè)值沿著遞增的地址存入ID/EX流水線(xiàn)寄存器中。這里我們也必須傳遞后面的指令可能用到的所有信息。 執(zhí)行或者地址計(jì)算:圖6.14表示load指令從ID/EX流水線(xiàn)寄存器中讀取寄存器中的內(nèi)容以及擴(kuò)展后帶符號(hào)的立即數(shù),并用將它們相加。加法的和放入了EX/MEM流水線(xiàn)指令寄存器中。 內(nèi)

43、存訪(fǎng)問(wèn):圖6.15的上圖表示load指令使用從EX/MEM流水線(xiàn)寄存器中得到的地址讀取數(shù)據(jù)內(nèi)存,并將數(shù)據(jù)載入MEM/WB流水線(xiàn)寄存器當(dāng)中。 寫(xiě)回:圖6.15的下圖表示了最后一個(gè)步驟,即從MEM/WB流水線(xiàn)寄存器中讀取數(shù)據(jù)并將它寫(xiě)入圖中間的寄存器中。圖6.13 IF與ID:指令的第一個(gè)與第二個(gè)流水線(xiàn)步,圖6.12的數(shù)據(jù)路徑的活動(dòng)部分用高亮度表示。圖中的表示約定與圖6.7中相同。如第五章相同,讀寫(xiě)寄存器并不發(fā)生沖突是因?yàn)榧拇嫫鲀?nèi)容的變化只有在時(shí)鐘周期的邊緣發(fā)生。雖然load指令只需要第二個(gè)步驟中最上面的那個(gè)寄存器,但由于處理器并不知道當(dāng)前是哪一條指令正在被解碼,因此它把16位的常量進(jìn)行符號(hào)化擴(kuò)展,

44、并把兩個(gè)寄存器中的值都讀入ID/EX流水線(xiàn)寄存器中。我們并不需要所有這三個(gè)操作數(shù),但是全部保留三個(gè)操作數(shù)能簡(jiǎn)化對(duì)它們的控制。圖6.14 EX:load指令的第三個(gè)步,并且用高亮度線(xiàn)條標(biāo)示出圖6.12中的數(shù)據(jù)路徑在這個(gè)流水線(xiàn)步的部分。寄存器與經(jīng)過(guò)符號(hào)擴(kuò)展的立即數(shù)相加,其和放入EX/MEM流水線(xiàn)寄存器中。圖6.15 MEM與WB:load 指令的第四個(gè)與第五個(gè)流水線(xiàn)步,并且用高亮度線(xiàn)條標(biāo)示出圖6.12中的數(shù)據(jù)路徑在這兩個(gè)流水線(xiàn)步的部分。利用EX/MEM流水線(xiàn)寄存器中的地址讀取數(shù)據(jù)內(nèi)存,并將讀取的數(shù)據(jù)放入到MEM/WB流水線(xiàn)寄存器中。然后從MEM/WB流水線(xiàn)寄存器中讀取數(shù)據(jù)并將數(shù)據(jù)寫(xiě)入數(shù)據(jù)路徑中間的

45、寄存器文件中。對(duì)load指令的整個(gè)過(guò)程的描述表明任何一個(gè)將被下一個(gè)流水線(xiàn)步驟應(yīng)用到的數(shù)據(jù)都必須通過(guò)流水線(xiàn)寄存器傳輸?shù)侥莻€(gè)步驟??v觀store指令的執(zhí)行過(guò)程,我們會(huì)發(fā)現(xiàn)除了要將有用的信息傳遞到后面的流水線(xiàn)步驟外,指令的執(zhí)行還有一定的相似性。下面是store指令的五個(gè)執(zhí)行步驟: 指令的預(yù)?。豪弥械牡刂窂膬?nèi)存中讀出指令,然后將指令放入IF/ID流水線(xiàn)寄存器中。這個(gè)步驟發(fā)生在指令被確認(rèn)之前,所以圖6.13中的上圖的內(nèi)容既適用于load指令也適用于store指令。 指令的解碼與寄存器文件的讀?。篒F/ID流水線(xiàn)寄存器中的指令支持讀取兩個(gè)寄存器的寄存器號(hào)和經(jīng)過(guò)符號(hào)化擴(kuò)展的16位立即數(shù)。這三個(gè)32位的數(shù)都

46、存放在ID/EX流水線(xiàn)寄存器中。圖6.13中的下圖同時(shí)也可描述了store指令的第二個(gè)流水線(xiàn)步驟。由于此時(shí)無(wú)法得知要執(zhí)行的指令的類(lèi)型,因此這兩個(gè)步驟在所有的指令執(zhí)行過(guò)程中都會(huì)被執(zhí)行。 指令執(zhí)行或地址計(jì)算:圖6.16描述了流水線(xiàn)的第三個(gè)步驟,有效地址存放在EX/MEM流水線(xiàn)寄存器中。 內(nèi)存訪(fǎng)問(wèn):圖6.17的上圖描述的是數(shù)據(jù)寫(xiě)入內(nèi)存的過(guò)程。需要注意的是需要存入寄存器中的數(shù)據(jù)在較早的流水線(xiàn)步驟中已經(jīng)讀出并存放在ID/EX中。在MEM階段唯一一種獲得這個(gè)數(shù)據(jù)的方法就是把數(shù)據(jù)放入EX步驟中的EX/MEM流水線(xiàn)寄存器中,這一過(guò)程與將有效地址放入EX/MEM中類(lèi)似。 寫(xiě)回:圖6.17中的下圖描述了store

47、指令的最后一個(gè)流水線(xiàn)步驟。store指令在寫(xiě)回步驟中不做任何事情。由于store指令后的每一條指令都已經(jīng)進(jìn)入流水線(xiàn)中,所以我們無(wú)法加速這些指令。因此,任何一條指令都必須經(jīng)過(guò)流水線(xiàn)種的每一個(gè)步驟,即使在這個(gè)步驟中它實(shí)際上什么都沒(méi)有做,這是因?yàn)楹竺娴闹噶钜呀?jīng)按照最大的速率在流水線(xiàn)中進(jìn)行處理。圖6.16EX:store指令的第三個(gè)流水線(xiàn)步。與圖6.14中l(wèi)oad指令的第三個(gè)流水線(xiàn)步不同的是,第二個(gè)寄存器中的數(shù)據(jù)被載入EX/MEM流水線(xiàn)寄存器中,并被用于下一個(gè)步驟。雖然總是將第二個(gè)寄存器中的數(shù)據(jù)載入EX/MEM流水線(xiàn)寄存器中并不會(huì)產(chǎn)生什么不良的影響,但為了使流水線(xiàn)更易于理解,我們?nèi)匀恢辉趕tore指令

48、中才寫(xiě)第二個(gè)寄存器的內(nèi)容。圖6.17 MEM和WB:store指令的第四與第五個(gè)流水線(xiàn)步。在第四個(gè)步中,為了存儲(chǔ)數(shù)據(jù)將數(shù)據(jù)寫(xiě)入數(shù)據(jù)內(nèi)存中。需要注意的是數(shù)據(jù)來(lái)自于EX/MEM流水線(xiàn)寄存器,并且MEM/WB流水線(xiàn)寄存器并沒(méi)有改變。一旦數(shù)據(jù)寫(xiě)入內(nèi)存,store指令就沒(méi)有什么可做的了,所以在步驟中store指令并不做任何處理。Store指令再次說(shuō)明在流水線(xiàn)中為了從前面的步驟向后面的步驟傳遞信息,就必須將信息放入流水線(xiàn)寄存器中,否則當(dāng)下一條指令進(jìn)入該流水線(xiàn)步驟時(shí)這些信息將會(huì)丟失。在store指令中,我們需要將一個(gè)寄存器中的內(nèi)容在ID步驟中讀出然后在MEM步驟放入內(nèi)存中。這些數(shù)據(jù)首先放在ID/EX流水線(xiàn)寄

49、存器然后被傳送到EX/MEM流水線(xiàn)寄存器中。Load與store的執(zhí)行過(guò)程還表明了另一個(gè)重要特性,即數(shù)據(jù)路徑中的每一個(gè)邏輯元件,如指令內(nèi)存、寄存器讀取端口、ALU、數(shù)據(jù)內(nèi)存以及寄存器寫(xiě)入端口,都只能在一個(gè)流水線(xiàn)步驟中使用,否則就會(huì)產(chǎn)生結(jié)構(gòu)冒險(xiǎn)(請(qǐng)查閱441頁(yè))。因此,這些元件以及它們的控制單元都只能與一個(gè)流水線(xiàn)步驟相關(guān)聯(lián)?,F(xiàn)在我們可以揭示load指令設(shè)計(jì)中的一個(gè)bug了。你發(fā)現(xiàn)了這個(gè)bug嗎?在load指令執(zhí)行的最后一個(gè)階段有哪一個(gè)寄存器內(nèi)容改變了呢?更確切的說(shuō),哪一條指令提供了寫(xiě)寄存器號(hào)呢?在IF/ID流水線(xiàn)寄存器中的指令提供了寫(xiě)寄存器號(hào),但是很顯然這條指令發(fā)生在load指令之后。因此,我們

50、要在load指令中保存目的寄存器號(hào)。就像store指令為了MEM步驟使用的需要將寄存器的內(nèi)容從ID/EX轉(zhuǎn)送到EX/MEM流水線(xiàn)寄存器中去一樣,為了WB步驟中的使用的需要,load指令必須把寄存器號(hào)從ID/EX經(jīng)過(guò)EX/MEM傳送到MEM/WB流水線(xiàn)寄存器中。換一個(gè)角度來(lái)考慮傳輸寄存器號(hào)的必要性:為了共享流水線(xiàn)的數(shù)據(jù)路徑,我們需要在IF步驟中保存讀取的指令,因此,每一個(gè)流水線(xiàn)寄存器都要保存當(dāng)前步驟和以下各流水線(xiàn)步驟所需的部分指令。圖6.18描述了正確的數(shù)據(jù)路徑,首先將寫(xiě)寄存器號(hào)傳送到ID/EX寄存器,然后再送到EX/MEM寄存器,最后送到MEM/WB寄存器。在WB步驟使用寄存器號(hào)以確定要寫(xiě)入的

51、寄存器。圖6.19是一個(gè)正確的簡(jiǎn)單的數(shù)據(jù)路徑圖,圖中用高亮度表示了從圖6.13到圖6.15load指令在所有五個(gè)流水線(xiàn)步驟中要使用的硬件(參閱6.6節(jié)相關(guān)內(nèi)容了解如何使分支指令按期望的方式工作)。圖6.18正確處理load指令的流水線(xiàn)數(shù)據(jù)路徑。寫(xiě)寄存器號(hào)與寄存器數(shù)據(jù)一齊從MEM/WB流水線(xiàn)寄存器中得到。通過(guò)在最后的三個(gè)流水線(xiàn)寄存器上分別增加了位,寄存器號(hào)就能從ID流水線(xiàn)步驟一直傳送到MEM/WB流水線(xiàn)寄存器。這條新的數(shù)路徑如圖中彩色部分所示。圖6.19圖6.18中在load指令所有的五個(gè)流水線(xiàn)步中都用到的數(shù)據(jù)路徑部分。圖形化表示的流水線(xiàn)流水線(xiàn)技術(shù)比較難以理解,因?yàn)樵诿恳粋€(gè)時(shí)鐘周期內(nèi)同時(shí)會(huì)有很多

52、指令在一個(gè)數(shù)據(jù)路徑中執(zhí)行。為的幫助理解流水線(xiàn),有兩種基本的表示流水線(xiàn)的圖形化方法,即多時(shí)鐘周期的流水線(xiàn)圖(如451中的圖6.11所示)和單時(shí)鐘周期的流水線(xiàn)圖(如圖6.13到圖6.17所示)。下面我們介紹下面這個(gè)兩指令序列的兩種流水線(xiàn)圖表示方法:lw$10,20($1)sub$11,$2,$3圖6.20表示的是這些指令的多時(shí)鐘周期流水線(xiàn)圖。與437頁(yè)的圖6.1中洗衣店流水線(xiàn)表示方法類(lèi)似,時(shí)間沿著這個(gè)圖頁(yè)從左到右前進(jìn),指令從上到下前進(jìn)。沿著指令軸分別表示各流水線(xiàn)步驟,并且分別占據(jù)相應(yīng)的時(shí)鐘周期。這些格式化的數(shù)據(jù)路徑分別表示流水線(xiàn)中的五個(gè)步驟,而用一個(gè)小方塊寫(xiě)上流水線(xiàn)的名字以清楚的表達(dá)流水線(xiàn)。圖6.

53、21顯示的是一個(gè)更加傳統(tǒng)的多時(shí)鐘周期流水線(xiàn)圖的表示方法。需要提醒注意的是圖6.20中描述的是每個(gè)步驟中使用的實(shí)際資源,而圖6.21描述的則是每個(gè)步驟的名字。我們使用多時(shí)鐘周期流水線(xiàn)圖總體描述流水線(xiàn)的情況。單時(shí)鐘周期流水線(xiàn)圖表示的是在一個(gè)時(shí)鐘周期內(nèi)整個(gè)數(shù)據(jù)路徑的狀態(tài)。而所有五個(gè)在流水線(xiàn)中的指令都在各流水線(xiàn)步驟上作相應(yīng)的標(biāo)示。這中流水線(xiàn)表示圖描述了在每一個(gè)時(shí)鐘周期內(nèi)流水線(xiàn)中所發(fā)生的細(xì)節(jié)事件。通常,它使用一組單時(shí)鐘周期流水線(xiàn)圖來(lái)表示在一系列時(shí)鐘周期內(nèi)的流水線(xiàn)的操作。圖6.22到圖6.24描述了上述兩條指令的單周期流水線(xiàn)圖。當(dāng)然,這兩種表示流水線(xiàn)的方法是等價(jià)的。兩種表示方法間有一個(gè)容易混淆的方面就是圖

54、中的指令順序:在多時(shí)鐘周期流水線(xiàn)圖中最新的指令總在圖的右下方,在單始終周期流水線(xiàn)圖最新的指令總在圖的左邊。從多時(shí)鐘周期圖中抽出一個(gè)時(shí)鐘周期就表示了單時(shí)鐘周期圖中流水線(xiàn)的狀態(tài)。但從一系列的單時(shí)鐘周期流水線(xiàn)圖轉(zhuǎn)換成一個(gè)多時(shí)鐘周期流水線(xiàn)圖就困難一些。由于最新的指令必須放在最底部,因此必須把每一個(gè)單時(shí)鐘周期流水線(xiàn)圖逆時(shí)針旋轉(zhuǎn)90度,然后再把旋轉(zhuǎn)后的圖一個(gè)接一個(gè)的排列好,相鄰的圖標(biāo)志間有一個(gè)時(shí)鐘周期的偏移,從而使得每一條指令的所有五個(gè)步驟的數(shù)據(jù)路徑正好排列成占據(jù)一個(gè)水平線(xiàn)(參見(jiàn)習(xí)題6.8)。圖6.20兩條指令的多時(shí)鐘周期流水線(xiàn)圖。這種類(lèi)型的流水線(xiàn)圖在一幅圖中表示了指令集的整個(gè)執(zhí)行過(guò)程。指令從上到下按照?qǐng)?zhí)

55、行的順序被排列,時(shí)鐘周期從左向右前進(jìn)。與圖6.7流水線(xiàn)表示方法不同的是這里畫(huà)出了每一步驟中的流水線(xiàn)寄存器。圖6.21給出了這種圖的較為傳統(tǒng)的畫(huà)法。圖6.21圖6.20中兩條指令的傳統(tǒng)的多時(shí)鐘周期流水線(xiàn)圖圖6.22時(shí)鐘周期1(上圖)與時(shí)鐘周期2(下圖)的單周期流水線(xiàn)圖。這種類(lèi)型的流水線(xiàn)表示方法是每一指令在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行的快照。在本例子中只有兩條指令,因此在每個(gè)時(shí)鐘周期內(nèi)至多有兩個(gè)流水線(xiàn)步驟被標(biāo)識(shí),而在通常情況下所有五個(gè)步驟都會(huì)被占據(jù)。流水線(xiàn)數(shù)據(jù)路徑中亮度的部分表示在時(shí)鐘周期中是活動(dòng)的。在第一個(gè)時(shí)鐘周期Load指令被預(yù)取,而在第二個(gè)時(shí)鐘周期Load指令被解碼,同時(shí)subtract指令被預(yù)取。為

56、了使圖更容易理解,其它的流水線(xiàn)步驟都是空的,但在通常情況下每一個(gè)流水線(xiàn)步驟中都是有指令的。圖6.23時(shí)鐘周期3(上圖)與時(shí)鐘周期4(下圖)的單時(shí)鐘周期流水線(xiàn)圖。在上圖的第三個(gè)時(shí)鐘周期,lw指令進(jìn)入了EX階段,同時(shí)sub進(jìn)入了ID階段。在下圖的第四個(gè)時(shí)鐘周期的數(shù)據(jù)路徑中,lw進(jìn)入了MEM階段,使用在第四個(gè)時(shí)鐘周期開(kāi)始時(shí)在EX/MEM中找到的地址來(lái)讀取內(nèi)存,同時(shí)ALU執(zhí)行減法并在時(shí)鐘周期結(jié)束時(shí)將差值放入EX/MEM中。圖6.24時(shí)鐘周期5(上圖)與時(shí)鐘周期6(下圖)的單時(shí)鐘周期流水線(xiàn)圖。在時(shí)鐘周期5中,lw在把數(shù)據(jù)放入MEM/WB中的寄存器10后結(jié)束,而sub把EX/MEM中的差值放入MEM/WB

57、中。在第六個(gè)時(shí)鐘周期里,sub把MEM/WB中的差值寫(xiě)入寄存器11中。細(xì)節(jié):與單指令時(shí)不同,由于程序計(jì)數(shù)器在兩條指令之間傳遞信息,圖6.22 這一類(lèi)的圖將PC看作一個(gè)外寄存器。在指令預(yù)取階段之前或者在一條指令的寫(xiě)回階段與下一條指令的預(yù)取階段之間,你可以將PC看成是一個(gè)流水線(xiàn)寄存器。因此,和其它的流水線(xiàn)寄存器一樣,PC也被畫(huà)成一個(gè)拉長(zhǎng)了的長(zhǎng)方形。6.3流水線(xiàn)的控制在6600型計(jì)算機(jī)中,甚至以前所有的計(jì)算機(jī)中,控制系統(tǒng)都千差萬(wàn)別。James Thornton <<計(jì)算機(jī)設(shè)計(jì):控制數(shù)據(jù)6600>>,19705.2節(jié)介紹了在簡(jiǎn)單的數(shù)據(jù)路徑加入控制方法,本節(jié)我們介紹如何在流水線(xiàn)的數(shù)據(jù)路徑中加入控制。首先我們?cè)谥T多限制的條件下通過(guò)一個(gè)簡(jiǎn)單的設(shè)計(jì)方案了解流水控制,然后在6.4節(jié)到6.8節(jié)中逐步去掉這些限制進(jìn)一步展示實(shí)際情況中

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論