附錄A流水線基礎(chǔ)和中級概念_第1頁
附錄A流水線基礎(chǔ)和中級概念_第2頁
附錄A流水線基礎(chǔ)和中級概念_第3頁
附錄A流水線基礎(chǔ)和中級概念_第4頁
附錄A流水線基礎(chǔ)和中級概念_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

附錄A流水線基礎(chǔ)和中級概念

事實(shí)上這是一個(gè)三段論的問題。

亞瑟?柯南道爾《福爾摩斯探案集》

A.1介紹

在閱讀本章之前,許多讀者可能通過其他書籍(例如我們寫的更加基礎(chǔ)的書籍:計(jì)算機(jī)

的組成與設(shè)計(jì))對流水線問題有了一定的了解。由于第三章和第四章的內(nèi)容在很大程度上依

賴于這份材料,讀者必須確保在繼續(xù)閱讀本書之前對本附錄的內(nèi)容有比較全面的熟悉和了

解。當(dāng)你閱讀第三章的時(shí)候,你會發(fā)現(xiàn)回過頭來看看這部分內(nèi)容是非常有幫助的。

我們從流水線的基本內(nèi)容開始,包括對數(shù)據(jù)相關(guān)和“冒險(xiǎn)”的介紹,以及流水線的實(shí)現(xiàn)

等。本節(jié)介紹基本的5級RISC流水線技術(shù),該技術(shù)是其他附錄的基礎(chǔ)。第A.2節(jié)講述“冒

險(xiǎn)”的問題,包括“冒險(xiǎn)”如何引發(fā)數(shù)據(jù)相關(guān),以及如何處理“冒險(xiǎn)”問題等。第A.3節(jié)講

述簡單的5級RISC流水線是如何實(shí)現(xiàn)的,主要討論“冒險(xiǎn)”及其處理方法。

第A.4節(jié)討論不同體系結(jié)構(gòu)和流水線技術(shù)的交互,包括相當(dāng)重要的例外處理問題,以及

它與流水線的交互作用。因?yàn)榈贏.4節(jié)是理解第三章內(nèi)容的關(guān)鍵,所以對中斷處理及中斷處

理之后的恢復(fù)過程不是很熟悉的讀者會發(fā)現(xiàn),閱讀這一節(jié)是非常有用的。

第A.5節(jié)討論基本的5級流水線如何被擴(kuò)展為可以處理浮點(diǎn)運(yùn)算的長流水線結(jié)構(gòu)。第

A.6節(jié)把以上的概念結(jié)合在一起,以一個(gè)實(shí)際的超流水線處理器——MIPSR4000/4400為例

進(jìn)行學(xué)習(xí),該處理器包括有8級的整數(shù)流水線和浮點(diǎn)流水線。與之對照,在第A.7節(jié)討論使

用5級流水線的MIPS4300系列,這個(gè)系列的產(chǎn)品在嵌入式系統(tǒng)中被廣泛運(yùn)用。

第A.8節(jié)介紹動態(tài)調(diào)度的概念,及用記分牌實(shí)現(xiàn)動態(tài)調(diào)度的方法,該方法可作為?種學(xué)

習(xí)動態(tài)調(diào)度方法的捷徑,同時(shí),它也是第三章中的一個(gè)核心問題。第A.8節(jié)還對第三章提到

的Tomasulo算法作了簡單介紹。盡管不涉及記分牌方法也可以理解Tomasulo算法,但通過

記分牌方法可以更簡單和更容易地理解Tomasulo算法。

本附錄的最后三節(jié)(第八.9節(jié)~第A.11節(jié))講述了謬誤和缺陷,總結(jié)了該附錄的主要思

想,并提供本附錄所講述的主要觀點(diǎn)的簡要?dú)v史。

A.1.1什么是流水線

流水線是多條指令同時(shí)執(zhí)行的一種實(shí)現(xiàn)技術(shù)。目前,流水線已經(jīng)成為高速CPU中采用

的關(guān)鍵技術(shù)。

流水線就像裝配線那樣。在汽車裝配線上,一輛汽車的裝配過程分為很多步驟,每一個(gè)

驟步完成汽車生產(chǎn)的一部分。在流水線中的每一個(gè)步驟與其他任何一個(gè)步驟都并行執(zhí)行,盡

管裝配的是不同的汽車。在計(jì)算機(jī)的流水線中,流水線的每一個(gè)步驟完成一條指令的一部分。

就像裝配線那樣,不同的步驟并行完成流水線中不同指令的不同部分。每一個(gè)步驟稱為一個(gè)

流水節(jié)拍或一個(gè)流水階段。一個(gè)流水節(jié)拍與另一個(gè)流水節(jié)拍相連接形成流水線。指令從一端

進(jìn)入,經(jīng)過這些流水節(jié)拍的處理,從另一端流出,就象汽車在裝配線上的處理過程一樣。

在汽車裝配線匕吞吐量定義為每小時(shí)的汽車產(chǎn)量,它取決于汽車從裝配線流出的速度。

與之相似,指令流水線的吞吐量取決于指令流出流水線的速度。由于指令步緊密相連,所有

的流水節(jié)拍也必須同步工作,就象裝配線那樣。指令沿流水線移動一次的時(shí)間間隔就是一個(gè)

機(jī)器周期。因?yàn)樗兄噶畈酵瑫r(shí)工作,所以機(jī)器時(shí)間決定于最慢的指令步。在計(jì)算機(jī)中,這

個(gè)機(jī)器周期通常是一個(gè)時(shí)鐘周期(有時(shí)是兩個(gè)時(shí)鐘周期,很少是多個(gè)),盡管時(shí)鐘周期可能

有多個(gè)階段。

流水線設(shè)計(jì)者的任務(wù)是平衡各個(gè)流水節(jié)拍的長度,就象裝配線設(shè)計(jì)者力爭平衡每一步階

段的時(shí)間那樣。如果每一步都得到最佳平衡,那么每條指令在流水線上的平均時(shí)間在最理想

情況下等于:

非流水線機(jī)器中一條指令的執(zhí)行時(shí)間

