版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
4.8相關(guān)處理和控制機(jī)構(gòu)4.9先進(jìn)的流水技術(shù)—?jiǎng)討B(tài)調(diào)度4.10超標(biāo)量處理機(jī)和VLIW體系結(jié)構(gòu)4.11超流水處理機(jī)4.12超標(biāo)量超流水處理機(jī)習(xí)題44.1重疊解釋方式和相關(guān)處理4.1.1重疊解釋方式的提出解釋一條機(jī)器指令的那些微操作可分解成取指令、分析指令與執(zhí)行指令,從時(shí)間上看如圖4.1所示。
取指令指的是按指令計(jì)數(shù)器的內(nèi)容訪問主存,取出該指令送到指令寄存器。指令的分析指的是對(duì)指令的操作碼進(jìn)行譯碼,按尋址方式和地址字段形成操作數(shù)的有效地址,并用此有效地址去取操作數(shù)(可能訪主存,也可能訪寄存器),還要為準(zhǔn)備取下一條指令提前形成下一條指令的地址等。指令的執(zhí)行則指的是對(duì)操作數(shù)進(jìn)行運(yùn)算、處理,或存儲(chǔ)運(yùn)算結(jié)果(可能要訪主存)。
指令的解釋方式可以有順序解釋方式和重疊解釋方式。指令的順序解釋方式是指各條機(jī)器指令之間順序串行地執(zhí)行,執(zhí)行完一條指令后才取出下一條指令來執(zhí)行,而且每條機(jī)器指令內(nèi)部的各條微指令也是順序串行地執(zhí)行,如圖4.2所示。順序執(zhí)行的優(yōu)點(diǎn)是控制簡(jiǎn)單。由于下一條指令的地址是在指令解釋過程的末尾形成的,因此無論是由指令計(jì)數(shù)器加1,還是由轉(zhuǎn)移指令把轉(zhuǎn)移地址送到指令地址計(jì)數(shù)器,形成下一條指令的地址,由本條指令轉(zhuǎn)入下一條指令的時(shí)間關(guān)系都是一樣的。但由于是順序執(zhí)行的,上一步操作未完成,下一步操作就不能開始。因此,帶來的主要缺點(diǎn)是速度慢,機(jī)器各部件的利用率很低。例如,在取指令和取操作數(shù)期間,主存儲(chǔ)器是忙碌的,但是運(yùn)算器處于空閑狀態(tài)。在對(duì)操作數(shù)執(zhí)行運(yùn)算期間,運(yùn)算器是忙碌的,而主存卻是空閑的。
指令的另一種解釋方式是重疊解釋方式,在解釋第k條指令的操作完成之前,就可開始解釋第k+1條指令。顯然,重疊解釋并不能加快一條指令的實(shí)現(xiàn),但能加快相鄰兩條以至一段程序的解釋。圖4.3給出了指令的重疊解釋的方式。至于中央處理機(jī)、存儲(chǔ)器和輸入輸出設(shè)備之間的重疊操作,也是一種重疊方式,是實(shí)現(xiàn)I/O指令與其它指令的重疊。在一般的機(jī)器上,操作數(shù)和指令是混合存貯于同一主存內(nèi)的,而且主存同時(shí)只能訪問一個(gè)存貯單元。從圖4.3可以看出,重疊解釋方式需要“取指k+1”與“分析k”在時(shí)間上重疊,顯然,對(duì)于一般機(jī)器,取指需要訪問主存,分析中取操作數(shù)也可能訪問主存。如果不在硬件上花費(fèi)一定的代價(jià)解決好訪主存的沖突,就無法實(shí)現(xiàn)“取指k+1”與“分析k”的重疊。
為實(shí)現(xiàn)“取指k+1”與“分析k”的重疊對(duì)計(jì)算機(jī)組成有如下要求:
(1)讓操作數(shù)和指令分別存放于兩個(gè)獨(dú)立編址且可同時(shí)訪問的存儲(chǔ)器中;這還有利于實(shí)現(xiàn)指令的保護(hù),但這增加了主存總線控制的復(fù)雜性及軟件設(shè)計(jì)的麻煩。
(2)仍然維持指令和操作數(shù)混存,但采用多體交叉主存結(jié)構(gòu);只要第k條指令的操作數(shù)與第k+1條指令不在同一個(gè)存儲(chǔ)體內(nèi),仍可在一個(gè)主存周期(或稍許多一些時(shí)間)內(nèi)取得這兩者,從而實(shí)現(xiàn)“分析k”與“取指k+1”重疊。當(dāng)然,若這兩者正好共存于一個(gè)體時(shí)就無法重疊。(3)增設(shè)指令緩沖寄存器。設(shè)置指令緩沖寄存器就可以乘主存有空時(shí),預(yù)先把下一條或下幾條指令取出來存放在指令緩沖寄存器中。最多可預(yù)取多少條指令取決于指令緩沖寄存器的容量。這樣,“分析k”就能與“取指k+1”重疊,因?yàn)橹皇乔罢咝柙L主存取操作數(shù),而后者是從指緩取第k+1條指令。只要每次取指都可從指緩中得到,則“取指k+1”的時(shí)間很短,完全可以把這個(gè)微操作合并到“分析k+1”內(nèi),從而由原來的取指、分析、執(zhí)行重疊演變成只需“執(zhí)行k”與“分析k+1”的一次重疊,如圖4.4所示。4.1.2一次重疊工作方式從圖4.4可以看出,為了實(shí)現(xiàn)“執(zhí)行k”與“分析k+1”重疊還必須在硬件上保證有獨(dú)立的指令分析部件和指令執(zhí)行部件。在實(shí)際應(yīng)用中,“分析”和“執(zhí)行”所需的時(shí)間常常不完全一樣,在設(shè)計(jì)時(shí),應(yīng)解決好控制上的同步,保證任何時(shí)候都只是“執(zhí)行k”與“分析k+1”一次重疊。即任何時(shí)候,指令分析部件和指令執(zhí)行部件都只有相鄰兩條指令的解釋。“一次重疊”解釋方式的優(yōu)點(diǎn)為省硬件,機(jī)器內(nèi)只需要一套指令分析部件和指令執(zhí)行部件,也有助于簡(jiǎn)化控制。但缺點(diǎn)是,在實(shí)際情況中,“分析”和“執(zhí)行”所需的時(shí)間常常不完全一樣,設(shè)計(jì)時(shí)應(yīng)適當(dāng)安排好每條指令的微操作,使“分析”和“執(zhí)行”所需的時(shí)間盡可能等長,才能使重疊方式有較高的效率。如果采用多次重疊,不僅要設(shè)置多套指令分析和指令執(zhí)行部件,控制還相當(dāng)復(fù)雜。所以,重疊方式的機(jī)器大多數(shù)都采用一次重疊,若仍達(dá)不到速度要求時(shí),寧可采用后面要介紹的流水方式。
在實(shí)際設(shè)計(jì)中,為了實(shí)現(xiàn)“分析k+1”和“執(zhí)行k”的一次重疊,還需要在硬件控制上解決許多問題。先看轉(zhuǎn)移指令的處理問題。例如:第k條指令是按其執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,當(dāng)條件轉(zhuǎn)移不成功時(shí),重疊操作是有效的;但當(dāng)遇到條件轉(zhuǎn)移,并且成功轉(zhuǎn)移到第m條指令時(shí),這時(shí)與“執(zhí)行k”重疊的“分析k+1”的操作是無效的,重疊方式實(shí)際上變成了順序方式,因?yàn)樵凇皥?zhí)行k”的末尾才形成下一條要執(zhí)行指令的地址,顯然,下一條指令應(yīng)該執(zhí)行第m條指令,
即當(dāng)?shù)趍條指令在指緩內(nèi)時(shí),應(yīng)該執(zhí)行的是“分析m”,若不在,應(yīng)該執(zhí)行的是“取指m”,并且應(yīng)該是在“執(zhí)行k”結(jié)果出來之后。而“分析k+1”(包含了取指k+1)取的是第k+1條指令的內(nèi)容,這就會(huì)出錯(cuò)。圖4.5給出了執(zhí)行條件轉(zhuǎn)移時(shí)指令重疊的情況。
為了避免出錯(cuò),第k條和第k+1條指令就不能同時(shí)解釋,因此采用重疊方式的機(jī)器中應(yīng)盡量減少程序中條件轉(zhuǎn)移指令的使用,否則將會(huì)使重疊效率顯著下降。如果出現(xiàn)條件轉(zhuǎn)移指令,可以采用其它技術(shù),如延遲轉(zhuǎn)移技術(shù),使重疊效率不下降。
控制上還要解決好鄰近指令之間有可能出現(xiàn)的某種關(guān)聯(lián)。當(dāng)一段程序的鄰近指令之間出現(xiàn)某種關(guān)聯(lián)后,為了避免出錯(cuò)而使它們不能同時(shí)被解釋的現(xiàn)象稱之為“相關(guān)”。相關(guān)可以是指令相關(guān),也可以是操作數(shù)相關(guān)。指令相關(guān)是指第k條指令執(zhí)行的結(jié)果會(huì)影響第k+1條指令內(nèi)容而產(chǎn)生的關(guān)聯(lián),造成第k條指令和第k+1條指令不能同時(shí)解釋。例如,在采用VonNeumann型機(jī)器上,可通過執(zhí)行第k條指令的辦法來形成第k+1條指令:
k:存,通用寄存器號(hào),k+1功能:(通用寄存器)k+1k+1:……
由于在“執(zhí)行k”的末尾才形成第k+1條指令,按照一次重疊的時(shí)間關(guān)系,“分析k+1”所分析的是早已取進(jìn)指緩的第k+1條指令的舊內(nèi)容,這就會(huì)出錯(cuò),這種情況就是我們所說的指令相關(guān)。特別是當(dāng)指令緩沖器可緩沖存放n條指令情況下,執(zhí)行到第k條指令時(shí),與已預(yù)取進(jìn)指緩的第k+1到第k+n條指令都有可能發(fā)生指令相關(guān)。指令緩沖寄存器的容量愈大,或者說指令預(yù)處理能力愈強(qiáng)的機(jī)器發(fā)生指令相關(guān)的概率就愈高。
操作數(shù)相關(guān)是指在第k條指令和第k+1條指令的數(shù)據(jù)地址之間發(fā)生關(guān)聯(lián),而造成第k條指令和第k+1條指令不能同時(shí)解釋的現(xiàn)象。例如:第k+1條指令的源操作數(shù)地址i正好是第k條指令存放運(yùn)算結(jié)果的地址。在順序解釋時(shí),由于先由第k條指令把運(yùn)算結(jié)果存入主存i單元,而后再由第k+1條指令從i單元取出,當(dāng)然不會(huì)出錯(cuò)。但在“分析k+1”與“執(zhí)行k”重疊解釋時(shí),“分析k+1”從i單元取出的源操作數(shù)內(nèi)容成了“執(zhí)行k”存入運(yùn)算結(jié)果前的原始內(nèi)容,而不是第k條指令的運(yùn)算結(jié)果,這必然會(huì)出錯(cuò)。操作數(shù)相關(guān)不只是會(huì)發(fā)生在主存空間,還會(huì)發(fā)生在通用寄存器空間。4.1.3相關(guān)處理
1.指令相關(guān)的處理對(duì)于有指令緩沖器的機(jī)器,由于指令是提前由主存取進(jìn)指緩的,為了判定是否發(fā)生了指令相關(guān),需要進(jìn)行相當(dāng)復(fù)雜的對(duì)多條指令地址與多條指令的運(yùn)算結(jié)果地址比較,看是否有相同的。如果發(fā)現(xiàn)有指令相關(guān),還要讓已預(yù)取進(jìn)指緩中的相關(guān)指令作廢,并重取、更換指緩中的內(nèi)容,這樣做不僅操作控制復(fù)雜,而且增加了輔助操作時(shí)間,特別是要花一個(gè)主存周期去訪存重新取指,必然會(huì)帶來時(shí)間損失。
因?yàn)榭赡鼙恍薷牡闹噶钍且浴皥?zhí)行”指令的操作數(shù)形式出現(xiàn),并存于第k+1條指令的物理地址,而下一條指令又是從該地址取出來的,而指令代碼本身就是數(shù)據(jù),因此指令相關(guān)實(shí)際上就轉(zhuǎn)化成了操作數(shù)相關(guān),統(tǒng)一用處理操作數(shù)相關(guān)的方法來解決,從而在程序中就不會(huì)發(fā)生指令相關(guān)了。
實(shí)際上操作數(shù)可能存放于主存,也可能存放于通用寄存器中,因此就有主存空間數(shù)相關(guān)和通用寄存器組數(shù)相關(guān)。一般的機(jī)器中,通用寄存器還可以存放變址值,而變址值是在“分析”的前半時(shí)間為形成操作數(shù)地址時(shí)所要用到的,它必須在分析時(shí)間段的一開始就要訪問變址寄存器。這樣,若在第k條指令“執(zhí)行”的末尾形成的結(jié)果正好是第k+1條指令“分析”時(shí)所要用的變址值時(shí),還會(huì)發(fā)生通用寄存器組的變址值相關(guān)。2.主存空間數(shù)相關(guān)的處理主存空間數(shù)相關(guān)是指相鄰兩條指令之間出現(xiàn)要求對(duì)主存同一單元先寫入而后再讀出的關(guān)聯(lián)。如果讓“執(zhí)行k”與“分析k+1”在時(shí)間上重疊,就會(huì)使“分析k+1”讀出的操作數(shù)不是程序要求的第k條指令執(zhí)行完后應(yīng)當(dāng)寫入的結(jié)果,而造成錯(cuò)誤。如圖4.6所示。主存空間數(shù)相關(guān)的處理方法通常采用推后第k+1條指令的讀操作數(shù)。
具體方法是由存控通過給讀數(shù)、寫數(shù)申請(qǐng)安排不同的訪存優(yōu)先級(jí)來解決。通常很多機(jī)器都將訪存優(yōu)先級(jí)依次定為通道申請(qǐng)、寫數(shù)、讀數(shù)、取指令。這樣,當(dāng)?shù)趉條和k+1條指令出現(xiàn)主存空間數(shù)相關(guān)時(shí),“執(zhí)行k”與“分析k+1”同時(shí)對(duì)主存同一個(gè)單元發(fā)出訪存申請(qǐng),但因“寫數(shù)”級(jí)別高于“讀數(shù)”,存控先處理“執(zhí)行k”的寫數(shù),“分析k+1”的讀數(shù)申請(qǐng)必然只能推遲到下一個(gè)主存周期才有可能被處理,從而就自動(dòng)實(shí)現(xiàn)了推后“分析k+1”的讀,不用處理機(jī)另外采取措施。如圖4.7所示。3.通用寄存器組相關(guān)的處理通用寄存器既可存放操作數(shù)、運(yùn)算結(jié)果,也可以存放變址值,但是在指令解釋過程中,使用通用寄存器作為不同用途所需的有關(guān)微操作時(shí)間要求是不相同的。存放于通用寄存器中的基址或變址值一般總是在“分析”周期的前半段就要取出來用;而操作數(shù)則是在“分析”周期的后半段取出,到“執(zhí)行”周期的前半段才用得上;運(yùn)算結(jié)果卻是在“執(zhí)行”周期的末尾才形成,并送入通用寄存器中。
圖4.8給出了它們之間的時(shí)間關(guān)系。正是因?yàn)樗鼈兊臅r(shí)間要求不同,所以通用寄存器數(shù)相關(guān)和通用寄存器變址值相關(guān)的情況及其處理方法不相同。設(shè)機(jī)器的基本指令格式如圖4.9所示。L1、L3分別指示存放第一操作數(shù)和運(yùn)算結(jié)果的通用寄存器號(hào),B2為形成第二操作數(shù)地址的基址值所在通用寄存器號(hào),d2為相對(duì)位移量。
設(shè)機(jī)器的基本指令格式如圖4.9所示。L1、L3分別指示存放第一操作數(shù)和運(yùn)算結(jié)果的通用寄存器號(hào),B2為形成第二操作數(shù)地址的基址值所在通用寄存器號(hào),d2為相對(duì)位移量。(1)通用寄存器組數(shù)相關(guān)的情況和處理辦法假設(shè)某臺(tái)機(jī)器正常情況下,“分析”和“執(zhí)行”的周期與主存周期一樣都是4拍。有些指令需要從通用寄存器組中取兩個(gè)操作數(shù)(L1)和(L2),若通用寄存器組做在一個(gè)片子上,每次只能讀出一個(gè)數(shù),則在“分析k+1”期間,操作數(shù)(L1)和(L2)就需要在不同拍時(shí)取得,分別送入運(yùn)算器的B和C寄存器,以便在“執(zhí)行k+1”時(shí)供運(yùn)算用。這樣“執(zhí)行k”與“分析k+1”間通用寄存器組的時(shí)間關(guān)系如圖4.10所示。當(dāng)程序執(zhí)行過程中出現(xiàn)L1(k+1)=L3(k)時(shí)就發(fā)生了L1相關(guān);而當(dāng)L2(k+1)=L3(k)時(shí)就發(fā)生了L2相關(guān)。
當(dāng)程序執(zhí)行過程中出現(xiàn)要解決通用寄存器組數(shù)相關(guān)的情況,主要有以下兩種方法:①與前述處理主存空間數(shù)相關(guān)的一樣,推后“分析k+1”的讀(寄存器的內(nèi)容)。具體有兩種不同的方法:可以把“分析k+1”推后到“執(zhí)行k”結(jié)束時(shí)開始,也可以只要推后到“執(zhí)行k”把結(jié)果送入L3,然后再由“分析k+1”在?。↙1)或(L2)時(shí)能取到就可以了。采用前一種推后的辦法,只要發(fā)生數(shù)相關(guān)就使一次重疊變成了完全的順序串行,速度明顯下降;后一種推后的方法則是發(fā)生數(shù)相關(guān)時(shí),相鄰兩條指令的解釋仍有部分重疊,可以減少速度損失,但控制要稍微復(fù)雜一些。
這兩種方法都是靠推后讀,犧牲速度來避免相關(guān)時(shí)出錯(cuò)。那么能否在不降低速度的情況下仍然能保證數(shù)相關(guān)時(shí)的正確處理呢?②在運(yùn)算器的輸出到B、C輸入之間增設(shè)一條“相關(guān)專用通路”,如圖4.11所示,則在發(fā)生L1或L2相關(guān)時(shí),讓相關(guān)專用通路接通,就可以在“執(zhí)行k”時(shí)將運(yùn)算結(jié)果送入通用寄存器以在完成其應(yīng)有的功能的同時(shí),直接將運(yùn)算結(jié)果回送到B或C寄存器,從而大大縮短了其間的傳送時(shí)間,并能保證當(dāng)“執(zhí)行k+1”需要用此操作數(shù)時(shí),它已在B或C寄存器中準(zhǔn)備好了。
也就是說,盡管原先將通用寄存器的舊內(nèi)容經(jīng)數(shù)據(jù)總線分別在“分析k+1”的第3拍或第4拍末送入了操作數(shù)寄存器B或C中,但之后經(jīng)相關(guān)專用通路在“執(zhí)行k+1”真正用它之前,操作數(shù)寄存器B或C重新獲得第k條指令送來的新結(jié)果。這樣,既保證了相關(guān)時(shí)不用推后“分析k+1”,重疊效率不下降,又可以保證指令重疊解釋時(shí)數(shù)據(jù)不出錯(cuò)。
推后“分析k+1”和設(shè)置“相關(guān)專用通路”是解決重疊方式相關(guān)處理的兩種基本方法。兩者的主要區(qū)別為前者是以降低速度為代價(jià),使設(shè)備基本上不增加,后者是以增加設(shè)備為代價(jià),使重疊效率不下降。“相關(guān)專用通路”法照樣可用于解決前述的主存空間數(shù)相關(guān),但由于主存空間數(shù)相關(guān)的出現(xiàn)概率比通用寄存器組數(shù)相關(guān)的出現(xiàn)概率低得多,所以,主存數(shù)相關(guān)不采用“相關(guān)專用通路”法,而只采用推后讀來解決。(2)通用寄存器組基址值或變址值相關(guān)的情況及其處理辦法在采用基址尋址時(shí),操作數(shù)的有效地址為:(Xd)+(B2)·(B2≠0000)+d2,由分析器內(nèi)的地址加法器形成。由于通常情況下,“分析”周期等于主存周期,所以,從時(shí)間關(guān)系上要求在“分析”周期的前半段,就能由通用寄存器輸出總線取得(B2),送入地址加法器。
由于運(yùn)算結(jié)果是在“分析”周期的末尾才送入通用寄存器組的,它當(dāng)然不能立即出現(xiàn)在通用寄存器輸出總線上。也就是說,在“執(zhí)行k”得到的、送入通用寄存器的運(yùn)算結(jié)果來不及作為“分析k+2”的基址值用,更不用說作為“執(zhí)行k+1”的基址值用。因此,雖然是一次重疊,但基址值相關(guān)(B相關(guān))就不止會(huì)出現(xiàn)一次相關(guān),還會(huì)出現(xiàn)二次相關(guān)。即當(dāng)出現(xiàn)B(k+1)=L3(k)
時(shí),稱為發(fā)生了B一次相關(guān);而當(dāng)出現(xiàn)B(k+2)=L3(k)時(shí),稱為發(fā)生了B二次相關(guān)。這里所謂的一次和二次指的是相關(guān)指令相隔的指令條數(shù)。
對(duì)于基址值相關(guān),其解決辦法同數(shù)相關(guān)的一樣,也可有推后分析(讀基址寄存器的內(nèi)容)和設(shè)置相關(guān)專用通路兩種。變址值相關(guān)與基址值相關(guān)類似,處理方法也一樣。①推后分析的方法。由圖4.12可看出,對(duì)于B二次相關(guān),只需推后“分析k+2”的始點(diǎn),使“執(zhí)行k”送入通用寄存器的運(yùn)算結(jié)果,在“分析k+2”開始時(shí)已出現(xiàn)于通用寄存器的輸出總線上,如圖4.13(a)所示。而對(duì)B一次相關(guān),則除此之外,還需要推后一個(gè)“執(zhí)行”周期,如圖4.13(b)所示。②設(shè)置相關(guān)專用通路的方法。由于B一次、二次相關(guān)的概率并不很低,增設(shè)B相關(guān)專用通路還是值得的,其辦法如圖4.14所示。這樣,在B二次相關(guān)時(shí),就可把“執(zhí)行k”得到的運(yùn)算結(jié)果,在送入通用寄存器組的同時(shí),經(jīng)“B相關(guān)專用通路”直接送到“訪存操作數(shù)地址”形成機(jī)構(gòu),由于縮短了其間的傳送延遲,使得不必推后“分析k+2”,就能保證使用正確的基址值。同理,在B一次相關(guān)時(shí),只需使“分析k+1”推后到接著“執(zhí)行k”進(jìn)行就可以了。
綜上所述,實(shí)現(xiàn)在時(shí)間上的重疊,(1)需要付出空間代價(jià);如增設(shè)數(shù)據(jù)總線和控制總線、指令緩沖器、地址加法器、相關(guān)專用通路等,需將指令分析部件和指令執(zhí)行部件分開、單獨(dú)設(shè)置,需將主存采用多體交叉存取等等。(2)要處理好這二條指令之間可能存在的關(guān)聯(lián)。如轉(zhuǎn)移的處理以及指令相關(guān)、主存空間數(shù)相關(guān)、通用寄存器組的數(shù)相關(guān)和在址/變址值相關(guān)等的處理。相關(guān)處理的辦法無非是“推后讀”和設(shè)置相關(guān)專用通路兩種,應(yīng)當(dāng)根據(jù)Huffman概念在成本和效率上加以權(quán)衡選用。(3)還應(yīng)合理安排調(diào)配好機(jī)器每條指令的微操作,使“分析”和“執(zhí)行”所需的時(shí)間盡可能匹配,以提高重疊的效率。4.2流水線的工作原理
如果CPU用一次重疊方式解釋指令仍達(dá)不到所要求的速度性能時(shí),可以考慮同時(shí)解釋多條指令。其中最常用的是流水方式,它是通過并行硬件來改善性能的最普通的手段。在60年代,硬件的價(jià)格相對(duì)較高,流水線計(jì)算機(jī)都是巨型機(jī)。IBM的STRETCH和CDC的6600就是60年代早期大量應(yīng)用流水線的兩種機(jī)器,它們對(duì)后來巨型機(jī)的結(jié)構(gòu)產(chǎn)生了深刻的影響。
到了80年代,技術(shù)的進(jìn)步使硬件價(jià)格大幅度下降,使流水線技術(shù)能在各種類型的計(jì)算機(jī)上得到應(yīng)用。例如,Intel8086微處理機(jī)雖然價(jià)格十分低廉,也能在芯片執(zhí)行運(yùn)算的同時(shí)應(yīng)用流水線技術(shù)訪問存儲(chǔ)器。而發(fā)展到Pentium系列CPU產(chǎn)品的時(shí)候,更是一個(gè)高級(jí)的超標(biāo)量處理器??梢哉f,計(jì)算機(jī)發(fā)展到現(xiàn)在,流水技術(shù)已經(jīng)成為各類機(jī)器普遍采用的、用來改善性能的基本手段。
計(jì)算機(jī)的流水技術(shù)是如何工作的呢?流水技術(shù)的基本思想在馮·諾依曼的第一臺(tái)存儲(chǔ)程序計(jì)算機(jī)中已經(jīng)提出。流水技術(shù)早已應(yīng)用于社會(huì)生產(chǎn)與活動(dòng)的各個(gè)方面,并不是計(jì)算機(jī)所特有的。其主要特點(diǎn)是在一個(gè)任務(wù)完成以前就可以開始一個(gè)新的任務(wù)。先看一次重疊的情況,“執(zhí)行k”與“分析k+1”的一次重疊是把一條指令的解釋過程分解成“分析”與“執(zhí)行”兩個(gè)子過程,分別在獨(dú)立的分析部件和執(zhí)行部件上進(jìn)行。因此,不必等一條指令的“分析”、“執(zhí)行”子過程都完成才送入下條指令,而是分析部件在完成一條指令的“分析”子過程時(shí),就可開始下一條指令的“分析”子過程。
若“分析”與“執(zhí)行”子過程都需要Δt的時(shí)間,如圖4.15所示,就一條指令的解釋來看,需要2Δt才能完成,但從機(jī)器的輸出來看,每隔Δt就能完成一條指令的解釋。也就意味著,一次重疊解釋比起指令的串行解釋,可使機(jī)器的最大吞吐率提高一倍。這里的最大吞吐率是指當(dāng)流水線正常滿負(fù)荷工作時(shí),單位時(shí)間內(nèi)機(jī)器所能處理的最多指令條數(shù)或機(jī)器能輸出的最多結(jié)果數(shù)。若將指令的分析和執(zhí)行部分進(jìn)一步細(xì)分成一些子過程,并改進(jìn)相應(yīng)硬件的結(jié)構(gòu),使得子過程分別由獨(dú)立的子部件實(shí)現(xiàn),形成流水處理的方式,其最大吞吐率可進(jìn)一步提高,如圖4.16的流水處理過程和相應(yīng)的時(shí)-空?qǐng)D。
如圖4.16(a)所示,把“分析”子過程再細(xì)分成“取指令”、“指令譯碼”和“取操作數(shù)”3個(gè)子過程,并改進(jìn)運(yùn)算器的結(jié)構(gòu)以加快其“執(zhí)行”子過程,這4個(gè)子過程分別由獨(dú)立的子部件實(shí)現(xiàn),讓經(jīng)過各子部件的時(shí)間都相同,用Δt1表示,則指令解釋的時(shí)間-空間關(guān)系如圖4.16(b)所示。一條指令從進(jìn)入流水線到結(jié)果流出需經(jīng)歷“取指令”、“指令譯碼”、“取操作數(shù)”和“執(zhí)行”4個(gè)子過程,每個(gè)子過程需要Δt1的時(shí)間,一條指令的解釋需要4Δt1的時(shí)間完成。
當(dāng)?shù)?條指令完成“取指令”子過程時(shí),就可以開始第2條指令的“取指令”子過程;當(dāng)?shù)?條指令完成“指令譯碼”子過程而進(jìn)入“取操作數(shù)”子過程時(shí),可以開始第2條指令的“指令譯碼”子過程,同時(shí),第2條指令的“取指令”子過程結(jié)束,可以開始第3條指令的“取指令”子過程;依此類推,當(dāng)?shù)?條指令進(jìn)入“執(zhí)行”子過程時(shí),第2條指令可進(jìn)入“取操作數(shù)”子過程,第3條指令可進(jìn)入“指令譯碼”子過程,第4條指令可進(jìn)入“取指令”子過程。顯然,圖4.16(b)中的流水線可同時(shí)解釋4條指令。
如果完成一條指令的時(shí)間為T,則對(duì)于分解為“分析”和“執(zhí)行”兩個(gè)子過程的,其T=2Δt,而對(duì)于分解為“取指令”、“指令譯碼”、“取操作數(shù)”和“執(zhí)行”4個(gè)子過程的,其T=4Δt1。這樣,雖然完成一條指令所需時(shí)間仍是T,對(duì)于順序解釋方式,每隔T由處理機(jī)“流出”一個(gè)結(jié)果;但對(duì)圖4.15的重疊方式是每隔T/2(即每隔Δt)就可由處理機(jī)“流出”一個(gè)結(jié)果,吞吐率提高了一倍;而對(duì)圖4.16的流水方式是每隔T/4(即每隔Δt1)“流出”一個(gè)結(jié)果,即吞吐率比順序方式提高了三倍。
流水處理帶來的好處是顯而易見的,以圖4.16為例,若進(jìn)入流水線的指令數(shù)為6,則其從第1條指令流入流水線,到最后一條指令的結(jié)果流出,使用的時(shí)間是9Δt1,即9T/4的時(shí)間;如果是順序執(zhí)行,則需要6T的時(shí)間,從一組指令序列的執(zhí)行速度來看,采用流水解釋方式的機(jī)器的速度要比順序解釋方式的機(jī)器快得多?!傲魉痹诟拍钌吓c“重疊”沒有什么差別,可以看成是“重疊”的進(jìn)一步引伸。兩者的差別只在于“一次重疊”只是把一條指令的解釋分解為兩個(gè)子過程,而“流水”則是分解成更多個(gè)子過程。前者同時(shí)解釋兩條指令,后者可同時(shí)解釋多條指令。例如圖4.16的流水處理過程可同時(shí)解釋4條指令。如果能把一條指令的解釋分解成時(shí)間相等的N個(gè)子過程,則每隔Δt=T/N就可以處理一條指令。如圖4.17所示,這意味著,流水線的最大吞吐率是取決于子過程所經(jīng)過的時(shí)間Δt,Δt越小,流水線的最大吞吐率就越高。
如果流入流水線的指令數(shù)為6,則從第1條指令流入,到第6條指令的結(jié)果流出,所需要的時(shí)間為(NΔt+5Δt)。如果流入流水線的指令數(shù)是X,則從第1個(gè)指令流入,到第X條指令的結(jié)果流出,所需要的時(shí)間為(NΔt+(X-1)Δt)。設(shè)流水線對(duì)一條指令的解釋可以細(xì)分為n個(gè)子過程,每個(gè)子過程處理的時(shí)間均為Δt,若有m條指令進(jìn)入該流水線,則從第1條指令流入,到第m條指令的結(jié)果流出所需要的時(shí)間定義為Tm,則有:
從第1條指令流入流水線開始,到最后一個(gè)結(jié)果流出的這一段時(shí)間內(nèi),每隔Δt流出一個(gè)結(jié)果。應(yīng)該注意的是,只有當(dāng)流水線正常滿負(fù)荷流動(dòng)時(shí),才會(huì)每隔Δt流出一個(gè)結(jié)果。流水線從開始啟動(dòng)工作到流出第一個(gè)結(jié)果,需要經(jīng)過一段流水線的建立時(shí)間,在這段時(shí)間里流水線并沒流出任何結(jié)果。
在計(jì)算機(jī)實(shí)際的流水線中,各子部件經(jīng)過的時(shí)間會(huì)有差異。為解決這些子部件處理速度的差異,一般在子部件之間需設(shè)置高速接口鎖存器。所有鎖存器都受同一時(shí)鐘信號(hào)控制來實(shí)現(xiàn)各子部件信息流的同步推進(jìn)。時(shí)鐘信號(hào)周期不得低于速度最慢子部件的經(jīng)過時(shí)間與鎖存器的存取時(shí)間之和,還要考慮時(shí)鐘信號(hào)到各鎖存器可能存在時(shí)延差。所以,子過程的細(xì)分,會(huì)因鎖存器數(shù)增多而增大指令或指令流過流水線的時(shí)間,這在一定程度上會(huì)抵消子過程細(xì)分而使流水線吞吐率得到提高的好處。4.3流水線的特點(diǎn)
在流水技術(shù)中,一般有如下特點(diǎn):一條流水線通常由多個(gè)流水段組成;各個(gè)流水段分別承擔(dān)不同的工作,也可以把這些流水段看作功能部件。如在圖4.16(a)中,流水段由四部分組成,依次是“取指令”、“指令譯碼”、“取操作數(shù)”和“執(zhí)行”4個(gè)功能段。在實(shí)際機(jī)器中,一條流水線的功能部件按完成的任務(wù)及采用的設(shè)計(jì)思想不同,其數(shù)目也各不相同。
例如,80486、Pentium的流水線設(shè)計(jì)為5段,PentiumIII的流水線設(shè)計(jì)為10段,AMDAthlon的流水線有11段,PentiumIV的流水線達(dá)到了20段,MIPS的R4000有8個(gè)流水段,DEC的Alpha21064處理機(jī)共有三條指令流水線,整數(shù)操作流水線和訪問存儲(chǔ)器流水線分為7個(gè)流水段,而浮點(diǎn)操作流水線分為10個(gè)流水段。每個(gè)流水段有專門的功能部件對(duì)指令進(jìn)行某種加工;例如,80486的流水線分為5段,分別為“取指令”、“譯碼段1”、“譯碼段2”、“執(zhí)行”和“寫回”。在譯碼段1完成所有的操作碼和尋址方式的譯碼工作。而在譯碼段2則將每個(gè)操作碼擴(kuò)展成對(duì)ALU的控制信號(hào)。在執(zhí)行段則要完成ALU運(yùn)算、Cache訪問和寄存器修改。
各流水段所需的時(shí)間是一樣的;在設(shè)計(jì)流水線的控制線路及計(jì)算流水線的性能時(shí)會(huì)帶來方便,簡(jiǎn)化了設(shè)計(jì)。但在實(shí)際機(jī)器中,各流水段所需的時(shí)間很難保證一致。流水線工作階段可分為建立、滿載和排空三個(gè)階段。從第一個(gè)任務(wù)進(jìn)入流水線到流水線所有的部件都處于工作狀態(tài)的這一個(gè)時(shí)期,稱為流水線的建立階段。當(dāng)所有部件都處于工作狀態(tài)時(shí),稱為流水線的滿載階段。從最后一條指令流入流水線到結(jié)果流出,稱為流水線的排空階段。在理想情況下,當(dāng)流水線充滿后,每隔Δt時(shí)間將會(huì)有一個(gè)結(jié)果流出流水線。4.4流水線的分類
從不同的角度,可對(duì)流水線進(jìn)行不同的分類。
4.4.1根據(jù)向下擴(kuò)展和向上擴(kuò)展的思想分類依據(jù)向下擴(kuò)展和向上擴(kuò)展的思想,可分類出在計(jì)算機(jī)系統(tǒng)不同等級(jí)上使用的流水線。向下擴(kuò)展是指把子過程進(jìn)一步向下細(xì)分,讓每個(gè)子過程經(jīng)過的時(shí)間都同等程度地減少,吞吐率就會(huì)進(jìn)一步提高。如把圖4.15中的“分析”子過程細(xì)分為“取指令”、“指令譯碼”和“取操作數(shù)”3個(gè)子過程。
在機(jī)器中“執(zhí)行”子過程會(huì)因指令不同,執(zhí)行時(shí)間不同,而使細(xì)分的情形不同。如浮點(diǎn)加法可進(jìn)一步細(xì)分成為“求階差”、“對(duì)階”、“尾數(shù)相加”和“規(guī)格化”4個(gè)子過程,如圖4.18所示。
子過程的進(jìn)一步細(xì)分是以增加設(shè)備為代價(jià)的。例如,“求階差”和“尾數(shù)相加”都要用到加法器,為此需要分別設(shè)置階碼加法器和尾數(shù)加法器?!皩?duì)階”和“規(guī)格化”都要用到移位也就需要分別設(shè)置兩套移位器。設(shè)備的增加不僅會(huì)使成本增加,也使控制變得復(fù)雜。但它比起完全靠重復(fù)設(shè)置多套分析部件和執(zhí)行部件來提高指令并行性,其設(shè)備量的增加畢竟要少得多。子過程細(xì)分并不是無止境的,因?yàn)榧?jí)間緩沖器數(shù)的增多,使成本提高,輔助延時(shí)增大,控制復(fù)雜,電路設(shè)計(jì)和實(shí)現(xiàn)困難等,抵消了子過程細(xì)分帶來的好處。PentiumIII的流水線設(shè)計(jì)為10段,AMDAthlon的流水線有11段,PentiumIV的流水線達(dá)到了20段,PentiumIV的Willamette版本在運(yùn)行一些測(cè)試程序時(shí),其性能比相同時(shí)鐘頻率PentiumIII及AMDAthlon要低10%~20%。但是子過程的細(xì)分可以在相同設(shè)計(jì)條件和生產(chǎn)工藝下提高芯片的時(shí)鐘頻率,PentiumIII處理器擁有10級(jí)的流水線設(shè)計(jì),其頻率很難超過1GHz;而PentiumIV處理器采用了20級(jí)的流水線,其頻率已經(jīng)突破3GHz。
流水的向上擴(kuò)展可理解為在多個(gè)處理機(jī)之間進(jìn)行流水。如圖4.19所示。多個(gè)處理機(jī)串行地對(duì)數(shù)據(jù)集進(jìn)行處理,某個(gè)處理機(jī)專門完成其中的一個(gè)任務(wù)。因?yàn)楦鱾€(gè)處理機(jī)都在同時(shí)工作,所以能對(duì)多個(gè)不同的數(shù)據(jù)集流水地處理,使計(jì)算機(jī)系統(tǒng)處理能力有較大的提高。
綜上所述,按流水處理的級(jí)別不同,可以把流水線分為部件級(jí)、處理機(jī)級(jí)和系統(tǒng)級(jí)的流水。部件級(jí)流水是指構(gòu)成部件內(nèi)的各個(gè)子部件之間的流水,如運(yùn)算器內(nèi)浮點(diǎn)加法流水線及Cache和多體交叉主存的流水。處理機(jī)級(jí)流水是指構(gòu)成處理機(jī)的各個(gè)部件的流水,如“取指”、“分析”、“執(zhí)行”間的流水。系統(tǒng)級(jí)流水是指構(gòu)成計(jì)算機(jī)系統(tǒng)的多個(gè)處理機(jī)之間的流水,也稱為宏流水。4.4.2按流水線功能的多少分類按流水線具有功能的多少來劃分,可以分為單功能流水線和多功能流水線。單功能流水線是指只能完成一種固定功能的流水線。Cray-1計(jì)算機(jī)中有12條單功能流水線,分別為:地址加、地址乘、標(biāo)量加、標(biāo)量移位、標(biāo)量邏輯運(yùn)算、標(biāo)量加1計(jì)數(shù)、向量加、向量移位、向量邏輯運(yùn)算、浮點(diǎn)加、浮點(diǎn)乘、浮點(diǎn)迭代求倒數(shù);Pentium有一條5段的定點(diǎn)和一條8段的浮點(diǎn)流水線;PentiumⅢ有三條指令流水線,其中兩條定點(diǎn)指令流水線,一條浮點(diǎn)指令流水線,其流水線的功能段為10個(gè)。
多功能流水線是指同一流水線的各個(gè)段之間可以有多種不同的聯(lián)接方式以實(shí)現(xiàn)多種不同的運(yùn)算或功能。例如美國Texas公司的ASC計(jì)算機(jī)運(yùn)算器的流水線就是多功能的,它有8個(gè)可并行工作的獨(dú)立功能段,能夠?qū)崿F(xiàn):定點(diǎn)加減法、定點(diǎn)乘法、浮點(diǎn)加減法、浮點(diǎn)乘法、邏輯運(yùn)算、移位操作、數(shù)據(jù)轉(zhuǎn)換、向量運(yùn)算等。
如圖4.20所示,TI-ASC機(jī)器要進(jìn)行浮點(diǎn)加、減法時(shí),其流水線功能段的聯(lián)接如圖4.20(b)所示;而要進(jìn)行定點(diǎn)乘法運(yùn)算時(shí),其流水線功能段的聯(lián)接如圖4.20(c)所示。除此之外,它還可以根據(jù)運(yùn)算的要求來實(shí)現(xiàn)多種不同的聯(lián)接。4.4.3按流水線的工作方式分類按多功能流水線的各段能否允許同時(shí)用于多種不同功能聯(lián)接流水,可把流水線分為靜態(tài)流水線和動(dòng)態(tài)流水線。靜態(tài)流水線是指在同一時(shí)間內(nèi),多功能流水線中的各個(gè)功能段只能按一種功能的聯(lián)接方式工作。就指令級(jí)流水而言,僅當(dāng)流入的是一串相同運(yùn)算的指令時(shí),才能發(fā)揮出靜態(tài)流水線的效能。若進(jìn)入的是浮加、定乘、浮加、定乘……這樣一串不同指令相間時(shí),靜態(tài)流水線的效能會(huì)降低到比順序方式的還要差。
因此,在靜態(tài)流水線機(jī)器中,要求程序員編制出(或是編譯程序生成)的程序應(yīng)盡可能調(diào)整成有更多相同運(yùn)算的指令串,以提高其流水的效能。以TI-ASC機(jī)器的流水線為例,如果先執(zhí)行n條浮點(diǎn)加法指令,再執(zhí)行m條定點(diǎn)乘法指令,其時(shí)-空?qǐng)D如圖4.21所示。
而動(dòng)態(tài)流水線是指在同一時(shí)間內(nèi),多功能流水線中的各個(gè)功能段可按不同運(yùn)算或功能的聯(lián)接方式工作。如圖4.22所示,在同一時(shí)間段內(nèi),某些段按浮點(diǎn)加法聯(lián)接,而另一些段按定點(diǎn)乘法聯(lián)接。這樣做的好處在于,不要求流入流水線的指令串有相同的功能也能提高流水的吞吐率和設(shè)備的利用率。
從圖4.21和圖4.22比較,靜態(tài)流水線與動(dòng)態(tài)流水線的差別在于:對(duì)于相同的一串運(yùn)算功能不同的指令而言,動(dòng)態(tài)流水線的吞吐率和設(shè)備利用率比靜態(tài)流水線的高;由于在同一時(shí)間內(nèi),可以通過不同的聯(lián)接實(shí)現(xiàn)不同的運(yùn)算,故動(dòng)態(tài)流水線的控制比靜態(tài)流水線要復(fù)雜,需增加相應(yīng)硬件,故成本比靜態(tài)流水線的高;從軟、硬件功能分配的觀點(diǎn)上看,靜態(tài)流水線把功能負(fù)擔(dān)較多地加到軟件上,以簡(jiǎn)化硬件控制,而動(dòng)態(tài)流水線則把功能負(fù)擔(dān)較多地加在硬件控制上,以提高流水的效能。4.4.4按流水線的連接方式分類根據(jù)流水線中各功能段之間是否有反饋回路,可把流水線分為線性流水線和非線性流水線。若流水線各段串行聯(lián)接,沒有反饋回路,各個(gè)段只經(jīng)過一次的,稱為線性流水線。而如果流水線中除有串行聯(lián)接的通路外,有某種反饋回路,使一個(gè)任務(wù)流經(jīng)流水線時(shí),需多次經(jīng)過某個(gè)段或越過某些段,則稱之為非線性流水線。在非線性流水線中,一個(gè)重要的問題是確定什么時(shí)候向流水線送入新的任務(wù),使此任務(wù)流經(jīng)流水線各段時(shí)不會(huì)與先進(jìn)入的任務(wù)爭(zhēng)用流水段。這個(gè)問題將在本章4.7節(jié)中討論。4.5線性流水線性能分析
衡量流水線處理機(jī)性能的指標(biāo)主要是吞吐率和效率,本節(jié)將以線性流水線為例討論流水線處理機(jī)的性能。
4.5.1吞吐率和加速比
1.吞吐率(throughputrate)
吞吐率指單位時(shí)間內(nèi)流水線能處理的指令條數(shù)或能輸出的數(shù)據(jù)量。吞吐率越高,計(jì)算機(jī)系統(tǒng)的處理能力就越強(qiáng)。對(duì)流水線而言,吞吐率就是單位時(shí)間內(nèi)能流出的任務(wù)數(shù)或能流出的結(jié)果數(shù)。(1)最大吞吐率最大吞吐率是指在流水線正常滿負(fù)荷工作時(shí),單位時(shí)間內(nèi)機(jī)器所能處理的最多指令條數(shù)或機(jī)器能輸出的最多結(jié)果數(shù)。由于指令的取指和執(zhí)行過程中的各個(gè)子過程所需的時(shí)間不同,為了避免各段之間經(jīng)過時(shí)間不匹配,也為了保證各段之間數(shù)據(jù)通路寬度上能匹配,通常都要在各子過程之間插入一個(gè)鎖存器,這些鎖存器都受同一個(gè)時(shí)鐘脈沖的控制,從而達(dá)到同步。如果指令的解釋細(xì)分為n個(gè)子過程,且各個(gè)子過程所需的時(shí)間分別為Δt1、Δt2、Δt3、…、Δtn,時(shí)鐘周期應(yīng)當(dāng)為max{Δt1、Δt2、Δt3、…、Δtn},對(duì)應(yīng)于流水線的最大吞吐率為:
由此可以看出,流水線的最大吞吐率取決于最慢子過程所需要的時(shí)間,我們把流水線中經(jīng)過時(shí)間最長的子過程稱為“瓶頸”子過程。(4.1)
如圖4.23(a)所示,有一個(gè)4段的指令流水線,其中A、C、D段經(jīng)過的時(shí)間均為Δt,而B段的處理時(shí)間需要3Δt,則B段就是該指令流水線的瓶頸。根據(jù)流水線的最大吞吐率公式,其最大吞吐率TPmax=1/(3Δt),即流水線滿負(fù)荷工作時(shí),只能每隔3Δt才解釋完一條指令,每隔3Δt才能流出一個(gè)結(jié)果。其時(shí)-空?qǐng)D如圖4.23(b)所示。
顯然,流水線的最大吞吐率受限于瓶頸子過程,要提高流水線的最大吞吐率,應(yīng)當(dāng)設(shè)法消除此瓶頸子過程。消除瓶頸的一種辦法是將瓶頸子過程再細(xì)分。如對(duì)圖4.23(a)的B段進(jìn)一步進(jìn)行細(xì)分,將其再細(xì)分為三個(gè)段B1、B2和B3,并且每個(gè)段的處理時(shí)間都是Δt,這樣,該指令流水線的最大吞吐率就變成1/Δt。如圖4.24所示。并不是所有子過程都可以進(jìn)一步細(xì)分,如對(duì)圖4.23(a)中的B段如果不能進(jìn)一步細(xì)分,可以采用消除瓶頸的另一種辦法,即重復(fù)設(shè)置多套瓶頸段并聯(lián),讓它們交叉進(jìn)行。
對(duì)于圖4.23(a)所示的問題,則可以采用三套B段并聯(lián),分別以BS1、BS2、BS3命名,每隔Δt輪流給一個(gè)瓶頸段分配任務(wù),使它們?nèi)钥擅扛籀解釋完一條指令。如圖4.25所示,其流水線的最大吞吐率也是1/Δt。這種辦法需要解決好在各并行子過程之間的任務(wù)分配和同步控制,比起瓶頸子過程再細(xì)分控制要復(fù)雜、設(shè)備量要多些。(2)實(shí)際吞吐率流水線的實(shí)際吞吐率用TP表示,是指從啟動(dòng)流水線處理機(jī)開始到流水線操作結(jié)束,單位時(shí)間內(nèi)能流出的任務(wù)數(shù)或能流出的結(jié)果數(shù)。前面的分析都是在流水線連續(xù)流動(dòng)時(shí)能達(dá)到的最大吞吐率。實(shí)際上,流水開始時(shí)總要有一段建立時(shí)間,此外還常常會(huì)由于各種原因,如功能部件沖突等使流水線無法連續(xù)流動(dòng),不得不流一段時(shí)間,停一段時(shí)間,因此實(shí)際吞吐率TP總是小于最大吞吐率TPmax。
設(shè)指令流水線由m段組成,如圖4.26所示,且各段經(jīng)過的時(shí)間均為Δt,則一條指令的解釋需要mΔt的時(shí)間,之后每隔Δt完成一條指令的解釋,則完成n條指令的解釋所需要的時(shí)間為:
該流水線的實(shí)際吞吐率為:(4.2)
從式4.2可以看出,實(shí)際吞吐率總是小于最大吞吐率,只有當(dāng)進(jìn)入流水線的任務(wù)數(shù)遠(yuǎn)大于流水線功能段的數(shù)目時(shí),即時(shí),才能使實(shí)際吞吐率趨近于最大吞吐率,或者可以近似認(rèn)為TP=TPmax。對(duì)于圖4.26,如果流入流水線的任務(wù)數(shù)不是n,而是周期性的任務(wù),即每流入n條指令之后,延遲ΔT的時(shí)間,再流入n條指令,延遲ΔT之后,再流入n條指令,周而復(fù)始,則這時(shí)的流水線的實(shí)際吞吐率TP就應(yīng)為:(4.3)
綜上所述,流水線的實(shí)際吞吐率除了與該流水線的功能段數(shù)目有關(guān)外,還與流入該流水線的指令流或任務(wù)流有關(guān)。指令流不同,其實(shí)際吞吐率也不同。在實(shí)際應(yīng)用中,除了在硬件上對(duì)子過程細(xì)分外,還應(yīng)當(dāng)從軟件上采取措施,如選擇合適的算法、程序設(shè)計(jì)方法、編譯器等,從軟、硬兩方面入手,保證在流水線中連續(xù)流動(dòng)的任務(wù)數(shù)n能遠(yuǎn)遠(yuǎn)大于子過程數(shù)m,才能充分發(fā)揮流水線的效率。否則,在極端情況下,即n=1的時(shí)候,由于m的增大,鎖存器數(shù)也增多,這樣實(shí)際上增大了任務(wù)從流入到流出的流水線通過時(shí)間,以至于使其速度反而比順序串行的還要低。
如果各段經(jīng)過的時(shí)間Δti不相等,其中“瓶頸”段時(shí)間為Δtj,完成n條指令的解釋,流水線的實(shí)際吞吐率為:(4.4)2.加速比(speedupratio)
所謂加速比是指流水線工作相對(duì)于等效的非流水線順序串行工作方式,速度提高的比值。設(shè)指令流水線由m段組成,各段經(jīng)過的時(shí)間均為Δt,共完成n條指令的解釋,則此流水線方式工作的加速比為:(4.5)
由式4.5可以看出,當(dāng)n>>m時(shí),流水線的加速比Sp才接近于流水線的段數(shù)m,也就是說,當(dāng)流水線各段時(shí)間都一樣時(shí),其最大加速比等于流水線的段數(shù)m。因此,在n>>m的前提下,增大流水線的段數(shù)m,可以提高流水線的加速比Sp。如果考慮各段經(jīng)過的時(shí)間Δti不相等,其中“瓶頸”段時(shí)間為Δtj,完成n條指令的解釋,則此流水線方式工作的加速比為:(4.6)4.5.2效率(efficiency)
流水線的效率是指流水線的設(shè)備利用率。即在整個(gè)運(yùn)行時(shí)間里,流水線的設(shè)備有百分之多少的時(shí)間是真正用于工作的。由于流水線存在有建立時(shí)間和排空時(shí)間,在連續(xù)完成n個(gè)任務(wù)的時(shí)間里,各段并不是滿負(fù)荷工作的,因此流水線的效率一定小于1。設(shè)指令流水線由m段組成,各段經(jīng)過的時(shí)間均為Δt,完成n條指令的解釋,流水線的效率為:η1+η2+…+ηmm·η1m·nΔtm·nΔtη===η1==(4.7)mmm·(mΔt+(n-1)Δt)m·T
對(duì)于式4.7,從時(shí)-空?qǐng)D上來看,所謂效率實(shí)際就是n個(gè)任務(wù)占用的時(shí)-空區(qū)和m個(gè)段總的時(shí)-空區(qū)面積之比。如果考慮各段經(jīng)過的時(shí)間Δti不相等,其中“瓶頸”段時(shí)間為Δtj,完成n條指令的解釋。由于流水線的效率實(shí)際上就是n個(gè)任務(wù)占用的時(shí)-空區(qū)和m個(gè)段總的時(shí)-空區(qū)面積之比,因此,整個(gè)流水線的效率為:η1+η2+…+ηmn·∑Δti
η==(4.8)mm·(∑Δti+(n-1)Δtj)
mmi=1i=1
比較各種公式,可以得出如下結(jié)論:
(1)Sp=TP·ΣΔti(2)η=Sp/m
mi=14.6線性流水線性能分析舉例
對(duì)于單功能線性流水線,輸入連續(xù)任務(wù)的情況,通過上一節(jié)給出的公式很容易計(jì)算出流水線的吞吐率、加速比和效率。
例4.1
用一條4段浮點(diǎn)加法器流水線求8個(gè)浮點(diǎn)數(shù)的和:Z=A+B+C+D+E+F+G+H。已知流水線的各段經(jīng)過時(shí)間都是Δt,流水線的輸出結(jié)果可以直接返回到流水線的輸入或暫存于相應(yīng)的緩沖寄存器中,其延遲時(shí)間忽略不計(jì)。流水線為雙輸入端,如圖4.27(a)所示。
實(shí)現(xiàn)8個(gè)浮點(diǎn)數(shù)的相加,先完成A+B、C+D、E+F、G+H,然后(A+B)和(C+D)、(E+F)和(G+H)又作為新的輸入進(jìn)入流水線,分別實(shí)現(xiàn)A+B+C+D及E+F+G+H,最后完成所要求的加法,如圖4.27所示。這樣,流入流水線的任務(wù)數(shù)為7個(gè),從時(shí)-空?qǐng)D上可以看出,從任務(wù)開始到結(jié)束,共需15Δt,而順序完成7個(gè)任務(wù)需要的時(shí)間為7×4Δt=28Δt。因此,該流水線的實(shí)際吞吐率為:TP=7/(15Δt)
加速比為:Sp=28Δt/(15Δt)≈1.87
效率為:η=28Δt/(4×15Δt)≈46.7%
例4.2
設(shè)有二個(gè)向量A、B,各有4個(gè)元素,要在如圖4.28所示的靜態(tài)雙功能流水線上,計(jì)算向量點(diǎn)積A·B=Σai×bi。在該雙功能流水線中,S1→S2→S3→S5組成加法流水線,S1→S4→S5組成乘法流水線。設(shè)每個(gè)流水段所經(jīng)過的時(shí)間為Δt,而且流水線的輸出結(jié)果可以直接返回到輸入或暫存于相應(yīng)的緩沖寄存器中,其延遲時(shí)間和功能切換時(shí)間忽略不計(jì)。使用合理的算法,能使完成向量點(diǎn)積A·B運(yùn)算所用的時(shí)間最短,并求出流水線在此期間的實(shí)際吞吐率TP和效率η。
選擇適合于靜態(tài)流水線工作的算法:⑴連續(xù)計(jì)算a1×b1、a2×b2、a3×b3、a4×b44個(gè)乘法;⑵等執(zhí)行乘法工作的流水線排空后,進(jìn)行功能部件的切換,按加法的方式聯(lián)接流水線功能部件,連續(xù)計(jì)算(a1×b1+a2×b2)、(a3×b3+a4×b4);⑶產(chǎn)生了上述兩個(gè)結(jié)果后,再最后計(jì)算:(a1×b1+a2×b2)+(a3×b3+a4×b4)。顯然,最后總共流入多功能流水線的任務(wù)數(shù)為7個(gè),完成任務(wù)所需的時(shí)間為15Δt,而順序完成7個(gè)任務(wù)需要的時(shí)間為4×3Δt+3×4Δt=24Δt。
因此,該流水線的實(shí)際吞吐率為:TP=7/(15Δt)
效率為:η=24Δt/(5×15Δt)=32%
前面討論的是靜態(tài)流水線,如果把靜態(tài)流水線改為動(dòng)態(tài)流水線,其它條件不變,那么,在計(jì)算向量點(diǎn)積A·B=Σai×bi時(shí),流水線在此期間的吞吐率TP和效率η又該是多少呢?動(dòng)態(tài)流水線的時(shí)-空?qǐng)D如圖4.29所示。
從圖4.29中可以看出,進(jìn)入流水線的任務(wù)數(shù)還是7個(gè),但所需要的時(shí)間比靜態(tài)流水線少Δt,只需要14Δt就可完成。在此期間,動(dòng)態(tài)流水線的實(shí)際吞吐率為:TP=7/(14Δt)=1/(2Δt)
效率為:η=(4×3Δt+3×4Δt)/(5×14Δt)≈34.3%
從以上兩個(gè)例子可以看出,動(dòng)態(tài)流水線與靜態(tài)流水線相比,具有較高的實(shí)際吞吐率和效率。4.7非線性流水線的基本概念
前面討論都是以線性流水線為基礎(chǔ)的,由于線性流水線在執(zhí)行每個(gè)任務(wù)(指令、操作)的過程中,各段均只通過一次,因此每拍都可以將一個(gè)新的任務(wù)送入流水線,這些任務(wù)不會(huì)爭(zhēng)用同一個(gè)流水段。在非線性流水線中,由于存在有反饋回路,當(dāng)一個(gè)任務(wù)在流水線中流過時(shí),在同一個(gè)功能段可能要經(jīng)過多次。因此,就不能每一個(gè)時(shí)鐘周期向流水線輸入一個(gè)新任務(wù),否則會(huì)發(fā)生在同一個(gè)時(shí)刻有幾個(gè)任務(wù)爭(zhēng)用同一個(gè)功能段的情況。這種情況稱為功能部件沖突,或流水線沖突。
為了避免流水線發(fā)生沖突,一般采用延遲輸入新任務(wù)的方法。那么,在非線性流水線的輸入端,究竟每間隔多少個(gè)時(shí)鐘周期向流水線輸入一個(gè)新任務(wù)才能使流水線的各個(gè)功能段都不發(fā)生沖突,這就是非線性流水線的調(diào)度問題。在許多非線性流水線中,間隔的周期數(shù)往往不是一個(gè)常數(shù),而是一串周期變化的數(shù)字。因此,非線性流水線調(diào)度的任務(wù)是要找出一個(gè)最小的循環(huán)周期,按照這周期向流水線輸入新任務(wù),流水線的各個(gè)功能段都不會(huì)發(fā)生沖突,而且流水線的吞吐率和效率最高。
在非線性流水線的表示中,它與線性流水線有2個(gè)明顯不同的地方:
(1)有反饋線和前饋線;
(2)其輸出端經(jīng)常不在最后一個(gè)功能段,而可能從中間任意一個(gè)功能段輸出。典型的非線性流水線的連接圖如圖4.30所示。
為了能對(duì)流水線的任務(wù)進(jìn)行優(yōu)化調(diào)度和控制,1971年E.S.Davidson提出使用一個(gè)二維的預(yù)約表(reservationtable)來描述一個(gè)任務(wù)在非線性流水線中對(duì)各功能段的使用情況。預(yù)約表用于非線性流水線,是一張二維的表格,其橫坐標(biāo)表示流水線工作的時(shí)鐘周期,縱坐標(biāo)表示流水線的功能段,中間畫“√”表示該功能段在這一時(shí)鐘周期處于工作狀態(tài),空白的地方表示該功能段在這個(gè)時(shí)鐘周期不工作。
在預(yù)約表中,一行有多個(gè)“√”表示一個(gè)任務(wù)在不同時(shí)鐘周期重復(fù)使用了同一個(gè)功能段;而一列有多個(gè)“√”則表示在同一個(gè)時(shí)鐘周期同時(shí)使用了多個(gè)功能段。預(yù)約表的總行數(shù)表示流水線功能段的個(gè)數(shù),總列數(shù)表示一個(gè)任務(wù)從流入到流出所經(jīng)過的時(shí)鐘周期數(shù)。對(duì)于圖4.30的流水線,由5個(gè)功能段組成,段號(hào)k分別為1到5,任務(wù)經(jīng)過流水線總共需N=9拍,假設(shè)其預(yù)約表如圖4.31所示。
值得說明的是:(1)一張非線性流水線的預(yù)約表可能與多個(gè)非線性流水線連接圖相對(duì)應(yīng);(2)一個(gè)非線性流水線的連接圖也可能對(duì)應(yīng)多張預(yù)約表。因此,一條非線性流水線一般需要一個(gè)各功能段之間的連接圖和一張預(yù)約表來共同表示。
根據(jù)預(yù)約表可以很快得出一個(gè)任務(wù)使用圖4.30的流水線各段所需間隔的拍數(shù)。將流水線中所有各段對(duì)一個(gè)任務(wù)流過時(shí),產(chǎn)生爭(zhēng)用同一段的節(jié)拍間隔數(shù)匯集在一起,構(gòu)成一個(gè)延遲禁止表F(forbiddenlist)。從圖4.31所給出的預(yù)約表,l段相隔8拍,那么兩個(gè)任務(wù)相隔8拍流入流水線必將會(huì)爭(zhēng)用1段;2段相隔1、5、6拍,則相隔1、5或6拍流入流水線必將會(huì)爭(zhēng)用2段;5段相隔1拍,兩個(gè)任務(wù)相隔1拍流入流水線必將會(huì)爭(zhēng)用4段;4段相隔1拍,兩個(gè)任務(wù)相隔1拍流入流水線必將會(huì)爭(zhēng)用5段。由圖4.31的預(yù)約表可以得到相應(yīng)非線性流水線的延遲禁止表F為(1,5,6,8)。即要想不出現(xiàn)爭(zhēng)用流水線功能段的現(xiàn)象,相鄰兩個(gè)任務(wù)送入流水線的間隔拍數(shù)就不能為1、5、6、8拍,這些間隔拍數(shù)應(yīng)當(dāng)禁止使用。
可以用一個(gè)有N-1位的位向量來表示后繼新任務(wù)間隔各種不同拍數(shù)送入流水線時(shí),是否會(huì)發(fā)生功能段使用的沖突,稱此位向量為沖突向量C(collisionvector)。沖突向量(cN-1…ci…c2c1)中第i位的狀態(tài)用以表示與當(dāng)時(shí)相隔i拍給流水線送入后繼任務(wù)是否會(huì)發(fā)生功能段的使用沖突。如果不會(huì)發(fā)生沖突,令該位為“0”,表示允許送入;否則,讓該位為“1”,表示禁止送入。沖突向量取N-1位,是因?yàn)榻?jīng)N拍后,任務(wù)己流出流水線,不會(huì)與后續(xù)的任務(wù)爭(zhēng)用流水線功能段了。
不難看出,輸入后續(xù)任務(wù)還需等待的拍數(shù)與前一個(gè)任務(wù)在流水線中已進(jìn)行了幾拍有關(guān)。當(dāng)?shù)谝粋€(gè)任務(wù)第1拍送入流水線時(shí),根據(jù)禁止表F=(1,5,6,8),可以形成此時(shí)的沖突向量C為(10110001),稱此為剛流入流水線時(shí)的初始沖突向量。由于初始沖突向量的c2、c3、c4、c7為0,所以第二個(gè)任務(wù)可以距第一個(gè)任務(wù)2、3、4或7拍流入流水線。當(dāng)?shù)诙€(gè)任務(wù)流入流水線后,應(yīng)當(dāng)產(chǎn)生新的沖突向量,以便決定第三個(gè)任務(wù)可以相隔多少拍流入流水線,才不會(huì)與已進(jìn)入流水線的前面第一、第二個(gè)任務(wù)爭(zhēng)用功能段,…,依此順序類推。
顯然,隨著流水線中第一個(gè)任務(wù)每拍向前推進(jìn)一段,原先禁止第二個(gè)任務(wù)流入流水線的各種間隔拍數(shù)均相應(yīng)減去l拍。這意味著可以將初始沖突向量放在一個(gè)移位器中,每拍邏輯右移1位,讓左面移空的位補(bǔ)以“0”,以表示如果間隔8拍流入后續(xù)任務(wù)的話,前一個(gè)任務(wù)必定已流出流水線而不會(huì)發(fā)生功能部件使用沖突。因此,隨著任務(wù)在流水線中的推進(jìn),會(huì)不斷動(dòng)態(tài)地形成當(dāng)時(shí)的沖突向量。
如果選擇第二個(gè)任務(wù)在間隔2拍時(shí)流入流水線,對(duì)第一個(gè)任務(wù)而言,沖突向量右移2位成了(00101100)。這樣,要想使第三個(gè)任務(wù)流入流水線后,既不會(huì)與第一個(gè)任務(wù)發(fā)生功能段沖突,也不會(huì)與第二個(gè)任務(wù)發(fā)生功能段沖突,新的沖突向量就應(yīng)當(dāng)是第一個(gè)任務(wù)當(dāng)前的沖突向量(00101100)與第二個(gè)任務(wù)的初始沖突向量(10110001)按位"或",其結(jié)果為(10111101)。即第三個(gè)任務(wù)只能在第二個(gè)任務(wù)流入流水線后,隔2拍或7拍流入,才不會(huì)發(fā)生與先前流入流水線的那些任務(wù)爭(zhēng)用功能段。
按照這樣的思路,選擇各種可能的間隔拍數(shù)流入新的任務(wù),從而又可以產(chǎn)生新的沖突向量,一直進(jìn)行到不再產(chǎn)生不同的沖突向量為止。由此可以畫出用沖突向量表示的流水線狀態(tài)轉(zhuǎn)移圖。圖中兩個(gè)沖突向量之間用有向弧上的數(shù)字表示引入后續(xù)任務(wù)產(chǎn)生新的沖突向量所用的間隔拍數(shù)。本例的流水線狀態(tài)轉(zhuǎn)移圖如圖4.32所示。
從上面的分析中可以看出,從第二個(gè)任務(wù)開始,流入流水線的任務(wù)間隔拍數(shù)就有不同的選擇;而實(shí)際應(yīng)用的時(shí)候,只能選擇一種間隔拍數(shù)進(jìn)入流水線,那么應(yīng)該選擇哪一個(gè)間隔拍數(shù)進(jìn)入流水線才不會(huì)產(chǎn)生沖突,而且效率最高?只要按流水線狀態(tài)圖中由初始狀態(tài)出發(fā),能構(gòu)成一種間隔拍數(shù)呈周期性重復(fù)的方案來進(jìn)行流水線的調(diào)度,都不會(huì)發(fā)生功能段使用沖突。然而,我們還希望能尋找一種最佳的調(diào)度方案,以便使流水線的吞吐率最高。顯然,只需要分別計(jì)算出每種調(diào)度方案的平均間隔拍數(shù),然后,找出其中之最小者,就是流水線各后續(xù)任務(wù)流入流水線所用間隔的最佳調(diào)度。表4.1各種調(diào)度方案的平均間隔拍數(shù)調(diào)度方案(2,2,7)(2,7)(3,4)(4,3)(3,4,7)(3,7)(4,3,7)(4,7)(7)平均間隔拍數(shù)3.674.53.53.54.6754.675.57
由表4.1中可見,采用先隔3拍后隔4拍輪流給流水線送入任務(wù)的調(diào)度方案是最佳的,平均每隔3.5拍即可流入一個(gè)任務(wù),吞吐率最高。盡管(4,3)調(diào)度方案平均間隔拍數(shù)也是3.5拍,但若實(shí)際流入任務(wù)數(shù)不是循環(huán)所需任務(wù)數(shù)的整數(shù)倍時(shí),其實(shí)際吞吐率相對(duì)會(huì)低些,所以不作為最佳調(diào)度方案。如圖4.33所示,如果有4個(gè)任務(wù)流入流水線,采用(3,4)的調(diào)度方案流入時(shí),所需要的拍數(shù)為9+3+4+3=19拍,而采用(4,3)調(diào)度方案時(shí),所需要的拍數(shù)就變成9+4+3+4=20拍。
同樣是4個(gè)任務(wù),采用不同調(diào)度方案,完成任務(wù)的拍數(shù)相差1拍。但若流入的任務(wù)數(shù)為5個(gè)的話,采用(3,4)調(diào)度方案或(4,3)調(diào)度方案,所需的拍數(shù)是一樣的,都是23拍。這是一種不等間隔的調(diào)度策略,比起相等間隔的調(diào)度策略在控制上要復(fù)雜一些。
為了簡(jiǎn)化控制,也可以采用相等間隔調(diào)度,不過常常會(huì)因此而使吞吐率和效率下降。在本例只有一種相等間隔調(diào)度方案,即每隔7拍輸入一個(gè)任務(wù),吞吐率比(3,4)調(diào)度方案降低了1/2。如果能有幾種不同的相等間隔調(diào)度方案,顯然應(yīng)取其中間隔最小的,這樣會(huì)使吞吐率的下降最少。4.8相關(guān)處理和控制機(jī)構(gòu)
流水線只有連續(xù)不斷地流動(dòng),即不出現(xiàn)“斷流”,才能獲得高效率。造成流水線“斷流”的原因很多,有編譯程序形成的目標(biāo)程序不能發(fā)揮流水結(jié)構(gòu)的作用,存儲(chǔ)系統(tǒng)供不上為連續(xù)流動(dòng)所需的指令和操作數(shù),轉(zhuǎn)移(無條件轉(zhuǎn)移、條件轉(zhuǎn)移)指令的使用,相關(guān)(指令相關(guān)、主存操作數(shù)相關(guān)和通用/變址寄存器組操作數(shù)相關(guān))和中斷的出現(xiàn)等。
前面討論了重疊方式中出現(xiàn)的指令相關(guān)、主存操作數(shù)相關(guān)、通用寄存器組的操作數(shù)相關(guān)及基址值變址值相關(guān)。這些相關(guān)在流水機(jī)器中同樣也會(huì)出現(xiàn)。而且,由于流水是同時(shí)解釋更多條指令,所以相關(guān)狀況要比重疊機(jī)器的更復(fù)雜、更嚴(yán)重,如果處理不當(dāng),就會(huì)使流水效率顯著下降。指令相關(guān)、主存操作數(shù)相關(guān)和通用/變址寄存器組操作數(shù)相關(guān)由于只影響相關(guān)的二條或幾條指令,而至多影響流水線某些段的推后工作,并不會(huì)改動(dòng)指令緩沖器中預(yù)取到的指令內(nèi)容,影響是局部的,所以被稱之為局部性相關(guān)。
同樣,流水機(jī)器在遇到轉(zhuǎn)移指令,尤其是條件轉(zhuǎn)移指令時(shí),效率也會(huì)顯著下降。如果流水機(jī)器的轉(zhuǎn)移條件碼是由條件轉(zhuǎn)移指令本身或是由它的前一條指令形成時(shí),則只有該指令流出流水線才能建立轉(zhuǎn)移條件,并依此決定下一條指令的地址。那么從條件轉(zhuǎn)移指令進(jìn)入流水線,譯碼出它是條件轉(zhuǎn)移指令直至它流出的整個(gè)期間,流水線都不能繼續(xù)往前處理。若轉(zhuǎn)移成功,且轉(zhuǎn)向的目標(biāo)指令又不在指令緩沖器內(nèi)時(shí),還得要重新訪存取指令。
轉(zhuǎn)移指令和其后的指令之間存在關(guān)聯(lián),使之不能同時(shí)解釋,其造成的對(duì)流水機(jī)器的吞吐率和效率下降的影響要比指令相關(guān)、主存操作數(shù)相關(guān)和通用/變址寄存器操作數(shù)相關(guān)嚴(yán)重得多,它可能會(huì)造成流水線中很多已被解釋的指令作廢,重新預(yù)取指令進(jìn)入指令緩沖寄存器,它將影響整個(gè)程序的執(zhí)行順序,所以稱之為全局性相關(guān)。4.8.1局部性相關(guān)的處理局部性相關(guān)包括指令相關(guān)、訪存操作數(shù)相關(guān)和通用/變址寄存器組操作數(shù)相關(guān)等,都是由于在機(jī)器同時(shí)解釋的多條指令之間出現(xiàn)了對(duì)同一個(gè)單元(包括主存單元和通用寄存器)的“先寫后讀”要求。重疊機(jī)器在處理這些局部性相關(guān)時(shí)有兩種辦法:一種辦法是推后對(duì)相關(guān)單元的讀,直至寫入完成;另一種辦法是設(shè)置相關(guān)專用通路,使得不必先把運(yùn)算結(jié)果寫入相關(guān)存儲(chǔ)單元,再由它讀出后才能使用,而是經(jīng)相關(guān)專用通路直接使用運(yùn)算結(jié)果,這樣,就可省去“寫入”和“讀出”兩個(gè)訪問周期。
由于流水技術(shù)是重疊技術(shù)的延伸,因此上述兩種方法的思路也適用于流水機(jī)器處理局部性相關(guān),但由于流水機(jī)器是同時(shí)解釋更多條指令,所以其相關(guān)專用通路的設(shè)計(jì)當(dāng)然要比重疊的復(fù)雜。流水線有多個(gè)子過程,多條指令同時(shí)處在不同子過程上解釋。在控制機(jī)構(gòu)上需要解決好如下問題:如何判定流入流水線的多條指令之間是否相關(guān),如何控制推后對(duì)相關(guān)單元的讀,如何設(shè)置相關(guān)專用通路并控制相關(guān)專用通路的連通和斷開。對(duì)流水的流動(dòng)順序的安排和控制可以有兩種方式:順序流動(dòng)方式和異步流動(dòng)方式。
順序流動(dòng)方式是指流水線輸出端的任務(wù)(指令)流出順序和輸入端的流入順序一樣。如圖4.34所示,有一個(gè)8段的流水線,其中第2段為讀段,第7段為寫段。有一串指令h、i、j、k、l、m、……依次流入,當(dāng)指令j的源操作數(shù)地址與指令h的目的操作數(shù)地址相同時(shí),h和j就發(fā)生了先寫后讀的操作數(shù)相關(guān)。順序流動(dòng)方式時(shí),就要求j流到讀段時(shí)必須停下來等待,直到h到達(dá)寫段并完成寫入后,才能繼續(xù)向前流動(dòng),否則j將會(huì)因讀出的不是h寫入后的內(nèi)容而造成錯(cuò)誤。
這是一種推后對(duì)相關(guān)單元讀的辦法,由于j停下來,j之后的指令也被迫停下來。順序流動(dòng)方式的優(yōu)點(diǎn)是控制比較簡(jiǎn)單。例如TI-ASC機(jī)就采用了這種方式。其缺點(diǎn)是一旦相關(guān)后,在空間和時(shí)間上都會(huì)有損失,使得流水線的吞吐率和功能部件的利用率降低??臻g上會(huì)有功能段空閑出來,使部件利用率(效率)降低,時(shí)間上推后流出,會(huì)使流水線吞吐率降低。
異步流動(dòng)方式是指流水線輸出端的任務(wù)(指令)流出順序和輸入端的流入順序可以不一樣。異步流動(dòng)方式的優(yōu)點(diǎn)是流水線的吞吐率和功能部件的利用率都不會(huì)下降。如圖4.34的“可以不順序流動(dòng)的”那行所示的指令在流水線內(nèi)的流動(dòng)順序,如果讓j之后的那些指令,如k、l、m、n等,只要與j沒有相關(guān),就越過j繼續(xù)向前流動(dòng)。但采用異步流動(dòng)方式帶來了新的問題,采用異步流動(dòng)的控制復(fù)雜,而且會(huì)發(fā)生在順序流動(dòng)中不會(huì)出現(xiàn)的其它相關(guān)。由于異步流動(dòng)要改變指令的執(zhí)行順序,同時(shí)流水線的異步流動(dòng)還會(huì)使相關(guān)情況復(fù)雜化,出現(xiàn)除“先寫后讀”相關(guān)外的“寫-寫”相關(guān)、“先讀后寫”相關(guān)等。
例如,若指令i、k都有寫操作,而且是寫入同一單元,那該單元的最后內(nèi)容本應(yīng)是指令k的寫入結(jié)果。但是,由于指令i執(zhí)行時(shí)間很長或有“先寫后讀”相關(guān),就會(huì)出現(xiàn)指令k先于指令i到達(dá)“寫段”,從而使得該單元的最后內(nèi)容錯(cuò)為指令i的寫入結(jié)果。我們稱這種對(duì)同一單元,要求在先的指令先寫入,在后的指令后寫入的關(guān)聯(lián)為“寫-寫”相關(guān)。采用異步流動(dòng)時(shí),應(yīng)在控制機(jī)構(gòu)上保證當(dāng)發(fā)生“寫-寫”相關(guān)后寫入的先后順序不變。另外,若指令i的讀操作和指令k的寫操作是對(duì)應(yīng)于同一單元,指令i讀出的本應(yīng)是該單元的原存內(nèi)容。但若指令k越過指令i向前流,且其寫操作在指令i的讀操作開始前完成,那指令i就會(huì)錯(cuò)誤地讀出了指令k的寫入結(jié)果。我們稱這種對(duì)同一單元,要求在先的指令先讀出,在后的指令才寫入的關(guān)聯(lián)為“先讀后寫”相關(guān)。顯然,“寫-寫”相關(guān)和“先讀后寫”相關(guān)都只有在異步流動(dòng)時(shí)才有可能發(fā)生,順序流動(dòng)時(shí)是不可能發(fā)生的。所以,在設(shè)計(jì)采用異步流動(dòng)方式工作時(shí),控制機(jī)構(gòu)應(yīng)能處理好這3種關(guān)系。
在前面異步流動(dòng)方式的例子中,“寫段”和“讀段”之間設(shè)置了相關(guān)專用通路。然而,流水機(jī)器是同時(shí)解釋多條指令,還經(jīng)常采用多個(gè)可并行工作的功能部件,不應(yīng)當(dāng)在各個(gè)功能部件之間為每種局部性相關(guān)都設(shè)置單獨(dú)的相關(guān)專用通路,否則會(huì)使硬件耗費(fèi)大,控制復(fù)雜。一般的流水線機(jī)器都是采用分布式管理和控制以及設(shè)置公共數(shù)據(jù)總線來簡(jiǎn)化各種相關(guān)的判別和實(shí)現(xiàn)相關(guān)專用通路的連接。4.8.2全局性相關(guān)的處理全局性相關(guān)指的是已進(jìn)入流水線的轉(zhuǎn)移指令(尤其是條件轉(zhuǎn)移指令)和其后面的指令之間的相關(guān)。下面介紹一些常用的處理方法。
1.分支預(yù)測(cè)技術(shù)若指令i是條件轉(zhuǎn)移指令,它有兩個(gè)分支,如圖4.35所示。一個(gè)分支是i+1、i+2、i+3、…,按原來的順序繼續(xù)執(zhí)行下去,稱轉(zhuǎn)移不成功分支,另一個(gè)分支是轉(zhuǎn)向p,然后繼續(xù)執(zhí)行p+1、p+2、…,稱為轉(zhuǎn)移成功分支。
流水方式是同時(shí)解釋多條指令,因此,當(dāng)指令i進(jìn)入流水線,后面進(jìn)i+1還是進(jìn)p,只有等條件碼建立才能知道,而這一般要等該條件轉(zhuǎn)移指令快流出流水線時(shí)才行。如果在此期間讓i之后的指令等著,流水線就會(huì)“斷流”,性能將會(huì)急劇下降。為了在遇到條件轉(zhuǎn)移指令后,流水線仍能繼續(xù)向前流動(dòng),不使吞吐率和效率下降,絕大多數(shù)機(jī)器都采用所謂的“猜測(cè)法”,即分支預(yù)測(cè)技術(shù)。猜取第i+1條指令和第p條指令所在分支中的一個(gè)繼續(xù)向前流動(dòng)。
分支預(yù)測(cè)技術(shù)可以分為靜態(tài)分支預(yù)測(cè)和動(dòng)態(tài)分支預(yù)測(cè),這里我們討論靜態(tài)分支預(yù)測(cè)技術(shù),可以有兩種實(shí)現(xiàn)方法。一種是分析程序結(jié)構(gòu)本身的特點(diǎn)或使用該程序以前運(yùn)行時(shí)收集的模擬信息。不少條件轉(zhuǎn)移兩個(gè)分支的出現(xiàn)概率是能夠預(yù)估的,只要程序設(shè)計(jì)者或編譯程序把出現(xiàn)概率高的分支安排為猜選分支,就能顯著減少由于處理?xiàng)l件轉(zhuǎn)移所帶來的流水線吞吐率和效率的損失。另一種是按照分支的方向來預(yù)測(cè)分支是否轉(zhuǎn)移成功,當(dāng)兩者概率差不多時(shí),一般選取不成功轉(zhuǎn)移分支。
因?yàn)檫@些指令一般已預(yù)取進(jìn)指令緩沖器,可以很快從指令緩沖器取出,進(jìn)入流入線而不必等待。如果猜選成功轉(zhuǎn)移分支,指令p很可能不在指令緩沖器中,需花較長時(shí)間去訪存取得,使流水線實(shí)際上斷流。例如IBM360/91就采用轉(zhuǎn)移不成功分支。但這兩種方法猜錯(cuò)的概率都不會(huì)低于30%。要提高預(yù)測(cè)的準(zhǔn)確度,可以采用動(dòng)態(tài)預(yù)測(cè)的方法,在硬件上建立分支預(yù)測(cè)緩沖站及分支目標(biāo)緩沖站,根據(jù)執(zhí)行過程中轉(zhuǎn)移的歷史記錄來動(dòng)態(tài)的預(yù)測(cè)轉(zhuǎn)移選擇,其預(yù)測(cè)準(zhǔn)確度可以提高到90%左右。這種方法在POWERPC620的分支預(yù)測(cè)中得到了采用。
顯然,采用猜測(cè)法的控制機(jī)構(gòu)應(yīng)能保證在猜錯(cuò)時(shí)可返回到分支點(diǎn)之前,并能把沿猜測(cè)分支流水時(shí)的指令的已有解釋全部作廢,并恢復(fù)分支點(diǎn)處的原有現(xiàn)場(chǎng)。恢復(fù)已經(jīng)開始解釋的那些指令的原有現(xiàn)場(chǎng)有如下三種方法:一是對(duì)猜測(cè)指令的解釋只完成譯碼和準(zhǔn)備好操作數(shù),在轉(zhuǎn)移條件碼出現(xiàn)前不執(zhí)行運(yùn)算;二是對(duì)猜測(cè)指令的解釋可完成到運(yùn)算完畢,但不送回運(yùn)算結(jié)果;然而早期所用的這兩種辦法不方便,因?yàn)槿舨聦?duì)后還要讓這些指令繼續(xù)完成余留的操作。隨著器件技術(shù)的發(fā)展,已經(jīng)可以讓它們和正常情況一樣,不加區(qū)別地全部解釋完。三是對(duì)在流水線中的猜測(cè)指令不加區(qū)別地全部解釋完,但需把可能被破壞的原始狀態(tài)都用后援寄存器保存起來,一旦猜錯(cuò)就取出后援寄存器的內(nèi)容來恢復(fù)分支點(diǎn)的現(xiàn)場(chǎng)。一般猜對(duì)的概率要高,猜對(duì)后既不用恢復(fù),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版智能航運(yùn)物流船運(yùn)輸合作協(xié)議合同2篇
- 二零二五年測(cè)繪數(shù)據(jù)處理與分析合同范本3篇
- 二零二五年特種花卉種子采購合同范本3篇
- 二零二五版商業(yè)街區(qū)保安臨時(shí)工勞動(dòng)合同示范文本3篇
- 二零二五版生態(tài)農(nóng)業(yè)基地種植分包合同3篇
- 河北省二零二五年度二手房買賣合同附帶專業(yè)拆除及清理服務(wù)3篇
- 二零二五年度車輛過戶手續(xù)代理合同3篇
- 二零二五版汽車制造專用管子配件供應(yīng)合同3篇
- 二零二五年度酒店食堂承包服務(wù)合同范本3篇
- 二零二五年度礦業(yè)風(fēng)險(xiǎn)評(píng)估與風(fēng)險(xiǎn)管理合同2篇
- 割接方案的要點(diǎn)、難點(diǎn)及采取的相應(yīng)措施
- 2025年副護(hù)士長競(jìng)聘演講稿(3篇)
- 2025至2031年中國臺(tái)式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報(bào)告
- 原發(fā)性腎病綜合征護(hù)理
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級(jí)上冊(cè)
- 2025年中國電科集團(tuán)春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場(chǎng)安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 2024年考研英語一閱讀理解80篇解析
- 福建省廈門市2023-2024學(xué)年高二上學(xué)期期末考試語文試題(解析版)
- 防火墻施工組織設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論