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