流水線的節(jié)拍數(shù)

在這種情況下,流水線的加速比等于流水線的節(jié)拍數(shù),就好像在一個(gè)有N個(gè)裝配段的流水

線上,可以同時(shí)有N部汽車在裝配。但是,通常的流水線加速比和流水線節(jié)拍之間不會得

到這么好的平衡,而且流水線需要有?些附加的時(shí)間開銷。因此,每條指令在流水線上的平

均執(zhí)行時(shí)間不會達(dá)到上面的最小值,盡管可以很接近。

通過以上的說明可以知道,流水線能夠減少指令的平均執(zhí)行時(shí)間。當(dāng)你從不同角度看流

水線時(shí),這個(gè)減少量也相應(yīng)有所不同??梢哉J(rèn)為是減少了每條指令的平均時(shí)鐘周期數(shù)(CPI),

也可以認(rèn)為是減少了時(shí)鐘周期的長度,還可以認(rèn)為在這兩個(gè)方面都減少了。如果研究對象是

一臺每條指令分為多個(gè)時(shí)鐘周期的機(jī)器,那么流水線可以看作是減少了CPI——這是我們將

采納的基本觀點(diǎn)。如果研究對象是每條指令執(zhí)行一個(gè)長周期,那么流水線減少的是機(jī)器的時(shí)

鐘周期。

流水線是一種在連續(xù)指令流中開發(fā)指令級并行性的技術(shù)。與某些加速技巧(參看第六章)

相比,流水線的明顯長處是:它對編程者是透明的。在本附錄中,我們將首先看到一個(gè)經(jīng)典

的5級流水線。在其他章節(jié)中,還討論了現(xiàn)代處理中采用的一些更加經(jīng)典的流水線技術(shù)。在

繼續(xù)介紹流水線之前,我們需要一個(gè)簡單的指令集,就是我們在下面要介紹的。

A.1.2RISC指令集基礎(chǔ)

貫穿在本書中,我們使用RISC(精簡指令集計(jì)算機(jī))體系或者Load/Store體系來對基

本的概念進(jìn)行說明,雖然這些概念也適用于其他體系結(jié)構(gòu)的處理器。在本節(jié)中,我們介紹典

型的RISC體系結(jié)構(gòu)的核心。在附錄和本書中,我們默認(rèn)的RISC體系結(jié)構(gòu)是MIPS系統(tǒng)。

在很多地方,這些概念是如此的相似,所以我們不需要與特定的其他系統(tǒng)加以區(qū)別。

RISC有以下幾個(gè)特點(diǎn),這些特點(diǎn)明顯簡化了RISC的硬件實(shí)現(xiàn):

?所有運(yùn)算使用的數(shù)據(jù)都來自寄存器,運(yùn)算結(jié)果也都寫入寄存器,每個(gè)寄存器的典型

長度是32位或64位。

?能夠訪問內(nèi)存的操作只有兩條指令:從內(nèi)存中讀取數(shù)據(jù)到寄存器的Load指令和從

寄存器向內(nèi)存中寫數(shù)據(jù)的Store指令。Load和Store指令可以對一個(gè)寄存器的一部

分進(jìn)行操作(例如:一個(gè)字節(jié),16位,或者32位)。

?指令的數(shù)量比較少,所有指令的長度均相同。

這種結(jié)構(gòu)使流水線的實(shí)現(xiàn)得到顯著的簡化,這就是為什么使用這種方法來設(shè)計(jì)指令系統(tǒng)

的原因。

為了和本文的其他部分保持一致,我們使用MIPS64(MIPS的64位版本)。擴(kuò)展的64

位系統(tǒng)通常在操作符的開始或者結(jié)尾有個(gè)D。例如:DADD表示64位的加指令,LD是

表示64位的Load指令。

與其他的RISC指令系統(tǒng)一樣,MIPS指令系統(tǒng)提供32位的寄存器,盡管0號寄存器的

值總是0。大多數(shù)RISC指令系統(tǒng)(包括MIPS指令系統(tǒng)),都包含有三種類型的指令(詳見

第二章):

1.ALU指令——這類指令使用兩個(gè)寄存器或者一個(gè)寄存器和一個(gè)帶符號的立即數(shù)(被

稱為ALU立即數(shù)指令,在MIPS系統(tǒng)中他們有16位的偏移值),對它們進(jìn)行操作,

然后將結(jié)果存入第三個(gè)寄存器。典型的這類指令包括加(DADD),減(DSUB),

以及與32位和64位無關(guān)的邏輯操作(例如:AND和OR)。這些立即數(shù)指令使用

相同的符號,并加上后綴I。在MIPS中,有帶符號和不帶符號的算術(shù)指令。不帶符

號的算術(shù)指令不會產(chǎn)生溢出一一所以在32位和64位的模式下都是相同的。不帶符

號的算術(shù)指令在指令后面加字符U來表示(例如:DADDU,DSUBU,DADDUI)。

2.Load和Store指令一一這些指令的操作數(shù)部分由?個(gè)被稱為基址寄存器的寄存器和

一個(gè)被稱為偏移量的立即數(shù)域(在MIPS中為16位)構(gòu)成。基址寄存器中的值與偏

移量的和就是操作的內(nèi)存地址,被稱為“有效地址”。以Load指令為例,其第二個(gè)

操作數(shù)(寄存器)給出從內(nèi)存中讀取數(shù)據(jù)的目的地址。指令讀取雙字(LD)或存儲

雙字(SD)是對整個(gè)64位的寄存器進(jìn)行讀取和存儲。

3.分支和跳轉(zhuǎn)一一分支語句就是條件跳轉(zhuǎn)。在RISC指令系統(tǒng)中通常有兩種方法來指明

分支的條件:使用一系列的條件位(有忖稱為“條件碼”),或者通過寄存器之間,

或寄存器與0之間的比較。MIPS使用后者。在本附錄中,我們只考慮兩個(gè)寄存器

之間的相等比較。在所有的RISC指令系統(tǒng)中,分支的目標(biāo)地址都是通過在當(dāng)前的

