怎樣創(chuàng)作一個(gè)網(wǎng)站免費(fèi)建網(wǎng)站哪家好
1. 簡(jiǎn)介
執(zhí)行階段負(fù)責(zé)指令的執(zhí)行。然后將這個(gè)執(zhí)行的結(jié)果寫入到寄存器,或者是存儲(chǔ)器中。指令類型主要有ALU,負(fù)責(zé)算術(shù)運(yùn)算,邏輯運(yùn)算以及移位等操作;訪問存儲(chǔ)器的操作,load/store指令;控制程序流的操作,branch/jump/子程序調(diào)用CALL, 子程序返回return指令;特殊的指令,例如操作TLB的指令,存儲(chǔ)器隔離指令;浮點(diǎn)運(yùn)算指令。
2. ALU
1cycle alu運(yùn)算,包括加法運(yùn)算/減法運(yùn)算/邏輯運(yùn)算/移位運(yùn)算
多cycle的乘法和除法運(yùn)算也屬于算術(shù)運(yùn)算
3. BRU
處理程序控制類型指令,包括分支指令,跳轉(zhuǎn)指令,子程序調(diào)用指令,子程序返回指令。
對(duì)每條指令使用條件執(zhí)行的好處是可以降低分支指令使用的頻率。但缺點(diǎn)是條件碼占據(jù)了指令編碼的一部分,導(dǎo)致指令中分配給通用寄存器的部分變少了。同時(shí),條件執(zhí)行指令還會(huì)引入一個(gè)問題,就是我們的重命名過程會(huì)更加復(fù)雜,因?yàn)闂l件執(zhí)行會(huì)由于不執(zhí)行導(dǎo)致后續(xù)的寄存器出現(xiàn)錯(cuò)誤。
最簡(jiǎn)單的解決方式是碰到條件執(zhí)行的指令時(shí)發(fā)生stall,暫停流水線;或者我們推測(cè)執(zhí)行,等到發(fā)生錯(cuò)誤時(shí)再進(jìn)行flush。但由于經(jīng)常發(fā)生預(yù)測(cè)錯(cuò)誤,導(dǎo)致處理器的執(zhí)行效率不會(huì)很高。
還有一種解決方案,在條件執(zhí)行指令后面插入一條select-uop指令。
4. AGU
處理訪存指令,并完成虛擬地址到物理地址的轉(zhuǎn)化,以及從物理地址到數(shù)據(jù)的過程(D-cache訪問), 這個(gè)過程直接決定了處理器的性能,尤其對(duì)于load/store指令采用亂序執(zhí)行的處理器,需要一系列復(fù)雜的硬件來檢測(cè)各種違例的情況。
5. 旁路網(wǎng)絡(luò)
為了提高處理器的執(zhí)行效率,我們不可能等指令將結(jié)果寫到register file后,再?gòu)膔egister file讀數(shù)據(jù),因此我們需要從fu的輸出端到輸入端之間架起一個(gè)通路,也即旁路網(wǎng)絡(luò),當(dāng)如register file, payload RAM也需要這些數(shù)據(jù)
source drive: 數(shù)據(jù)從fprf中讀出來
result drive: 數(shù)據(jù)從bypass網(wǎng)路中過來
5.1 簡(jiǎn)單的旁路網(wǎng)絡(luò)設(shè)計(jì)
每個(gè)mux中的輸入包括所有的其它EU, 以及自身的EU和fprf
5.2 復(fù)雜的旁路網(wǎng)絡(luò)設(shè)計(jì)
數(shù)據(jù)的result drive 既可以是wb1, 也可以是wb2/wb3因?yàn)閿?shù)據(jù)寫到fprf還需要1個(gè)cycle, 計(jì)算周期越長(zhǎng),bypass網(wǎng)絡(luò)越復(fù)雜。
5.3 操作數(shù)的選擇
也即produced where, 操作數(shù)從哪個(gè)EU,那一拍計(jì)算得到, 通過一個(gè)scoreboard來記錄,指令在select階段,將它在哪個(gè)FU中執(zhí)行的信息寫到scoreboard中,并在流水線的wb階段,對(duì)scoreboard進(jìn)行更新。由于這個(gè)方案中讀取scoreboard的過程發(fā)生在流水線的Execute階段,這會(huì)對(duì)處理器的周期時(shí)間產(chǎn)生負(fù)面影響,因此為了提高頻率,可以將讀取scoreboard的過程放到流水線的RF read階段
5.4 cluster IQ
優(yōu)點(diǎn):
- 可以減少每個(gè)分布式發(fā)射隊(duì)列的端口個(gè)數(shù)
- 每個(gè)分布式發(fā)射隊(duì)列的仲裁電路只需要從少量的指令中進(jìn)行選擇,可以加快每個(gè)仲裁電路的速度
- 由于分布式發(fā)射隊(duì)列的容量較少,它其中的指令喚醒速度也會(huì)比較快
缺點(diǎn):
跨cluster的喚醒需要經(jīng)過更長(zhǎng)的走線,可能需要在這個(gè)中間添加一級(jí)流水線,這樣當(dāng)兩條存在相關(guān)性的相鄰指令屬于不同的cluster時(shí),就不能背靠背地執(zhí)行了,而是在流水線中引入了一個(gè)氣泡(bubble)
5.5 load/store 指令的處理
前面介紹的寄存器之間存在的相關(guān)性,即先寫后讀(RAW), 先寫后寫(WAW), 和先讀后寫(WAR), 都是在流水線的解碼階段可以發(fā)現(xiàn)并通過rename可以部分解決的。但是對(duì)于訪問存儲(chǔ)器的指令,訪問的地址只有在執(zhí)行階段才能被計(jì)算出來,才能知道他們是否存在相關(guān)性,同時(shí)地址的可能性是非常多的,對(duì)這些地址進(jìn)行重命名是非常難的事情。因此對(duì)于load/store指令,有三種執(zhí)行方式, 完全的順序執(zhí)行,部分的亂序執(zhí)行,完全的亂序執(zhí)行
5.5.1 完全的順序執(zhí)行
在超標(biāo)量處理器設(shè)計(jì)中一般不會(huì)采用這種方法,效率比較低
5.5.2 部分的亂序執(zhí)行
store指令仍然按照順序執(zhí)行,但是處于兩條store指令之間的所有l(wèi)oad指令可以亂序執(zhí)行。這個(gè)方法的本質(zhì)是當(dāng)一條store指令所攜帶的地址被計(jì)算出來之后,在它之后進(jìn)入到流水線的load指令可以去判斷先寫后讀的相關(guān)性了(RAW),每條load指令將它攜帶的地址計(jì)算出來之后,需要和前面所有已經(jīng)執(zhí)行的store指令攜帶的地址進(jìn)行比較,為實(shí)現(xiàn)這一功能,需要緩存(store buff)所有已經(jīng)被pick出來的store指令。如果load指令在store buffer中發(fā)現(xiàn)了地址相等的store指令, 則說明存在 (RAW)相關(guān)性, 我們需要記錄store指令的新老關(guān)系,如果用rid,那么比較邏輯較長(zhǎng),位寬較寬,可以為所有的store指令分配sid來記錄新老關(guān)系。
5.5.3 完全的亂序執(zhí)行
在這種方法中,store指令仍然會(huì)按照程序中指定的順序來執(zhí)行,但是load指令將不再受限于它前面的store指令,只要load指令的操作數(shù)準(zhǔn)備好了,就可以pick. store buffer由于是順序pick, 所以可以用一個(gè)FIFO來實(shí)現(xiàn),這樣可以減少pick的邏輯。load指令是亂序執(zhí)行的,要根據(jù)src ready和新老關(guān)系來綜合判斷。
6. load/store執(zhí)行單元
6.1 非阻塞Cache
I-cache 由于只需要讀取,而且取指令要求串行的順序,所以對(duì)它的處理是比較簡(jiǎn)單的。只有訪問存儲(chǔ)器的指令(load/store)才可以訪問D-Cache, 對(duì)于load/store指令來說,這兩種類型都有可能引起D-Cache發(fā)生缺失(miss)
- 對(duì)于load指令,它需要的數(shù)據(jù)不在D-cache就發(fā)生了缺失,就需要從下一級(jí)存儲(chǔ)器中拿數(shù)據(jù),并在D-CACHE中按照某種算法,找到一個(gè)cacheline 進(jìn)行寫入。如果這條cache line是dirty狀態(tài),還需要將這個(gè)line的數(shù)據(jù)塊先寫回到物理內(nèi)存中。
- 對(duì)于store指令,如果攜帶的地址不在D-CACHE, 那么首先需要從物理內(nèi)存中找到這個(gè)地址的數(shù)據(jù)塊,將其讀取出來,和store指令所攜帶的數(shù)據(jù)進(jìn)行合并, 并從D-Cache中按照某種算法,找到一個(gè)cache line,并合并之后的數(shù)據(jù)寫入到這個(gè)cache line;如果被替換的這個(gè)Cache line已經(jīng)標(biāo)記為dirty, 那么在寫入之前,還需要將這個(gè)被覆蓋的數(shù)據(jù)塊寫回到物理內(nèi)存中。
為了提高效率,即使發(fā)生了cache miss, 我們?nèi)匀粫?huì)處理后續(xù)的多條load指令,這樣會(huì)造成拿回來的data不知道屬于哪一條load指令的,因此我們需要記錄發(fā)生缺失的load/store指令。
6.2 關(guān)鍵字優(yōu)先
當(dāng)執(zhí)行一條訪問存儲(chǔ)器的指令而發(fā)生D-Cache缺失時(shí),如果等到數(shù)據(jù)塊所有的數(shù)據(jù)都寫到D-Cache之后才將所需要的數(shù)據(jù)送給cpu,這可能會(huì)讓cpu等待一段時(shí)間,為了提高效率,如果指令訪問的數(shù)據(jù)位于數(shù)據(jù)塊中的第6個(gè)字,那么可以使下一級(jí)存儲(chǔ)器的讀取從第6個(gè)字開始,當(dāng)讀到數(shù)據(jù)末尾時(shí),在從頭開始將剩下的第0-5個(gè)字讀取出來,這樣做的好處是當(dāng)下級(jí)存儲(chǔ)器返回第一個(gè)字的時(shí)候,CPU就可以得到所需要的數(shù)據(jù)而繼續(xù)執(zhí)行了,而D-Cache會(huì)繼續(xù)完成其他數(shù)據(jù)的填充工作,這相當(dāng)于將cpu的執(zhí)行和cache的填充進(jìn)行了并行。
6.3 提前開始
關(guān)鍵字優(yōu)先的方法由于需要改變數(shù)據(jù)讀取的順序,因此要額外增加硬件才能實(shí)現(xiàn)這一功能。提前開始的意思是當(dāng)指令所需要的數(shù)據(jù)也就是第6個(gè)字被從下一級(jí)存儲(chǔ)器中取出來時(shí),就可以讓CPU恢復(fù)執(zhí)行了,cache繼續(xù)填充數(shù)據(jù)。和關(guān)鍵字優(yōu)先的區(qū)別時(shí),下一級(jí)存儲(chǔ)器的讀取并不是從第6個(gè)字開始的。
7. 小結(jié)
執(zhí)行這一部分比較難的包括三部分,一個(gè)是執(zhí)行算法部分,加減乘除,開方等,然后load/store指令中替換算法,數(shù)據(jù)合并等;另一個(gè)是數(shù)據(jù)通路bypass的設(shè)計(jì),主要是時(shí)序和面積的考慮