Atiitt 流水線(xiàn)停頓問(wèn)題與解決方法
Atiitt 流水線(xiàn)停頓問(wèn)題與解決方法
?
1. 流水線(xiàn)技術(shù)方式分類(lèi) 1
2. 但在實(shí)際中,會(huì)出現(xiàn)2種情況使流水線(xiàn)停頓下來(lái)或不能啟動(dòng): 2
2.1. 1、多個(gè)任務(wù)在同一時(shí)間周期內(nèi)爭(zhēng)用同一個(gè)流水段 2
2.2. 數(shù)據(jù)依賴(lài)。 2
3. 處理器流水線(xiàn)中的沖突 2
3.1. 7.1?流水線(xiàn)中的資源沖突 2
3.2. 7.2?流水線(xiàn)中的數(shù)據(jù)沖突 3
4. 為了能夠盡可能的減少流水線(xiàn)停頓帶來(lái)的性能損失,可以使用“動(dòng)態(tài)調(diào)度”的方法 3
?
?
1.?流水線(xiàn)技術(shù)方式分類(lèi)
3、按連接的方式分類(lèi):
靜態(tài)流水線(xiàn):同一時(shí)間內(nèi),多功能結(jié)構(gòu)只能按一種功能的連接方式工作。
動(dòng)態(tài)流水線(xiàn):同一時(shí)間內(nèi),可以有多種功能的連接方式同時(shí)工作。
4、按處理的數(shù)據(jù)類(lèi)型分類(lèi):
標(biāo)量流水線(xiàn):一般數(shù)據(jù)
向量流水線(xiàn):矢量數(shù)據(jù)。X+Y=Z每一個(gè)代表一維數(shù)據(jù)。
5、流水線(xiàn)結(jié)構(gòu)上分類(lèi):
線(xiàn)性流水線(xiàn):指各功能模塊順序串行連接,無(wú)反饋回路,如前面介紹的。
非線(xiàn)性流水線(xiàn):帶有反饋回路的流水線(xiàn)。
?
?
?
2.?但在實(shí)際中,會(huì)出現(xiàn)2種情況使流水線(xiàn)停頓下來(lái)或不能啟動(dòng):
流水線(xiàn)技術(shù)
2.1.?1、多個(gè)任務(wù)在同一時(shí)間周期內(nèi)爭(zhēng)用同一個(gè)流水段
。例如,假如在指令流水線(xiàn)中,如果數(shù)據(jù)和指令是放在同一個(gè)儲(chǔ)存器中,并且訪(fǎng)問(wèn)接口也只有一個(gè),那么,兩條指令就會(huì)爭(zhēng)用儲(chǔ)存器;在一些算數(shù)流水線(xiàn)中,有些運(yùn)算會(huì)同時(shí)訪(fǎng)問(wèn)一個(gè)運(yùn)算部件。
2.2.?數(shù)據(jù)依賴(lài)。
2、
比如,A運(yùn)算必須得到B運(yùn)算的結(jié)果,但是,B運(yùn)算還沒(méi)有開(kāi)始,A運(yùn)算動(dòng)作就必須等待,直到B運(yùn)算完成,兩次運(yùn)算不能同時(shí)執(zhí)行。
解決方案:
第一種情況,增加運(yùn)算部件的數(shù)量來(lái)使他們不必爭(zhēng)用同一個(gè)部件;
第二種情況,用指令調(diào)度的方法重新安排指令或運(yùn)算的順序。
3.?處理器流水線(xiàn)中的沖突
處理器的流水線(xiàn)設(shè)計(jì)中另外一個(gè)問(wèn)題便是流水線(xiàn)中的沖突(Hazards),主要分為資源沖突和數(shù)據(jù)沖突。
?
3.1.?7.1?流水線(xiàn)中的資源沖突
?
資源沖突是指流水線(xiàn)中硬件資源的沖突,最常見(jiàn)的是運(yùn)算單元的沖突,譬如除法器需要多個(gè)時(shí)鐘周期才能完成運(yùn)算,因此在前一條除法指令運(yùn)算完成之前,新的除法指令如果也需要除法器則會(huì)存在著資源沖突。在處理器的流水線(xiàn)中硬件資源沖突種類(lèi)還有較多,在此不做一一贅述。解決資源沖突的方法可以通過(guò)復(fù)制硬件資源或者流水線(xiàn)停頓等待硬件資源的方法解決。
?
3.2.?7.2?流水線(xiàn)中的數(shù)據(jù)沖突
?
數(shù)據(jù)沖突是指不同的指令之間的操作數(shù)存在數(shù)據(jù)相關(guān)性造成的沖突。常見(jiàn)的數(shù)據(jù)相關(guān)性包括:
?
WAR(Write-After-Read)相關(guān)性,又稱(chēng)先讀后寫(xiě)相關(guān)性:表示“后序執(zhí)行的指令需要寫(xiě)回的結(jié)果寄存器索引”與“前序執(zhí)行的指令需要讀取的源操作數(shù)寄存器索引”相同造成的數(shù)據(jù)相關(guān)性。因此,從理論上來(lái)講,在流水線(xiàn)中“后序指令”一定不能比和它有WAR相關(guān)性的“前序指令”先執(zhí)行,否則“后序指令”先寫(xiě)回了結(jié)果至通用寄存器組中,“前序指令”再讀取操作數(shù)時(shí),就會(huì)讀到錯(cuò)誤的數(shù)值。
?
WAW(Write-After-Write)相關(guān)性,又稱(chēng)先寫(xiě)后寫(xiě)相關(guān)性:表示“后序執(zhí)行的指令需要寫(xiě)回的結(jié)果寄存器索引”與“前序執(zhí)行的指令需要寫(xiě)回的結(jié)果寄存器索引”相同造成的數(shù)據(jù)相關(guān)性。因此,從理論上來(lái)講,在流水線(xiàn)中“后序指令”一定不能比和它有WAW相關(guān)性的“前序指令”先執(zhí)行,否則“后序指令”先寫(xiě)回了結(jié)果至通用寄存器組中,“前序指令”再寫(xiě)回結(jié)果至通用寄存器組中就會(huì)將其覆蓋。
?
RAW(Read-After-Write)相關(guān)性,又稱(chēng)先寫(xiě)后讀相關(guān)性:表示“后序執(zhí)行的指令需要讀取的源操作數(shù)寄存器索引”與“前序執(zhí)行的指令需要寫(xiě)回的結(jié)果寄存器索引”相同造成的數(shù)據(jù)相關(guān)性。因此,從理論上來(lái)講,在流水線(xiàn)中“后序指令”一定不能比和它有RAW相關(guān)性的“前序指令”先執(zhí)行,否則“后序指令”便會(huì)從通用寄存器組中讀回錯(cuò)誤的源操作數(shù)
?
4.?為了能夠盡可能的減少流水線(xiàn)停頓帶來(lái)的性能損失,可以使用“動(dòng)態(tài)調(diào)度”的方法
?
之所以RAW稱(chēng)之為真數(shù)據(jù)相關(guān),是因?yàn)槠錄](méi)有辦法通過(guò)寄存器重命名的方法將相關(guān)性去除。一旦產(chǎn)生RAW相關(guān)性,后序的指令一定要使用和它有RAW數(shù)據(jù)相關(guān)性的前序指令執(zhí)行完成的結(jié)果,從而造成流水線(xiàn)的等待停頓。為了能夠盡可能的減少流水線(xiàn)停頓帶來(lái)的性能損失,可以使用“動(dòng)態(tài)調(diào)度”的方法。動(dòng)態(tài)調(diào)度的思想本質(zhì)上可以歸結(jié)于以下方面:
?
一方面采用數(shù)據(jù)旁路傳播(Data?Bypass?and?Forward)技術(shù)盡可能的讓前序指令的計(jì)算結(jié)果更快的旁路傳播給后序相關(guān)指令的操作數(shù);
?
另一方面盡可能的讓后序相關(guān)指令在等待的過(guò)程中不阻塞流水線(xiàn)而讓其他無(wú)關(guān)的指令能夠繼續(xù)順利執(zhí)行。
?
早期的Tomasulo算法中通過(guò)保留站可以達(dá)到這兩方面的功效,但是保留站由于保存了操作數(shù)無(wú)法做到很大的深度(否則面積和時(shí)序的開(kāi)銷(xiāo)巨大)。
?
最新的高性能處理器普遍采用在每個(gè)運(yùn)算單元前配置亂序發(fā)射隊(duì)列(Issue?Queue)的方式,發(fā)射隊(duì)列僅追蹤RAW相關(guān)性而并不存放操作數(shù),因此可以做的很深(譬如16個(gè)表項(xiàng))。在發(fā)射隊(duì)列中的指令一旦相關(guān)性解除之后,再?gòu)陌l(fā)射隊(duì)列中發(fā)射出來(lái)讀取物理寄存器組(Physical?Register?File),然后發(fā)送給運(yùn)算單元開(kāi)始計(jì)算。
?
有關(guān)處理器的數(shù)據(jù)相關(guān)性問(wèn)題和包括動(dòng)態(tài)調(diào)度技術(shù)在內(nèi)的解決方法,如果闡述清楚幾乎可以單獨(dú)成書(shū),本文限于篇幅只能提綱挈領(lǐng)式的予以簡(jiǎn)述。