PC值上加一個(gè)偏移量(在MIPS中為16位)來得到的。在很多RISC指令系統(tǒng)中都

提供了直接跳轉(zhuǎn)指令,但是在本附錄中我們不對這種方式進(jìn)行討論。

A.1.3一個(gè)RISC指令系統(tǒng)的簡單實(shí)現(xiàn)

為了更好的理解在流水線方式下如何實(shí)現(xiàn)一個(gè)RISC指令系統(tǒng),我們首先需要理解在非

流水線情況下RISC指令系統(tǒng)是如何實(shí)現(xiàn)的。本節(jié)介紹一種簡單的實(shí)現(xiàn)方案,在這種實(shí)現(xiàn)方

案中,執(zhí)行每條指令最多只需5個(gè)時(shí)鐘周期。當(dāng)把該實(shí)現(xiàn)方案擴(kuò)展到流水線之后,CPI將大

幅度降低。該方案并不是最經(jīng)濟(jì)和最高效的非流水線實(shí)現(xiàn)方案——實(shí)際上它只是用來使引入

流水線概念變得更加自然。我們將在本章稍后說明該方案如何改進(jìn)。在實(shí)現(xiàn)指令集的時(shí)候需

要一些并不屬于這個(gè)系統(tǒng)結(jié)構(gòu)的臨時(shí)寄存器,我們引入這些寄存器以簡化流水線.

每一條RISC指令的執(zhí)行至多需要5個(gè)時(shí)鐘周期。這5個(gè)時(shí)鐘周期如下:

1.取指令周期(IF)

根據(jù)PC指示的地址從存儲器中取指令并裝入到指令寄存器(IR)中,同時(shí)PC加4(因

為每條指令是4個(gè)字節(jié))以獲取下一條指令的地址。

2.指令譯碼/讀寄存器周期(ID)

對指令進(jìn)行譯碼并訪問寄存器堆以讀出寄存器中內(nèi)容。對寄存器中的內(nèi)容進(jìn)行比較,判

斷是否是分支指令。如果需要對偏移量進(jìn)行處理,則把增量之后的PC值與偏移量相加,得

到可能的分支目標(biāo)的地址。如果分支的判斷結(jié)果為“真”,則把分支處理的目標(biāo)地址寫入PC,

且在本段的結(jié)束時(shí)分支必須被處理完成。

由于RISC指令系統(tǒng)指定的寄存器位置是固定的,使得譯碼過程和讀指令的過程可以同

時(shí)進(jìn)行。這種技術(shù)稱為“固定域譯碼”。注意,我們可能會讀取一個(gè)并沒有使用的寄存器,

這不會對指令的執(zhí)行產(chǎn)生任何影響(但是,這種讀取確實(shí)浪費(fèi)了能量,在對功耗要求比較嚴(yán)

格的設(shè)計(jì)中,要盡量避免發(fā)生這種問題)。由于指令的立即數(shù)部分也保存在相同的位置,所

以對于需要擴(kuò)展立即數(shù)的操作也可以在本時(shí)鐘周期內(nèi)進(jìn)行。

3.執(zhí)行/有效地址周期(EX)

ALU指令對上一個(gè)時(shí)鐘周期準(zhǔn)備好的操作數(shù)進(jìn)行運(yùn)算,根據(jù)指令的類型執(zhí)行下面三個(gè)功

能中的一個(gè):

?訪問存儲器:

通過ALU對基址寄存器和偏移量進(jìn)行加法運(yùn)算形成有效地址。

?寄存器-寄存器ALU指令:

ALU根據(jù)操作碼對從寄存器堆中讀取的數(shù)據(jù)進(jìn)行運(yùn)算。

?寄存器-立即數(shù)ALU指令

ALU根據(jù)操作碼對從寄存器堆中讀取的第一個(gè)操作數(shù)和擴(kuò)展后的立即數(shù)進(jìn)行運(yùn)算。

在一個(gè)Load/Store體系結(jié)構(gòu)中,因?yàn)闆]有指令需要在計(jì)算數(shù)據(jù)地址和指令目標(biāo)地址的

同時(shí)對操作數(shù)進(jìn)行運(yùn)算,所以有效地址周期和指令執(zhí)行周期可以合并在同一個(gè)時(shí)鐘周期內(nèi)。

4.訪問存儲器(MEM)

如果是load指令,將根據(jù)前一個(gè)周期計(jì)算得到的有效地址從存儲器中讀取數(shù)據(jù)。如果

是store指令,則根據(jù)有效地址將第二個(gè)寄存器中的數(shù)據(jù)寫入存儲器中。

5.寫回周期(WB)

?寄存器-寄存器ALU指令/Load指令

將結(jié)果寫入寄存器堆。結(jié)果可能來自存儲器,或者來自ALU。

在這種實(shí)現(xiàn)方法中,分支指令需要2個(gè)周期,Store指令需要4個(gè)周期,而所有其他的

指令需要5個(gè)周期。假定分支的頻度為12%,Store的頻度為10%,那么總的CPI為4.54。

這種實(shí)現(xiàn)方法在獲取高性能與在相同性能條件下使用最少硬件方面都不是最優(yōu)的。我們把改

進(jìn)這種設(shè)計(jì)的任務(wù)作為練習(xí)留給讀者自己來完成。

A.1.4經(jīng)典的5段流水線RISC處理器

我們只需簡單地在每一個(gè)時(shí)鐘周期啟動一條新的指令就可以使上面所描述的指令執(zhí)行

過程變?yōu)榈牧魉€(由此可以看到我們?yōu)槭裁催x擇這個(gè)實(shí)現(xiàn)方案?。?。前一節(jié)中的每?個(gè)時(shí)鐘

周期就成了一個(gè)流水節(jié)拍,即流水線的一個(gè)周期,如圖A.1所示的指令執(zhí)行模式,在這個(gè)圖

中使用了流水線結(jié)構(gòu)的典型畫法。其中,每一條指令經(jīng)過5個(gè)時(shí)鐘周期執(zhí)行完成,在每一個(gè)

時(shí)鐘周期內(nèi),硬件將啟動?條新的指令并執(zhí)行5條不同指令的某個(gè)階段。

時(shí)鐘

指令123456789

指令iIFIDEXMEMWB

指令i+1IFIDEXMEMWB

指令i+2IFIDEXMEMWB

指令i+3IFIDEXMEMWB

指令i+4IFIDEXMEMWB

圖A.1簡單RISC流水線。在每一個(gè)時(shí)鐘周期都有一條新的指令取進(jìn)來并開始長達(dá)5個(gè)時(shí)

鐘周期的執(zhí)行過程.若在每一個(gè)時(shí)鐘周期都啟動一條新的指令,那么性能將是不進(jìn)行

流水處理的機(jī)器的5倍。流水線每一個(gè)節(jié)拍的名稱與前面講的非流水線的處理周期的

名稱相同:IF=取指令、ID=指令譯碼、EX=執(zhí)行指令、MEM=存儲器訪問、WB

=寫回結(jié)果。

也許你難以理解流水線竟然會如此簡單,你的直覺是對的,實(shí)際上它并不簡單。在這一

節(jié)和后面的幾節(jié)里,我們將討論一些因?yàn)榱魉氲膯栴},從中你可以對RISC流水線有

一個(gè)真正的認(rèn)識。

作為開始,我們需要確定機(jī)器在每一個(gè)時(shí)鐘周期都進(jìn)行什么樣的動作,并保證在同一個(gè)

時(shí)鐘周期沒有兩條指令使用相同的數(shù)據(jù)通路資源。例如,一個(gè)ALU不能同時(shí)用于計(jì)算有效地

址和做減法運(yùn)算。因此,我們必須保證流水線中指令的重疊不會導(dǎo)致這樣的沖突。幸運(yùn)的是,

由于RISC指令集比較簡單.,因此評定資源占用情況比較容易。圖A.2給出了流水線方式下

簡化的RISC數(shù)據(jù)通路。你可以看到,主要的功能部件都在不同的時(shí)鐘周期使用,因此多條

指令的重疊執(zhí)行引起的沖突很少。這從下面三點(diǎn)可以看出。

一廚而(時(shí)鐘周期)

Time(indockcycles)-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------?

IM

程序執(zhí)行順序(指令序列)

圖A.2流水線可以看作是隨時(shí)間移動的一系列數(shù)據(jù)通路。這張圖顯示了不同數(shù)據(jù)通路的重

疊,其中周期5(CC5)表示穩(wěn)定狀態(tài)。由于寄存器堆在EX節(jié)拍被讀,在WB節(jié)拍

被寫,它就出現(xiàn)了兩次。在包圍每個(gè)節(jié)拍的線框中,如果實(shí)線在右側(cè),說明是讀操作,

如果實(shí)線在左側(cè),說明是寫操作;別的部分用虛線??s寫IM表示指令存儲器,DM

表示數(shù)據(jù)存儲器,CC表示時(shí)鐘周期。

首先,上一節(jié)給出的基本的數(shù)據(jù)通路已經(jīng)使用了分開的指令和數(shù)據(jù)存儲器,其典型的實(shí)

現(xiàn)方式是使用的分開的指令和數(shù)據(jù)Cache(在第五章中討論)。使用獨(dú)立的Cache避免了對

單一存儲器進(jìn)行取指令和訪問數(shù)據(jù)操作之間的沖突。應(yīng)該注意的是,如果我們的流水線機(jī)器

的時(shí)鐘周期和沒有流水的機(jī)器相同,存儲系統(tǒng)的帶寬必須是原先的5倍,這就是取得高性能

的一個(gè)代價(jià)。

其次,寄存器堆在兩個(gè)流水節(jié)拍中被使用:ID節(jié)拍讀,WB節(jié)拍寫。這兩種使用是截然

不同的,因此我們簡單地在兩個(gè)地方畫出了寄存器堆。這確實(shí)意味著在一個(gè)時(shí)鐘周期需要執(zhí)

行兩次讀和一次寫。為了處理對同一個(gè)寄存器的讀利寫(這樣處理的其他原因在不久就會看

到),我們在一個(gè)時(shí)鐘周期的前半部分進(jìn)行寫寄存器操作,在該時(shí)鐘周期的后半部分進(jìn)行讀

寄存器操作。

最后,圖A.2并沒有涉及到PC。為了在每一個(gè)時(shí)鐘周期都能夠啟動一條新的指令,需

要每個(gè)周期都對PC進(jìn)行自加運(yùn)算并寫回結(jié)果,這項(xiàng)工作必須在IF節(jié)拍完成,以便為下一條

指令做好準(zhǔn)備。此外在ID節(jié)拍,我們還要為可能的分支目標(biāo)地址的計(jì)算準(zhǔn)備一個(gè)加法器。

一個(gè)需要更進(jìn)一步考慮的問題是,分支指令只是在ID節(jié)拍才對PC的值進(jìn)行改寫,這種變化

引入了如何來處理分支的問題?這里,我們先忽略它,以后再討論這個(gè)問題。

盡管確保流水線中的指令在同一時(shí)間不會使用相同的硬件資源是非常重要的,但是我們

還需要確保在流水線不同節(jié)拍中的指令不會互相的影響。我們通過在連續(xù)的流水線節(jié)拍中引

入流水線寄存器來解決這個(gè)問題。在每個(gè)時(shí)鐘周期結(jié)束之后,該節(jié)拍的所有執(zhí)行結(jié)果都保存

在流水線寄存器中,以作為下一個(gè)時(shí)鐘周期,即下一個(gè)節(jié)拍的輸入。圖A.3是添加了流水

線寄存器的流水線結(jié)構(gòu)圖。

Tme(indockcyctefiy

圖A.3通過在各個(gè)流水節(jié)拍之間增加一系列寄存器來進(jìn)行流水。這些寄存器用于在一個(gè)流

水節(jié)拍和下一個(gè)流水節(jié)拍之間進(jìn)行數(shù)據(jù)傳遞和信息控制。這些寄存器還起到了把指

令執(zhí)行過程中一個(gè)階段產(chǎn)生的數(shù)據(jù)傳遞給另一個(gè)階段的重要作用。

盡管再很多流水線結(jié)構(gòu)圖中,為了簡單起見省略了這些流水線寄存器,但是為了流水線

的正常工作,它們是必須的。當(dāng)然,類似的寄存器在沒有流水線的多循環(huán)數(shù)據(jù)通路中也是需

要的(因?yàn)橹挥性诩拇嫫髦械臄?shù)據(jù)可以在時(shí)鐘的跳變中被保存下來)。在流水線處理器的例

子中,寄存器也扮演了重要的角色。流水線寄存器把一個(gè)流水線節(jié)拍的結(jié)果傳遞給需要這個(gè)

數(shù)據(jù)的下一級的流水線。例如:store指令所要存儲的寄存器數(shù)據(jù)值是在RF節(jié)拍被讀取的,

但是直到MEM節(jié)拍才被實(shí)際使用。在MEM節(jié)拍,該數(shù)據(jù)是經(jīng)過兩個(gè)流水線寄存器才到達(dá)

數(shù)據(jù)存儲器中的。同樣的,ALU指令是在EX節(jié)拍進(jìn)行計(jì)算的,但是直到WB節(jié)拍才被真

正的保存,該結(jié)果數(shù)據(jù)也是經(jīng)過兩個(gè)流水線寄存器才到達(dá)數(shù)據(jù)存儲器中的。有些時(shí)候,為寄

存器命名是很有用的。按照慣例,用和寄存器相連的流水線節(jié)拍來命名它們,例如:ID/IF,

IF/RF,RF/EX,ID/EX,EX/MEM,MEM/WBo

A.1.5流水線的基本性能

流水線增大了CPU的指令吞吐量——即單位時(shí)間完成的指令條數(shù),但是它沒有減少指

令各自的執(zhí)行時(shí)間。實(shí)際上,流水線技術(shù)經(jīng)常要對流水線附加一些控制,因而增加了開銷,

隨之使單條指令執(zhí)行時(shí)間略有增加。吞吐量的增大意味著程序運(yùn)行得更快,總的執(zhí)行時(shí)間變

短,盡管沒有任何一條指令的執(zhí)行變快!

由于流水線沒有真正減少每條指令的執(zhí)行時(shí)間,這就限制了流水線的深度,關(guān)于這個(gè)問

題,我們將在下一節(jié)中討論。除了流水線延遲引起的限制,流水節(jié)拍的不平衡和流水線的附

加開銷也引入了某些限制。流水節(jié)拍不平衡引起的限制,是因?yàn)闀r(shí)鐘不能快于最慢的流水節(jié)

拍。流水線的附加開銷引起的限制則是因?yàn)榱魉€寄存器的延遲和時(shí)鐘偏移。流水線寄存器

或鎖存器對時(shí)鐘周期增加了啟動時(shí)間和傳輸延遲,時(shí)鐘偏移也有這種作用。時(shí)鐘偏移是指在

時(shí)鐘到達(dá)的時(shí)候任何兩個(gè)寄存器之間的延遲,而時(shí)鐘偏移的存在也導(dǎo)致了對時(shí)鐘周期的限

制。一旦時(shí)鐘周期很小,以至于與時(shí)鐘偏移和鎖存器附加開銷相當(dāng)時(shí),流水就沒有用處了,

因?yàn)樵谝粋€(gè)時(shí)鐘周期內(nèi)沒有足夠時(shí)間用于有效的工作了。對此問題感興趣的讀者可以參考

Kunkel和Smithll986Jo就像我們在第三章中看到的那樣,這種系統(tǒng)開銷影響了Pentium4與

Pentiumlll的性能提高。

例題A.1:讓我們考察上一節(jié)的非流水型機(jī)器。假設(shè)它的時(shí)鐘周期是1納秒,ALU操

作和分支操作需要4個(gè)時(shí)鐘周期,存儲器操作需要5個(gè)時(shí)鐘周期。以上操作的比例相應(yīng)為

40%、20%、40%。假設(shè)由于存在時(shí)鐘偏移和啟動時(shí)間,時(shí)鐘周期增加了0.2納秒,并忽略

延遲的影響,那么該流水線的加速比是多少?

解:在非流水線的機(jī)器上,指令平均執(zhí)行時(shí)間是:

指令平均執(zhí)行時(shí)間=時(shí)鐘周期X平均CPI

=1納秒義((40%+20%)*4+40%*5)

=1納秒X4.4

=4.4納秒

在流水線方式下,時(shí)鐘周期變慢為1+0.2,即1.2納秒,這就是指令平均執(zhí)行時(shí)間。于

是加速比為:

流水線加速比=非流水線指令平均執(zhí)行時(shí)間/流水線指令平均執(zhí)行時(shí)間

=4.4ns/1.2ns=3.7

0.2納秒的附加開銷對流水線的效率附加了限制。如果不同時(shí)鐘周期下附加的開銷相同,

那么,使用Amdahl法則就可以知道附加開銷限制了加速比不能無限增大。

如果在流水線中執(zhí)行的每條指令之間都是互相不相關(guān)的,那么這個(gè)簡單的RISC指令系

統(tǒng)可以很好的在該流水線結(jié)構(gòu)中執(zhí)行。

A.2流水線的主要障礙一一流水線冒險(xiǎn)

有一些稱為“冒險(xiǎn)”的情形,它使得指令流中下一條指令無法在設(shè)計(jì)的時(shí)鐘周期執(zhí)行,

這些冒險(xiǎn)將會降低流水線可能獲得的理想性能。有三類冒險(xiǎn):

1.結(jié)構(gòu)冒險(xiǎn):當(dāng)硬件在指令重疊執(zhí)行中不能支持指令所有可能的組合時(shí)發(fā)生的資源沖

突。

2.數(shù)據(jù)冒險(xiǎn):在同時(shí)執(zhí)行的兒條指令中,一條指令依賴于前一條指令的數(shù)據(jù),卻得不

到時(shí)發(fā)生的冒險(xiǎn)。

3.控制冒險(xiǎn):流水線中的分支指令或其他改寫PC的指令造成的冒險(xiǎn)。

流水線中的“冒險(xiǎn)”引起流水線暫停。要消除冒險(xiǎn)就要求流水線中的部分指令正常處理,

而部分指令可以被延遲執(zhí)行。對本章中討論的流水線,當(dāng)一條指令被暫停后,流水線中所有

該指令之后的指令都會被暫停。流水線中該指令之前的指令還是正常執(zhí)行,否則冒險(xiǎn)就不可

能被消除。這種處理的結(jié)果就是:當(dāng)發(fā)生流水線暫停時(shí),就不能再啟動新的指令。在本節(jié)我

們將考察幾個(gè)流水線如何被暫停的例子。別擔(dān)心,它們不象聽起來那么復(fù)雜。

A.2.1有暫停的流水線性能

暫停會使流水線性能比理想情況差,我們用上一節(jié)的一個(gè)公式,通過一個(gè)簡單的等式來

看實(shí)際情況下流水線的加速比。

非流水線指令平均執(zhí)行時(shí)間

流水線加速比=

流水線指令平均執(zhí)行時(shí)間

非流水CPIX非流水時(shí)鐘周期

流水CPIX流水時(shí)鐘周期

非流水CPI非流水時(shí)鐘周期

X

流水CPI----流水時(shí)鐘周期

需要注意的是,流水線可以看作是減小了CPI或減小了時(shí)鐘周期的長度。我們可以按照

傳統(tǒng)的比較流水線的方法來使用CPI。流水線機(jī)器的理想CPI差不多總是1,因此流水線的

實(shí)際CPI是:

流水線CPI=理想CPI+每條指令的暫停周期數(shù)

=1+每條指令的暫停周期數(shù)

如果忽略流水線的附加開銷,并假設(shè)流水節(jié)拍調(diào)整得很好,則兩臺機(jī)器的時(shí)鐘周期可以

相等,因此

加速比—非流水線CPI

1+每條指令的流水線暫懶期數(shù)

一種簡單的情況是所有指令執(zhí)行時(shí)需要的時(shí)鐘周期數(shù)都相等,于是我們必須平衡它們的

流水節(jié)拍數(shù)(又稱為流水線深度)。此時(shí)非流水CPI等于流水線節(jié)拍數(shù),因此

加速比=流水線深度

1+每條指令的流水線暫停周期數(shù)

如果沒有引入流水線暫停,流水線的性能可以隨深度的增加而明顯改善。

換個(gè)角度,如果我們把流水線看作是減小了時(shí)鐘周期的長度,那么可以象流水線機(jī)器」

樣假設(shè)非流水機(jī)器的CPI是1。因此有:

非流水線CPI非流水線時(shí)鐘周期數(shù)

流水線加速比=

流水線CPI流水線時(shí)鐘周期數(shù)

1非流水線時(shí)鐘數(shù)

=-------------------------------------------------------------------------X------------------------------------------

1+每條指令的流水線暫停周期數(shù)流水線時(shí)鐘周期數(shù)

對于流水節(jié)拍已經(jīng)很好地平衡,而且沒有附加開銷的情況,非流水機(jī)器的時(shí)鐘周期長度

與流水線機(jī)器的時(shí)鐘周期長度之比等于流水線深度:

非流水線時(shí)鐘周期

流水線時(shí)鐘周期數(shù)=

流水線深度

非流水線時(shí)鐘周期數(shù)

流水線深度=

流水線時(shí)鐘周期數(shù)

于是有:

--------------------------------------------------------------------------X-----------------------------------------

1+每條指令的流水線暫停周期數(shù)流水線時(shí)鐘周期數(shù)

1+每條指令的流水線暫停周期數(shù)

因此,當(dāng)沒有暫停時(shí),加速比等于流水節(jié)拍數(shù),與理想情況吻合。

A.2.2結(jié)構(gòu)冒險(xiǎn)

當(dāng)處理器進(jìn)行流水處理的時(shí)候,指令的重疊執(zhí)行要求功能部件能夠流水,而且資源重復(fù)

設(shè)置,以便流水線中的指令能自山組合。如果因?yàn)橘Y源沖突而無法使用某種指令的組合,那

么這臺機(jī)器就被稱做是有結(jié)構(gòu)沖突的。

最常見的結(jié)構(gòu)沖突出現(xiàn)在部分功能部件沒有充分流水的時(shí)候,此時(shí)?系列使用該部件的

指令不能按照每個(gè)時(shí)鐘周期前進(jìn)一拍的速率流水。另一種常見的結(jié)構(gòu)沖突是因?yàn)槟承┵Y源沒

有充分重復(fù)設(shè)置,于是不能足以讓流水線中的若干條指令同時(shí)執(zhí)行。例如,一臺機(jī)器只有一

個(gè)寄存器堆寫入端口,但在某些情況下,流水線可能要求在一個(gè)時(shí)鐘周期內(nèi)寫入兩次,這將

產(chǎn)生一個(gè)結(jié)構(gòu)冒險(xiǎn)。

當(dāng)有一系列指令遇到這種冒險(xiǎn)時(shí),流水線將暫停其中的一條指令,直到所需的功能單元

能夠使用為止。這種暫停將把CPI從理想值1增大。

某些流水線機(jī)器的指令和數(shù)據(jù)共享同一個(gè)存儲器,結(jié)果是當(dāng)一條指令包含有數(shù)據(jù)引用

時(shí),它將與下一條指令的取指令沖突,如圖A.4所示。為了消除這種沖突,當(dāng)需要訪問數(shù)據(jù)

存儲器時(shí)就把流水線暫停一個(gè)時(shí)鐘周期。暫停通常叫作“流水氣泡”或者“氣泡”,因?yàn)樗?/p>

在流過流水線的過程中只是占據(jù)了空間而不做實(shí)際有效的工作。當(dāng)討論數(shù)據(jù)冒險(xiǎn)時(shí)我們還會

看到另一種暫停。

設(shè)計(jì)者通常不是每次都畫出流水線的數(shù)據(jù)通路,而是用一個(gè)只有流水節(jié)拍名稱的簡化圖

來表示暫停,如圖A.5。表示暫停的方法是當(dāng)沒有實(shí)際操作時(shí)就標(biāo)出該周期,并簡單的將指

令3右移(將指令3的啟動和結(jié)束均延后一個(gè)時(shí)鐘周期)。流水氣泡的后果就是在它流過流

水線的過程中占據(jù)資源。

時(shí)鐘

指令12345678910

Load指令I(lǐng)FIDEXMEMWB

指令i+1IFIDEXMEMWB

指令i+2IFIDEXMEMWB

指令i+3暫停IFIDEXMEMWB

指令i+4IFIDEXMEMWB

指令i+5IFIDEXMEM

指令i+6IFIDEX

圖A.5單端口存儲器的load操作引起控制冒險(xiǎn)時(shí)的流水線暫停。load指令有效地竊取了

一個(gè)取指令周期,于是流水線被暫停。在時(shí)鐘周期4沒有指令進(jìn)入流水線(正常情況

F應(yīng)該是指令3進(jìn)入流水線)。因?yàn)樽x入的指令被暫停,所有該指令之前的指令都能

夠正常處理。暫停周期將流過流水線,結(jié)果是在時(shí)鐘周期8沒有任何指令執(zhí)行完成。

有時(shí),把這種流水線圖表畫成“暫?!闭紦?jù)一整行,指令3移到下一行。兩種情況的

效果是一樣的,因?yàn)橹噶?到時(shí)鐘周期5才開始執(zhí)行。我們采用上面的圖只是為了節(jié)

省空間。

例題A.2:讓我們看一下load控制冒險(xiǎn)造成的影響有多大。假設(shè)數(shù)據(jù)引用占指令的40%,

在忽略控制冒險(xiǎn)的前提下流水線的理想CPI是1。若有控制冒險(xiǎn)機(jī)器的時(shí)鐘速率是無控制冒

險(xiǎn)機(jī)器時(shí)鐘速率的1.05倍。假設(shè)沒有別的性能損耗,兩種流水線哪個(gè)更快?快多少?

解:該題有多種的解法,大概最簡單的方法是計(jì)算兩種機(jī)器的指令平均執(zhí)行時(shí)間:

指令平均執(zhí)行時(shí)間=CPIX時(shí)鐘周期長度

由于沒有暫停,理想情況下的平均指令執(zhí)行時(shí)間就是時(shí)鐘周期長度。有控制冒險(xiǎn)的機(jī)器

指令平均執(zhí)行時(shí)間是:

指令平均執(zhí)行時(shí)間=CPIX時(shí)鐘周期長度

=(1+O.4X1)X理想時(shí)鐘周期長度

1.05

=L3X理想時(shí)鐘周期長度

顯然,沒有結(jié)構(gòu)冒險(xiǎn)的機(jī)器更快。用指令平均執(zhí)行時(shí)間來計(jì)算,沒有結(jié)構(gòu)冒險(xiǎn)的機(jī)器大

約要快0.3倍。

對該結(jié)構(gòu)冒險(xiǎn)的一種改進(jìn)方案是為指令提供單獨(dú)的存儲器,具體的是把cache分為指令

cache與數(shù)據(jù)cache,或者用一個(gè)單獨(dú)的緩沖站來保存指令,稱為指令緩沖校。這兩種方法均

在第五章中討論。

當(dāng)別的因素相同時(shí),沒有結(jié)構(gòu)冒險(xiǎn)的機(jī)器CPI較小。那么為什么設(shè)計(jì)人員允許結(jié)構(gòu)冒

險(xiǎn)存在呢?有兩個(gè)原因:降低成本或者減少部件延遲。對于各種功能部件,實(shí)現(xiàn)流水或者復(fù)

制功能部件有可能使成本過高。例如,每個(gè)周期都允許訪問指令和數(shù)據(jù)cache的機(jī)器(為了

防止上例中的結(jié)構(gòu)冒險(xiǎn))需要兩倍的內(nèi)存帶寬,也需要更高帶寬的管腳。類似的是,完整流

水的浮點(diǎn)乘法器需要很多邏輯門。如果結(jié)構(gòu)冒險(xiǎn)不經(jīng)常出現(xiàn),那么消除結(jié)構(gòu)冒險(xiǎn)的成本就顯

得太高了。

A.2.3數(shù)據(jù)冒險(xiǎn)

流水線的?個(gè)主要影響是通過重疊執(zhí)行指令來改變指令的相對執(zhí)行時(shí)間。當(dāng)流水線改變

操作數(shù)的讀寫順序,使得順序與非流水時(shí)的指令序列不同時(shí),就會出現(xiàn)數(shù)據(jù)冒險(xiǎn)。請看下面

的指令如何在流水線中執(zhí)行:

DADDRI,R2,R3

DSUBR4,R5,RI

ANDR6,Rl,R7

ORR8,RI,R9

XORRIO,RI,RU

DADD指令后的所有指令都用到DADD指令的執(zhí)行結(jié)果。如圖A.6所示,DADD操作在WB

節(jié)拍寫R1,而DSUB操作在ID節(jié)拍讀R1,這就稱為數(shù)據(jù)冒險(xiǎn)。除非采取預(yù)防措施,否則SUB

操作讀出的將是錯誤的值,并錯誤到使用它。實(shí)際上,DSUB操作使用的值甚至是不確定的:

盡管我們可能認(rèn)為DSUB使用的是DADD之前R1的值,但不定總是這樣。如果在DADD與

DSUB之間發(fā)生了一次中斷,DADD指令的WB節(jié)拍就可以完成,于是R1提供給DSUB操作的就

是DADD操作的結(jié)果。這種不確定性顯然,難以容忍的。

,時(shí)間(時(shí)鐘周期)

Time(inclockcycles)

(

us

go

nu

wj

c

M

o

-

。

U

。

U3

?

ex

eE

SJ

JO

o.

圖A.6DADD操作的結(jié)果在后面三條指令中都使用,這就產(chǎn)生了數(shù)據(jù)冒險(xiǎn),因?yàn)榧拇嫫髟?/p>

那三條指令讀之后才被DADD操作寫入。

AND操作也受該冒險(xiǎn)的影響,從圖A.6可見,寫R1直到時(shí)鐘周期5才能完成。于是,

在時(shí)鐘周期4讀寄存器的AND操作取出的結(jié)果是錯誤的。

XOR操作得到了正確執(zhí)行,因?yàn)樗x寄存器是在周期6,此時(shí)R1已被正確寫入。OR操

作也可以沒有冒險(xiǎn),這只需要使用一個(gè)已經(jīng)在流水線圖表中畫出的簡單技巧,就是在前半個(gè)

周期讀寄存器堆,在后半個(gè)周期寫。這種技巧在前面的圖中通過在寄存器堆周圍畫的虛線框

來表示。

卜面介紹用來消除SUB操作和AND操作數(shù)據(jù)冒險(xiǎn)的技巧。

A.2.4使用旁路減少數(shù)據(jù)冒險(xiǎn)引起的暫停

圖A.6的問題可以用一個(gè)簡單的硬件技術(shù)來解決,這種技術(shù)稱為“旁路”(也稱為直接

通路,有時(shí)也叫做短路),其關(guān)鍵是注意到了DSUB操作是在DADD操作產(chǎn)生了結(jié)果后才

真正使用這個(gè)結(jié)果的。如果把DADD的結(jié)果從EX/MEM寄存器移到DSUB需要的地方,

即ALU的輸入鎖存器,那么就沒有必要引入暫停了。通過以上觀察可知旁路的工作流程為:

1.從EX/MEM流水線寄存器送入到ALU的結(jié)果總是反饋到ALU的輸入鎖存器。

2.如果旁路硬件檢測到靠前的ALU操作寫入寄存器堆時(shí);是使用當(dāng)前ALU操作的結(jié)

果作為源操作數(shù),那么控制邏輯就選擇旁路結(jié)果作為ALU的輸入,而不是從寄存

器堆讀出源操作數(shù)。

請注意,在使用旁路時(shí).,如果DSUB操作被暫停,那么DADD操作將完整執(zhí)行,于是

沒有必要激活旁路。當(dāng)這兩個(gè)操作之間有一個(gè)中斷時(shí)也是如此。

象圖A.6所示的那樣,我們需要旁路的操作數(shù)可能不止是來自最近的操作,而且來自前

面三個(gè)周期啟動的操作。圖A.7就表明了這一點(diǎn),并注明了寄存器讀寫的時(shí)刻。執(zhí)行這條指

令序列不需要暫停。

一-------1時(shí)間(時(shí)鐘周期)

Time(incbckcycleej----------------------------------------------------------------------------------------------------------------------------?

(

g

u

o

q

o

M

g

c

_u

』)

P8

0J

u

o

=

n

<x>

aE>

e

IM

圖A.7一些依賴ADD操作結(jié)果的指令使用旁路來避免數(shù)據(jù)冒險(xiǎn)。從EX/MEM和MEM/WB

流水線寄存器到SUB和AND的輸入被旁路到ALU部件的第一個(gè)輸入端。OR操作

通過旁路接收數(shù)據(jù),這只需要象圖中虛線畫的那樣對寄存器在前半個(gè)周期寫、后半個(gè)

周期讀。請注意旁路結(jié)果可以從ALU部件的任一個(gè)輸入端進(jìn)入,實(shí)際上ALU可以

使用從同一個(gè)或不同流水線寄存器來的旁路輸入。例如,對指令A(yù)NDR6,R1,R4就是

這樣。

旁路思想可以一般化,即把結(jié)果直接送到需要它的功能部件:一個(gè)結(jié)果能夠從一個(gè)部件

的輸出直接送到另一個(gè)部件的輸入。如下面的序列:

DADDRI,R2,R3

LDR4,O(R1)

SDR4,12(R1)

為了避免在該指令序列中引起暫停,就需要把ALU和內(nèi)存單元的輸出結(jié)果從流水線寄存

器的輸出旁路到ALU和數(shù)據(jù)存儲器的輸入。圖A.8畫出了該序列的所有旁路。

,。

):于

結(jié)了端同一啟寄在

的為畫列。有從

出不后它

d,有序據(jù)要R

a輸形之O管

o外把沒令數(shù)需作盡

L指情為

。此與中要路操,

。的的需d因了

路這圖旁a,

端((面作就o晚

旁種l理

入端作下操時(shí)太

的U這于同

輸入看L始得

數(shù)操A,L

器輸請開對I到

作U的示L

儲的L。期。A來

操A饋所

存它決周9的到據(jù)

該個(gè)反.

的到解該A現(xiàn)路數(shù)

了一來帶實(shí)

它路在圖旁的

出前法與B法

存旁U如器入

畫保端于方它S無

圖。存送

于出賴的。而本,

本險(xiǎn)寄

用輸依路示,冒根B作

,eW。

到的r旁表據(jù)據(jù)員/操

數(shù)ot9MB得

路件s用.數(shù)數(shù)人EU

作AM獲

旁部果采到的計(jì)S

操以圖設(shè)從才

端U如得成對

個(gè)L用刻時(shí)

出??赡茉鞕C(jī)而

一A)。險(xiǎn)徑立束

輸,都才作算。

要別停險(xiǎn)路)計(jì)果題結(jié)

器址冒579操

需儲區(qū)暫冒RRR據(jù)期d是結(jié)問在

地?fù)?jù))2a

拍存的有免據(jù)R,,,數(shù)周o這把的卻

^(IIIMl

et節(jié)沒避數(shù)0RRR線,它殊,

c從作數(shù)E

yM并以的水M由路為據(jù)

c拍

溫馨提示

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

評論

0/150

提交評論