周期與多周期的比較指令流水線(xiàn)
《周期與多周期的比較指令流水線(xiàn)》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《周期與多周期的比較指令流水線(xiàn)(132頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第一講 流水線(xiàn)數(shù)據(jù)通路和控制邏輯 第二講 流水線(xiàn)冒險(xiǎn)處理 第三講 高級(jí)流水線(xiàn)技術(shù) Ch7: Instruction Pipeline 指令流水線(xiàn) Pipeline.2 2021年 2月 20日星期六 第一講 流水線(xiàn)數(shù)據(jù)通路和控制 日常生活中的流水線(xiàn)處理例子:洗衣服 單周期處理器模型和流水線(xiàn)性能比較 什么樣的指令集適合于流水線(xiàn)方式執(zhí)行 如何設(shè)計(jì)流水線(xiàn)數(shù)據(jù)通路 以 MIPS指令子集來(lái)說(shuō)明 詳細(xì)設(shè)計(jì)取指令部件 詳細(xì)設(shè)計(jì)執(zhí)行部件 分析每條指令在流水線(xiàn)中的執(zhí)行過(guò)程,遇到各種問(wèn)題: - 資源沖突 - 寄存器和存儲(chǔ)器的信號(hào)競(jìng)爭(zhēng) - 分支指令的延遲 - 指令間數(shù)據(jù)相關(guān) 如何設(shè)計(jì)流水線(xiàn)控制邏輯 分析每條指令執(zhí)行
2、過(guò)程中的控制信號(hào) 給出控制器設(shè)計(jì)過(guò)程 流水線(xiàn)冒險(xiǎn)的概念 主 要 內(nèi) 容 Pipeline.3 2021年 2月 20日星期六 復(fù)習(xí): A Single Cycle Processor 32 ALUctr Clk busW RegWr 32 32 busA 32 busB 5 5 5 Rw Ra Rb 32 32-bit Registers Rs Rt Rt Rd RegDst Ex tender M ux Mux 32 16 imm16 ALUSrc ExtOp M ux MemtoReg Clk Data In WrEn 32 Adr Data Memory 32 MemWr ALU Zer
3、o 0 1 0 1 0 1 Instruction Fetch Unit Clk Instruction Jump Branch Imm16 Rd Main Control op ALU Control func ALUop 3 RegDst ALUSrc : Instr Zero 3 Pipeline.4 2021年 2月 20日星期六 復(fù)習(xí): Multiple Cycle Processor MCP: 一個(gè)功能部件在一個(gè)指令周期中可以被使用多次。 Ideal Memory WrAdr Din RAdr 32 32 32 Dout MemWr 32 ALU 32 32 ALUOp ALU C
4、ontrol Ins truct ion Reg 32 IRWr 32 Reg File Ra Rw busW Rb 5 5 32 busA 32 busB RegWr Rs Rt M ux 0 1 Rt Rd PCWr ALUSelA Mux 0 1 RegDst M ux 0 1 32 PC MemtoReg Extend ExtOp M ux 0 1 32 0 1 2 3 4 16 Imm 32 2 ALUSelB M ux 1 0 Target 32 Zero Zero PCWrCond PCSrc BrWr 32 IorD Pipeline.5 2021年 2月 20日星期六 復(fù)習(xí):
5、 Timing Diagram of a Load Instruction Clk PC Rs, Rt, Rd, Op, Func Clk-to-Q ALUctr Instruction Memory Access Time Old Value New Value RegWr Old Value New Value Delay through Control Logic busA Register File Access Time Old Value New Value busB ALU Delay Old Value New Value Old Value New Value New Val
6、ue Old Value ExtOp Old Value New Value ALUSrc Old Value New Value Address Old Value New Value busW Old Value New Delay through Extender d = e f; 假定 a, b, c, d ,e, f 在內(nèi)存 方案 3:編譯器進(jìn)行指令順序調(diào)整來(lái)解決 load-use Fast code: lw $2, b lw $3, c lw $5, e add $1, $2, $3 lw $6, f sw a, $1 sub $4, $5, $6 sw d, $4 Slow co
7、de: lw $2, b lw $3, c add $1, $2, $3 sw a, $1 lw $5, e lw $6, f sub $4, $5, $6 sw d, $4 調(diào)整后 編譯器的優(yōu)化很重要! Pipeline.60 2021年 2月 20日星期六 編譯器優(yōu)化以避免阻塞的情況調(diào)查 : % lo ad s sta ll in g pi pe li ne 0% 20 % 40 % 60 % 80 % tex spice gcc 25 % 14 % 31 % 65 % 42 % 54 % sc h e d ul ed unschedul e d 由此可見(jiàn),優(yōu)化調(diào)度后 load阻塞現(xiàn)象大約
8、降低了 1/21/3 Pipeline.61 2021年 2月 20日星期六 數(shù)據(jù)冒險(xiǎn)的解決方法 方法 1:硬件阻塞( stall) 方法 2:軟件插入“ NOP指令 方法 3:編譯優(yōu)化:調(diào)整指令順序,能解決所有數(shù)據(jù)冒險(xiǎn)嗎? 方法 4:合理實(shí)現(xiàn)寄存器堆的讀 /寫(xiě)操作,能解決所有數(shù)據(jù)冒險(xiǎn)嗎? 前半時(shí)鐘周期寫(xiě),后半時(shí)鐘周期讀 若同一個(gè)時(shí)鐘內(nèi)前面指令寫(xiě)入的數(shù)據(jù)正好是后面指令所讀數(shù)據(jù),則不會(huì)發(fā)生 數(shù)據(jù)冒險(xiǎn) 方法 5:轉(zhuǎn)發(fā)( Forwarding或 Bypassing 旁路)技術(shù),能解決所有數(shù)據(jù)冒險(xiǎn)嗎? - 若相關(guān)數(shù)據(jù)是 ALU結(jié)果,則如何? 可通過(guò)轉(zhuǎn)發(fā)解決 - 若相關(guān)數(shù)據(jù)是上條指令 DM讀出內(nèi)容,則如
9、何? 不能通過(guò)轉(zhuǎn)發(fā)解決,隨后指令需被阻塞一個(gè)時(shí)鐘 或 加 NOP指令 實(shí)現(xiàn) “轉(zhuǎn)發(fā)” 和 “阻塞” 要修改數(shù)據(jù)通路: ( 1)檢測(cè)何時(shí)需要“轉(zhuǎn)發(fā)” ,并控制實(shí)現(xiàn)“轉(zhuǎn)發(fā)” ( 2)檢測(cè)何時(shí)需要“阻塞”,并控制實(shí)現(xiàn)“阻塞” 稱(chēng)為 Load-use數(shù)據(jù)冒險(xiǎn)! Pipeline.62 2021年 2月 20日星期六 RAW(寫(xiě)后讀)數(shù)據(jù)冒險(xiǎn)的“轉(zhuǎn)發(fā)”條件 后面指令需用 ALU輸出結(jié)果 C1: 目寄是后一條指令的源寄 C2: 目寄是后第二條指令的源寄 (例如: R-Type后跟 R- / lw / sw / beq等 ) 后面指令需用從 DM讀出的結(jié)果 C3: 目寄是后第二指令的源寄 (例如: load
10、指令后跟 R-Type / beq等 ) 用流水段寄存器來(lái)表示轉(zhuǎn)發(fā)條件( C3以后考慮) C1(a): EX/MEM. RegisterRd=ID/EX. RegisterRs C1(b): EX/MEM. RegisterRd=ID/EX. RegisterRt C2(a): MEM/WB. RegisterRd=ID/EX. RegisterRs C2(b): MEM/WB. RegisterRd=ID/EX. RegisterRt 這里的 RegisterRd是指 目的寄存器 實(shí)際上是 R-type的 Rd 或 I-Type的 rt ori r3, r2, 100 sub r5, r3,
11、 r4 C1 add r3, r2, r1 or r6, r2, r1 sub r5, r3, r4 C2 lw r3, 100(r1) or r6, r2, r1 sub r5, r3, r4 C3 Ex Mem Pipeline.63 2021年 2月 20日星期六 指令的回寫(xiě)( Write Back)階段 IF/ID: ID/E x Regis ter Ex /M em Reg ister M em /W r Reg ister PC Data Mem WA Di RA Do IUnit A I RFile Di Ra Rb Rw MemWr RegWr=1 ExtOp Exec Uni
12、t busA busB Imm16 ALUOp ALUSrc M ux 1 0 MemtoReg=1/0 1 0 RegDst Rt Rd Imm16 PC+4 PC+4 Rs Rt PC+4 Zero Branch 1 0 Clk Ifetch Reg/Dec Exec Mem Wr Rd還是 Rt取決于是 R-型 指令,還是 I-型指令! 若是 beq指令會(huì)怎樣 ? beq r3, r2, 100 sub r5, r3, r2 因?yàn)?beq指令沒(méi)有寫(xiě)結(jié)果,不能進(jìn)行轉(zhuǎn)發(fā)! Pipeline.64 2021年 2月 20日星期六 轉(zhuǎn)發(fā)條件的進(jìn)一步完善 以下兩種情況下,根據(jù)前面的轉(zhuǎn)發(fā)條件轉(zhuǎn)發(fā)會(huì)發(fā)
13、生錯(cuò)誤 指令的結(jié)果不寫(xiě)入目的寄存器 Rd時(shí) - 例如, Beq指令只對(duì) rs和 rt相減,不寫(xiě)結(jié)果到目的寄存器 - 即: EX / MEM 或 MEM / WB 流水段寄存器的 RegWrite信號(hào)為 0 Rd等于 $0時(shí) - 例如,指令 sll $0, $1, 2 的轉(zhuǎn)發(fā)結(jié)果為 (R$1PC 清除 IF段中取出的指令,即:將 IF/ID中的指令字清 0,轉(zhuǎn)變?yōu)?nop指令 原來(lái)要清除三條指令,調(diào)整后只需要清除一條指令,因而只延遲一個(gè)時(shí)鐘周期 ,每次預(yù)測(cè)錯(cuò)誤減少了兩個(gè)周期的代價(jià)! Pipeline.77 2021年 2月 20日星期六 帶靜態(tài)分支預(yù)測(cè)處理的數(shù)據(jù)通路 IF.Flush=Branc
14、h and Zero 40#指令 beq $1,$3, 7的 ID階段 若 $1或 $3和前面指令數(shù)據(jù)相關(guān),會(huì)怎么樣? 上上條指令的 EXE段結(jié)果可轉(zhuǎn)發(fā)回來(lái)進(jìn)行判斷 上條指令的 EXE段結(jié)果來(lái)不及轉(zhuǎn)發(fā)回來(lái),引起 1次阻塞 ! 將 IF/ID中指令字清 0,變?yōu)?nop指令 控制轉(zhuǎn)移 目標(biāo)地址 -PC 轉(zhuǎn)移目標(biāo)地址 (72)-PC 需重新改“轉(zhuǎn)發(fā)”條件和轉(zhuǎn)發(fā)線(xiàn)路 ! 作業(yè)中有相應(yīng)的練習(xí) sub $3, $5, $1 add $1, $5, $2 beq $1, $3, 7 BACK Pipeline.78 2021年 2月 20日星期六 動(dòng)態(tài)分支預(yù)測(cè)方法 簡(jiǎn)單的靜態(tài)分支預(yù)測(cè)方法的預(yù)測(cè)成功率不高,
15、應(yīng)考慮動(dòng)態(tài)預(yù)測(cè) 動(dòng)態(tài)預(yù)測(cè)基本思想: 利用最近轉(zhuǎn)移發(fā)生的情況,來(lái)預(yù)測(cè)下一次可能發(fā)生的轉(zhuǎn)移 預(yù)測(cè)后,在實(shí)際發(fā)生時(shí)驗(yàn)證并調(diào)整預(yù)測(cè) 轉(zhuǎn)移發(fā)生的歷史情況記錄在 BHT中(有多個(gè)不同的名稱(chēng)) - 分支歷史記錄表 BHT( Branch History Table) - 分支預(yù)測(cè)緩沖 BPB( Branch Prediction Buffer) - 分支目標(biāo)緩沖 BTB( Branch Target Buffer) 每個(gè)表項(xiàng)由分支指令地址的低位索引,故在 IF階段就可以取到預(yù)測(cè)位 - 低位地址相同的分支指令共享一個(gè)表項(xiàng),所以,可能取的是其他分支 指令的預(yù)測(cè)位。會(huì)不會(huì)有問(wèn)題? - 由于僅用于預(yù)測(cè),所以不影響執(zhí)
16、行結(jié)果 現(xiàn)在幾乎所有的處理器都采用動(dòng)態(tài)預(yù)測(cè)( dynamic predictor) Pipeline.79 2021年 2月 20日星期六 分支歷史記錄表 BHT(或 BTB、 BPB) 指令預(yù)取器 分支指令地址 轉(zhuǎn)移目標(biāo)地址 預(yù)測(cè)位 分支 指令 地址 控制邏輯 指令執(zhí)行 實(shí)際執(zhí)行情況 命中與否 加入新項(xiàng) 順序取 轉(zhuǎn)移取 分支歷史記錄表 BHT =? 查找 選擇 預(yù)測(cè) 修正 查找時(shí)發(fā)現(xiàn)都不相 等,則“未命中” 未命中說(shuō)明什么? 說(shuō)明以前沒(méi)有執(zhí) 行過(guò)該分支指令 命中時(shí): 根據(jù)預(yù)測(cè)位,選擇“轉(zhuǎn)移取”還是“順序取” 未命中時(shí): 加入新項(xiàng),并填入指令地址和轉(zhuǎn)移目標(biāo)地址、初始化預(yù)測(cè)位 Pipeline.
17、80 2021年 2月 20日星期六 動(dòng)態(tài)預(yù)測(cè)基本方法 采用一位預(yù)測(cè)位:總是按上次實(shí)際發(fā)生的情況來(lái)預(yù)測(cè)下次 1表示最近一次發(fā)生過(guò)轉(zhuǎn)移( taken), 0表示未發(fā)生( not taken) 預(yù)測(cè)時(shí),若為 1,則預(yù)測(cè)下次 taken,若為 0,則預(yù)測(cè)下次 not taken 實(shí)際執(zhí)行時(shí),若預(yù)測(cè)錯(cuò),則該位取反,否則,該位不變 可用一個(gè)簡(jiǎn)單的 預(yù)測(cè)狀態(tài)圖 表示 缺點(diǎn):當(dāng)連續(xù)兩次的分支情況發(fā)生改變時(shí),預(yù)測(cè)錯(cuò)誤 - 例如,循環(huán)迭代分支時(shí),第一次和最后一次會(huì)發(fā)生預(yù)測(cè)錯(cuò)誤,因?yàn)?循環(huán)的第一次和最后一次都會(huì)改變分支情況,而在循環(huán)中間的各次 總是會(huì)發(fā)生分支,按上次的實(shí)際情況預(yù)測(cè)時(shí),都不會(huì)錯(cuò)。 采用二位預(yù)測(cè)位 用
18、 2位組合四種情況來(lái)表示預(yù)測(cè)和實(shí)際轉(zhuǎn)移情況 按照 預(yù)測(cè)狀態(tài)圖 進(jìn)行預(yù)測(cè)和調(diào)整 在連續(xù)兩次分支發(fā)生不同時(shí),只會(huì)有一次預(yù)測(cè)錯(cuò)誤 采用比較多的是二位預(yù)測(cè)位,也有采用二位以上預(yù)測(cè)位。 如: Pentium 4 的 BTB2采用 4位預(yù)測(cè)位 BACK Pipeline.81 2021年 2月 20日星期六 一位預(yù)測(cè)狀態(tài)圖 指令預(yù)取時(shí),按照預(yù)測(cè)讀取相應(yīng)分支的指令 預(yù)測(cè)發(fā)生時(shí),選擇“轉(zhuǎn)移取” 預(yù)測(cè)不發(fā)生時(shí),選擇“順序取” 指令執(zhí)行時(shí),按實(shí)際執(zhí)行結(jié)果修改預(yù)測(cè)位 對(duì)照狀態(tài)轉(zhuǎn)換圖來(lái)進(jìn)行修改 例如:對(duì)于一個(gè)循環(huán)分支 若初始狀態(tài)為 0(再次循環(huán)時(shí)為 0),則第一次和 最后一次都錯(cuò) 若初始狀態(tài)為 1,則只有最后一次會(huì)錯(cuò)
19、 預(yù)測(cè)發(fā)生 發(fā) 生 不發(fā)生 預(yù)測(cè)不發(fā)生 不發(fā)生 發(fā)生 1 0 正確 錯(cuò)誤 錯(cuò)誤 正確 Loop: add $7, $3, $3 ; i*2 add $7, $7, $7 ; i*4 add $7, $7, $5 lw $6, 0($7) ; $6=Ai add $1, $1, $6 ; g= g+Ai add $3, $3, $4 bne $3, $2, Loop Loop: g = g +Ai; i = i+ j; if (i != h) go to Loop: Assuming variables g, h, i, j $1, $2, $3, $4 and base address of
20、array is in $5 即:只要本次和上次的發(fā)生情況不同,就會(huì)出現(xiàn)一次預(yù)測(cè)錯(cuò)誤。 BACK Pipeline.82 2021年 2月 20日星期六 兩位預(yù)測(cè)狀態(tài)圖 基本思想:只有兩次預(yù)測(cè)錯(cuò)誤才改變預(yù)測(cè)方向 00狀態(tài)時(shí)預(yù)測(cè)發(fā)生(強(qiáng)轉(zhuǎn)移),實(shí)際不發(fā)生時(shí),轉(zhuǎn)到狀態(tài) 01(弱轉(zhuǎn)移),下次仍預(yù)測(cè) 為發(fā)生,如果再次預(yù)測(cè)錯(cuò)誤(實(shí)際不發(fā)生),才使下次預(yù)測(cè)調(diào)整為不發(fā)生 11 好處:連續(xù)兩次發(fā)生不同的分支情況時(shí),可能會(huì)預(yù)測(cè)正確 例如,對(duì)于循環(huán)分支的預(yù)測(cè) - 第一次:初始態(tài)為 00(再次循環(huán)時(shí)狀態(tài)為 01),預(yù)測(cè)發(fā)生,實(shí)際也發(fā)生,正確 - 中間:狀態(tài)為“ 00,預(yù)測(cè)發(fā)生,實(shí)際也發(fā)生,正確 - 最后一次:狀態(tài)為
21、“ 00,預(yù)測(cè)發(fā)生,但實(shí)際不發(fā)生,錯(cuò) BACK 預(yù)測(cè)發(fā)生 發(fā)生 預(yù)測(cè)不發(fā)生 不發(fā)生 預(yù)測(cè)發(fā)生 預(yù)測(cè)不發(fā)生 發(fā)生 不發(fā)生 發(fā)生 不發(fā)生 發(fā)生 不發(fā)生 00 01 10 11 正確 錯(cuò)誤 正確 錯(cuò)誤 正確 正確 錯(cuò)誤 錯(cuò)誤 預(yù)測(cè)發(fā)生時(shí),選擇“轉(zhuǎn)移取” 預(yù)測(cè)不發(fā)生時(shí),選擇“順序取 ” Loop: add $7, $3, $3 ; i*2 add $7, $7, $7 ; i*4 add $7, $7, $5 lw $6, 0($7) ; $6=Ai add $1, $1, $6 ; g= g+Ai add $3, $3, $4 bne $3, $2, Loop Pipeline.83 2021年 2
22、月 20日星期六 分支延遲時(shí)間片的調(diào)度 屬于靜態(tài)調(diào)度技術(shù),由編譯程序重排指令順序來(lái)實(shí)現(xiàn) 基本思想: 把分支指令前面的與分支指令無(wú)關(guān)的指令調(diào)到分支指令后面執(zhí)行,以填充延 遲時(shí)間片 (也稱(chēng)分支延遲槽 Branch Delay slot) ,不夠時(shí)用 nop操作填充 舉例:如何對(duì)以下程序段進(jìn)行分支延遲調(diào)度? (假定時(shí)間片為 2) 調(diào)度后,降低了分支延遲損失 lw $3, 0($2) add $6, $4, $2 beq $3, $5, 2 lw $1, 0($2) add $3, $3,$2 sw $1, 0($2) lw $1, 0($2) lw $3, 0($2) add $6, $4, $2
23、beq $3, $5, 2 add $3, $3,$2 sw $1, 0($2) 調(diào)度后可能帶來(lái)其他問(wèn)題:產(chǎn)生新的 load-use數(shù)據(jù) 冒險(xiǎn) BACK 若分支條件判斷和目標(biāo)地址計(jì)算提前到 ID階段,則分支延遲時(shí)間片減少為 1 調(diào)度后 lw $3, 0($2) add $6, $4, $2 beq $3, $5, 2 lw $1, 0($2) nop add $3, $3,$2 sw $1, 0($2) Pipeline.84 2021年 2月 20日星期六 另一種控制冒險(xiǎn):異常和中斷 異常和中斷會(huì)改變程序的執(zhí)行流程 某條指令發(fā)現(xiàn)異常時(shí),后面多條指令已被取到流水線(xiàn)中正在執(zhí)行 例如 ALU指令發(fā)
24、現(xiàn)“溢出”時(shí),已經(jīng)到 EX階段結(jié)束了,此時(shí),它后 面已有兩條指令進(jìn)入流水線(xiàn)了 流水線(xiàn)數(shù)據(jù)通路如何處理異常 ? (舉例說(shuō)明 ) 假設(shè)指令 add r1,r2,r3產(chǎn)生了溢出 (記?。?MIPS異常處理程序的首地址為 0 x8000 0180) 處理思路: 清除 add指令以及后面的所有已在流水線(xiàn)中的指令 保存 PC或 PC+4 到 EPC 從 0 x8000 0180處開(kāi)始取指令 Pipeline.85 2021年 2月 20日星期六 異常的處理 異常(溢出)在第一條指令的 EXE階段被檢出 I n s t r. O r d e r Time (clock cycles) add r1,r2,r
25、3 sub r4,r2,r3 and r6,r1,r4 I F ID/R F E X ME M W B ALU Im Reg Im Reg Dm Reg ALU bubble bubble bubble Im bubble bubble bubble bubble Im Im 異常處理程序首指令 Reg 阻塞點(diǎn) Reg AL U Dm bubble bubble bubble 異常處理: IF.Flush使 IF段指令在 IF/ID寄存器中清為 0,變成 nop指令 ID.Flush與數(shù)據(jù)冒險(xiǎn)阻塞檢測(cè)信號(hào)相或 (or)后,使 ID段指令的控制信號(hào)清 0 EX.Flush使 EX段指令的控制信號(hào)
26、清 0 將 0 x8000 0180作為 PC的一個(gè)輸入,并控制 PC輸入端的多路選擇器 將斷點(diǎn)(可能是 PC、可能是 PC+4)保存到 EPC中 即: 0 x80000180處指令 會(huì)發(fā)生將溢出結(jié)果寫(xiě)到寄 存器 r1中去的情況嗎? 不會(huì)! EX.Flush使 EXE段指令的控制 信號(hào)清 0(主要保證 RegWr清 0),避 免了在 WB階段寫(xiě)寄存器 r1的情況。 Pipeline.86 2021年 2月 20日星期六 帶異常處理的流水線(xiàn)數(shù)據(jù)通路 Overflow 80000180H Pipeline.87 2021年 2月 20日星期六 流水線(xiàn)方式下的異常處理的難點(diǎn)問(wèn)題 流水線(xiàn)中有 5條指令
27、,到底是哪一條發(fā)生異常? 根據(jù)異常發(fā)生的流水段可確定是哪條指令,因?yàn)楦黝?lèi)異常發(fā)生的流水段不同 “溢出”在 EXE段檢出 “無(wú)效指令”在 ID段檢出 “除數(shù)為 0在 ID段段檢出 “無(wú)效指令地址”在 IF段檢出 “無(wú)效數(shù)據(jù)地址”在 Load/Store指令的 EXE段檢出 外部中斷與特定指令無(wú)關(guān),如何確定處理點(diǎn)? 可在 IF段或 WB段中進(jìn)行中斷查詢(xún),需要保證當(dāng)前 WB段的指令能正確完成,并在有 中斷發(fā)生時(shí),確保下個(gè)時(shí)鐘開(kāi)始執(zhí)行中斷服務(wù)程序 檢測(cè)到異常時(shí),指令已經(jīng)取出多條,當(dāng)前 PC的值已不是斷點(diǎn),怎么辦? 指令地址(哪條?)存放在流水段 R,可把這個(gè)地址送到 EPC保存,以實(shí)現(xiàn)精確中斷 (非精
28、確中斷不能提供準(zhǔn)確的斷點(diǎn),而由操作系統(tǒng)來(lái)確定哪條指令發(fā)生了異常) 一個(gè)時(shí)鐘周期內(nèi)可能有多個(gè)異常,該先處理哪個(gè)? 異常:檢出異常存到專(zhuān)門(mén)寄存器, (前面指令優(yōu)先級(jí)高?) 中斷:在中斷查詢(xún)程序或中斷優(yōu)先級(jí)排隊(duì)電路中按順序查詢(xún) 系統(tǒng)中只有一個(gè) EPC,多個(gè)中斷發(fā)生時(shí),一個(gè) EPC不夠放多個(gè)斷點(diǎn),怎么辦? 總是把優(yōu)先級(jí)最高的送到 EPC中 在異常處理過(guò)程中,又發(fā)生了新的異?;蛑袛?,怎么辦? 利用中斷屏蔽和中斷嵌套機(jī)制來(lái)處理 后面三個(gè)問(wèn)題在第九章中詳細(xì)介紹! Pipeline.88 2021年 2月 20日星期六 復(fù)習(xí): Cache 的操作過(guò)程 如果被訪(fǎng)問(wèn)的信息 不在 cache中,稱(chēng) 為失效 (mis
29、s) 如果被 訪(fǎng)問(wèn)的 信息在 cache 中,稱(chēng) 為命中 (hit) 缺失處理 硬件如何進(jìn)行缺失處理? Pipeline.89 2021年 2月 20日星期六 Cache缺失處理會(huì)引起流水線(xiàn)阻塞(停頓) 在使用 Cache的系統(tǒng)中,數(shù)據(jù)通路中的 IM和 DM分別是 Code Cache和 Data Cache CPU執(zhí)行指令過(guò)程中,取指令或取數(shù)據(jù)時(shí),如果發(fā)生缺失,則指令執(zhí)行被阻塞 Cache缺失的檢測(cè) (如何進(jìn)行的?記得嗎?) Cache中有相應(yīng)的檢測(cè)線(xiàn)路(地址高位與 Cache標(biāo)志比較) 阻塞處理過(guò)程 凍結(jié)所有臨時(shí)寄存器和程序員可見(jiàn)寄存器的內(nèi)容(即:使整個(gè)計(jì)算機(jī)阻塞) 由一個(gè)單獨(dú)的控制器處理
30、 Cache缺失, 其過(guò)程 (假定是指令缺失 ) 還記得嗎? : - 把發(fā)生缺失的指令地址 ( PC- 4) 所在的主存塊首址送到主存 - 啟動(dòng)一次“主存塊讀”操作,并等待主存完成一個(gè)主存塊 (Cache行 )的讀操作 - 把讀出的一個(gè)主存塊寫(xiě)到 Cache對(duì)應(yīng)表項(xiàng)的數(shù)據(jù)區(qū) (若對(duì)應(yīng)表項(xiàng)全滿(mǎn)的話(huà),還要考慮淘汰掉一個(gè)已在 Cache中的主存塊) - 把地址高位部分(標(biāo)記)寫(xiě)到 Cache的“ tag字段,并置“有效位” - 重新執(zhí)行指令的第一步:“取指令” 若是讀數(shù)據(jù)缺失,其處理過(guò)程和指令缺失類(lèi)似 - 從主存讀出數(shù)據(jù)后,從“取數(shù)”那一步開(kāi)始重新執(zhí)行就可以了 若是寫(xiě)數(shù)據(jù)缺失,則要考慮用哪種 寫(xiě)策略
31、”解決“一致性”問(wèn)題 比數(shù)據(jù)相關(guān)或分支指令引起的流水線(xiàn)阻塞簡(jiǎn)單:只要保持所有寄存器不變 與中斷引起的阻塞處理不同:不需要程序切換 Pipeline.90 2021年 2月 20日星期六 TLB缺失和缺頁(yè)也會(huì)引起流水線(xiàn)阻塞 TLB缺失處理 當(dāng) TLB中沒(méi)有一項(xiàng)的虛頁(yè)號(hào)與要找的虛頁(yè)號(hào)相等時(shí),發(fā)生 TLB miss TLB miss說(shuō)明可能發(fā)生以下兩種情況之一: - 頁(yè)在內(nèi)存中: 只要把主存中的頁(yè)表項(xiàng)裝載到 TLB中 - 頁(yè)不在內(nèi)存中 (缺頁(yè) ): OS從磁盤(pán)調(diào)入一頁(yè),并更新主存頁(yè)表和 TLB 缺頁(yè)( page fault)處理 當(dāng)主存頁(yè)表的頁(yè)表項(xiàng)中“ valid位為“ 0時(shí),發(fā)生 page fau
32、lt Page fault是一種“故障”異常,按以下過(guò)程處理( MIPS異常處理) - 在 Cause寄存器置相應(yīng)位為“ 1 - 發(fā)生缺頁(yè)的指令地址 ( PC- 4) 送 EPC - 0 x8000 0180(異常查詢(xún)程序入口 )送 PC 執(zhí)行 OS的異常查詢(xún)程序,取出 Cause寄存器中相應(yīng)的位分析,得知發(fā)生了“缺 頁(yè)”,轉(zhuǎn)到“缺頁(yè)處理程序”執(zhí)行 page fault一定要在發(fā)生缺失的存儲(chǔ)器操作時(shí)鐘周期內(nèi)捕獲到,并在下個(gè)時(shí)鐘轉(zhuǎn)到異常 處理,否則,會(huì)發(fā)生錯(cuò)誤。 - 例: lw $1, 0($1) ,若沒(méi)有及時(shí)捕獲“異?!倍?$1改變,則再重新執(zhí)行該指令時(shí) ,所讀的內(nèi)存單元地址被改變,發(fā)生嚴(yán)重
33、錯(cuò)誤! 處理 Cache缺失和缺頁(yè)的不同之處在哪里? 哪種要進(jìn)行程序切換? Pipeline.91 2021年 2月 20日星期六 (缺頁(yè))異常處理時(shí)要考慮的一些細(xì)節(jié) 缺頁(yè)異常結(jié)束后,回到哪里繼續(xù)執(zhí)行? 指令缺頁(yè):重新執(zhí)行發(fā)生缺頁(yè)的指令 數(shù)據(jù)缺頁(yè): - 簡(jiǎn)單指令(僅一次訪(fǎng)存): 強(qiáng)迫指令結(jié)束,重新執(zhí)行缺頁(yè)指令 - 復(fù)雜指令(多次訪(fǎng)存): 可能會(huì)發(fā)生多次缺頁(yè),指令被中止在中間某 個(gè)階段,缺頁(yè)處理后,從中間階段繼續(xù)執(zhí)行;因而,需要能夠保存和 恢復(fù)中間機(jī)器狀態(tài) 異常發(fā)生后,又發(fā)生新的異常,怎么辦? 在發(fā)現(xiàn)異常、轉(zhuǎn)到異常處理程序中,若在保存正在運(yùn)行進(jìn)程的狀態(tài)時(shí)又發(fā) 生新的異常,則因?yàn)橐幚硇碌漠惓?,?huì)
34、把原來(lái)進(jìn)程的狀態(tài)和保存的返回 斷點(diǎn)破壞掉,所以,應(yīng)該有一種機(jī)制來(lái)“禁止”響應(yīng)新的異常處理(?) 通過(guò)“中斷 /異常允許”狀態(tài)位(或“中斷 /異常允許”觸發(fā)器)來(lái)實(shí)現(xiàn)? “中斷 /異常允許”狀態(tài)位置 1,則“開(kāi)中斷”(允許異常),清 0則“關(guān) 中斷 ”( 禁止異常)? OS通過(guò)管態(tài)指令來(lái)設(shè)置該位的狀態(tài)? Pipeline.92 2021年 2月 20日星期六 三種處理器實(shí)現(xiàn)方式的比較 單周期、多周期、流水線(xiàn)三種方式比較 假設(shè)各主要功能單元的操作時(shí)間為: 存儲(chǔ)單元: 200ps ALU和加法器: 100ps 寄存器堆(讀 / 寫(xiě)): 50ps 假設(shè) MUX、控制單元、 PC、擴(kuò)展器和傳輸線(xiàn)路都沒(méi)有
35、延遲,指令組成為: 25%取數(shù)、 10%存數(shù)、 52%ALU、 11%分支、 2%跳轉(zhuǎn) 則下面實(shí)現(xiàn)方式中,哪個(gè)更快?快多少? ( 1)單周期方式:每條指令在一個(gè)固定長(zhǎng)度的時(shí)鐘周期內(nèi)完成 ( 2)多周期方式:每類(lèi)指令時(shí)鐘數(shù) :取數(shù) -5,存數(shù) -4, ALU-4,分支 -3,跳轉(zhuǎn) -3 ( 3)流水線(xiàn)方式:每條指令分取指令、取數(shù) /譯碼、執(zhí)行、存儲(chǔ)器存取、寫(xiě)回五階段 (假定沒(méi)有結(jié)構(gòu)冒險(xiǎn),數(shù)據(jù)冒險(xiǎn)采用轉(zhuǎn)發(fā)處理,分支延遲槽為 1,預(yù)測(cè)準(zhǔn)確率 為 75%;不考慮異常、中斷和訪(fǎng)問(wèn)缺失引起的流水線(xiàn)冒險(xiǎn)) Pipeline.93 2021年 2月 20日星期六 三種處理器實(shí)現(xiàn)方式的比較 解: CPU執(zhí)行時(shí)間
36、 =指令條數(shù) x CPI x 時(shí)鐘周期長(zhǎng)度 三種方式的指令條數(shù)都一樣,所以只要比較 CPI和時(shí)鐘周期長(zhǎng)度即可。 各指令類(lèi)型要求的時(shí)間長(zhǎng)度為: Pipeline.94 2021年 2月 20日星期六 三種處理器實(shí)現(xiàn)方式的比較 對(duì)于單周期方式: 時(shí)鐘周期將由最長(zhǎng)指令來(lái)決定,應(yīng)該是 load指令,為 600ps 所以, N條指令的執(zhí)行時(shí)間為 600N(ps) 對(duì)于多周期方式: 時(shí)鐘周期將取功能部件最長(zhǎng)所需時(shí)間,應(yīng)該是存取操作,為 200ps 根據(jù)各類(lèi)指令的頻度,計(jì)算平均時(shí)鐘周期數(shù)為: CPU時(shí)鐘周期 =5x25%+4x10%+4x52%+3x11%+3x2%=4.12 所以, N條指令的執(zhí)行時(shí)間為
37、4.12x200 xN=824N(ps) 對(duì)于流水線(xiàn)方式: Load指令:當(dāng)發(fā)生 Load-use依賴(lài)時(shí),執(zhí)行時(shí)間為 2個(gè)時(shí)鐘,否則 1個(gè)時(shí)鐘,故平均 執(zhí)行時(shí)間為 1.5個(gè)時(shí)鐘; Store、 ALU指令: 1個(gè)時(shí)鐘; Branch指令:預(yù)測(cè)成功時(shí), 1個(gè)時(shí)鐘,預(yù)測(cè)錯(cuò)誤時(shí), 2個(gè)時(shí)鐘, 所以:平均約為: .75x1+.25x2=1.25個(gè); Jump指令: 2個(gè)時(shí)鐘(總要等到譯碼階段結(jié)束才能得到轉(zhuǎn)移地址) 平均 CPI為: 1.5x25%+1x10%+1x52%+1.25x11%+2x2%=1.17 所以, N條指令的執(zhí)行時(shí)間為 1.17x200 xN=234N(ps) Pipeline.95
38、 2021年 2月 20日星期六 流水線(xiàn)冒險(xiǎn)對(duì)程序性能的影響 結(jié)構(gòu)冒險(xiǎn)對(duì)浮點(diǎn)運(yùn)算的性能影響較大,因?yàn)楦↑c(diǎn)運(yùn)算單元不能有效被流水 化,可能造成運(yùn)算單元的資源沖突 控制冒險(xiǎn)更多出現(xiàn)在整數(shù)運(yùn)算程序中,因?yàn)榉种е噶顚?duì)應(yīng)于循環(huán)或選擇結(jié) 構(gòu),大多由整數(shù)運(yùn)算結(jié)果決定分支 數(shù)據(jù)冒險(xiǎn)在整數(shù)運(yùn)算程序和浮點(diǎn)運(yùn)算程序中都一樣 浮點(diǎn)程序中的數(shù)據(jù)冒險(xiǎn)容易通過(guò)編譯器優(yōu)化調(diào)度來(lái)解決 - 分支指令少 - 數(shù)據(jù)訪(fǎng)問(wèn)模式較規(guī)則 整數(shù)程序的數(shù)據(jù)冒險(xiǎn)不容易通過(guò)編譯優(yōu)化調(diào)度解決 - 分支指令多 - 數(shù)據(jù)訪(fǎng)問(wèn)模式不規(guī)則 - 過(guò)多使用指針 Pipeline.96 2021年 2月 20日星期六 第二講小結(jié) 流水線(xiàn)冒險(xiǎn)的幾種類(lèi)型: 資源沖突、
39、數(shù)據(jù)相關(guān)、控制相關(guān)(改變指令流的執(zhí)行方向) 數(shù)據(jù)冒險(xiǎn)的現(xiàn)象和對(duì)策 數(shù)據(jù)冒險(xiǎn)的種類(lèi) - 相關(guān)的數(shù)據(jù)是 ALU結(jié)果,可以通過(guò)轉(zhuǎn)發(fā)解決 - 相關(guān)的數(shù)據(jù)是 DM讀出的內(nèi)容,隨后的指令需被阻塞一個(gè)時(shí)鐘 數(shù)據(jù)冒險(xiǎn)和轉(zhuǎn)發(fā) - 轉(zhuǎn)發(fā)檢測(cè) / 轉(zhuǎn)發(fā)控制 數(shù)據(jù)冒險(xiǎn)和阻塞 - 阻塞檢測(cè) / 阻塞控制 控制冒險(xiǎn)的現(xiàn)象和對(duì)策 靜態(tài)分支預(yù)測(cè)技術(shù) 縮短分支延遲技術(shù) 動(dòng)態(tài)分支預(yù)測(cè)技術(shù) 異常和中斷是一種特殊的控制冒險(xiǎn) 訪(fǎng)存缺失( Cache缺失、 TLB缺失、缺頁(yè))會(huì)引起流水線(xiàn)阻塞 Pipeline.97 2021年 2月 20日星期六 第三講 高級(jí)流水線(xiàn)技術(shù) 高性能流水線(xiàn) - 指令級(jí)并行 (ILP)技術(shù) 超流水線(xiàn) 多發(fā)射流水
40、線(xiàn) - 靜態(tài)多發(fā)射( VLIW處理器 +編譯器靜態(tài)調(diào)度) - 動(dòng)態(tài)多發(fā)射(超標(biāo)量處理器 +動(dòng)態(tài)流水線(xiàn)調(diào)度) 靜態(tài)多發(fā)射( VLIW-超長(zhǎng)指令字) 編譯器靜態(tài)推測(cè)完成“指令打包”和“冒險(xiǎn)處理” MIPS 2-發(fā)射流水線(xiàn)數(shù)據(jù)通路 循環(huán)展開(kāi)指令調(diào)度 IA-64的 EPIC技術(shù) 動(dòng)態(tài)多發(fā)射 動(dòng)態(tài)多發(fā)射流水線(xiàn)的通用模型 動(dòng)態(tài)多發(fā)射流水線(xiàn)的執(zhí)行模式 - 按序發(fā)射、按序完成 - 按序發(fā)射、無(wú)序完成 - 無(wú)序發(fā)射、無(wú)序完成 Pentium 4 動(dòng)態(tài)多發(fā)射流水線(xiàn) - 超流水、超標(biāo)量、動(dòng)態(tài)調(diào)度、無(wú)序發(fā)射、無(wú)序完成 Pipeline.98 2021年 2月 20日星期六 提高性能措施 實(shí)現(xiàn)指令級(jí)并行 流水線(xiàn)實(shí)現(xiàn)了指
41、令流內(nèi)部的并行,這種并行稱(chēng)為指令級(jí)并行( ILP) 有兩種指令級(jí)并行策略 超流水線(xiàn)( Super- pipelining) - 級(jí)數(shù)更多的流水線(xiàn) - 理想情況下,流水線(xiàn)的加速比與流水段的數(shù)目成正比 (即:理想情況下,流水段越多,時(shí)鐘周期越短,指令吞吐率越高) 但是,它是有極限的!可以怎樣突破極限呢? 多發(fā)射流水線(xiàn)( Multiple issue pipelining ) - 多條指令 (如整數(shù)運(yùn)算、浮點(diǎn)運(yùn)算、裝入 /存儲(chǔ)等 ) 同時(shí)啟動(dòng)并獨(dú)立運(yùn)行 - 前提: 有多個(gè)執(zhí)行部件。如:定點(diǎn)、浮點(diǎn)、乘 /除、取數(shù) /存數(shù)部件等 - 結(jié)果: 能達(dá)到小于 1的 CPI,定義 CPI的倒數(shù)為 IPC (例如
42、:四路多發(fā)射流水線(xiàn)的理想 IPC為 4) - 需要實(shí)現(xiàn)以下兩個(gè)主要任務(wù) 指令打包:分析每個(gè)周期發(fā)射多少條?哪些指令可以同時(shí)發(fā)射? 冒險(xiǎn)處理:由編譯器靜態(tài)調(diào)整指令或在運(yùn)行時(shí)由硬件處理 - 實(shí)現(xiàn)上述兩個(gè)主要任務(wù)的基礎(chǔ) 推測(cè)技術(shù) - 兩種實(shí)現(xiàn)方法 靜態(tài)多發(fā)射 :由編譯器在編譯時(shí)靜態(tài)完成指令打包或冒險(xiǎn)處理 動(dòng)態(tài)多發(fā)射 :由硬件在執(zhí)行時(shí)動(dòng)態(tài)完成指令打包或冒險(xiǎn)處理 CPI=? CPI=1 Pipeline.99 2021年 2月 20日星期六 實(shí)現(xiàn)多發(fā)射技術(shù)的基礎(chǔ) 推測(cè) 推測(cè)技術(shù):由編譯器或處理器猜測(cè)指令執(zhí)行結(jié)果,并以此來(lái)調(diào)整指令執(zhí)行順序, 使指令的執(zhí)行能達(dá)到最大可能的并行 指令打包的決策依賴(lài)于“推測(cè)”的
43、結(jié)果 - 可根據(jù)指令間的相關(guān)性來(lái)進(jìn)行推測(cè) 與前面指令不相關(guān)的指令可以提前執(zhí)行 - 可對(duì)分支指令進(jìn)行推測(cè) 可提前執(zhí)行分支目標(biāo)處的指令 - 預(yù)測(cè)僅是“猜測(cè)”,有可能推測(cè)錯(cuò)誤,故需有推測(cè)錯(cuò)誤檢測(cè)和回滾機(jī)制 - 推測(cè)錯(cuò)誤時(shí),會(huì)增加額外開(kāi)銷(xiāo) 有“軟件推測(cè)”和“硬件推測(cè)”兩種 - 軟件推測(cè):編譯器通過(guò)推測(cè)來(lái)靜態(tài)重排指令(一定要正確?。?- 硬件推測(cè):處理器在運(yùn)行時(shí)通過(guò)推測(cè)來(lái)動(dòng)態(tài)調(diào)度指令 BACK Pipeline.100 2021年 2月 20日星期六 靜態(tài)多發(fā)射處理器 由編譯器在編譯時(shí), 進(jìn)行相關(guān)性分析 和 靜態(tài)分支預(yù)測(cè), 以靜態(tài)完成“指令打包”或“冒險(xiǎn)處 理” 指令打包(將同時(shí)發(fā)射的多條指令合并到一個(gè)
44、長(zhǎng)指令中) - 將一個(gè)周期內(nèi)發(fā)射的多個(gè)指令看成一條多個(gè)操作的長(zhǎng)指令,稱(chēng)為一個(gè) 發(fā)射包” - “靜態(tài)多發(fā)射”最初被稱(chēng)為“超長(zhǎng)指令字”( VLIW-Very Long Instruction Word),采用這種技術(shù)的處理器被稱(chēng)為 VLIW處理器 - 在同一個(gè)周期內(nèi)發(fā)射的指令類(lèi)型是受限制的 (例如,只能是一條 ALU指令 /分支指令、一條 Load/Store指令) - IA-64采用這種方法, Intel稱(chēng)其為 EPIC( Explicitly Parallel Instruction Computer顯式并行指令計(jì)算機(jī)) 冒險(xiǎn)處理(主要是數(shù)據(jù)冒險(xiǎn)和控制冒險(xiǎn)) - 做法 1: 完全由編譯器通過(guò)代
45、碼調(diào)度和插入 nop指令來(lái)消除所有冒險(xiǎn),無(wú)需硬件 實(shí)現(xiàn)冒險(xiǎn)檢測(cè)和流水線(xiàn)阻塞 - 做法 2: 由編譯器通過(guò)靜態(tài)分支預(yù)測(cè)和代碼調(diào)度來(lái)消除同時(shí)發(fā)射指令間內(nèi)部依賴(lài) ,由硬件檢測(cè)數(shù)據(jù)冒險(xiǎn)并進(jìn)行流水線(xiàn)阻塞 即:保證打包指令內(nèi)部不會(huì)出現(xiàn)冒險(xiǎn)! Pipeline.101 2021年 2月 20日星期六 靜態(tài)多發(fā)射處理器實(shí)例 實(shí)例: MIPS ISA 指令集的靜態(tài)多發(fā)射 -2發(fā)射處理器 要使原來(lái)的 MIPS處理器能夠同時(shí)處理兩條流水線(xiàn),數(shù)據(jù)通路需要做哪些改進(jìn)? 1. 同時(shí)要能取并譯碼兩條指令,怎么辦? 將兩條指令打包成 64位長(zhǎng)指令,前面為 ALU/Branch,后面為 lw/sw 沒(méi)有配對(duì)指令時(shí),就用 nop
46、指令代替 將 64位長(zhǎng)指令中的兩個(gè)操作碼同時(shí)送到控制器(指令譯碼器)進(jìn)行譯碼 2. 兩條指令同時(shí)要讀兩個(gè)寄 存器(和 sw配對(duì)時(shí))或?qū)懠拇嫫鳎ê?lw配對(duì)時(shí)) ,怎么辦? 增加一個(gè)讀口和一個(gè)寫(xiě)口 3. 兩條指令同時(shí) 要使用 ALU進(jìn)行運(yùn)算 ,怎么辦? 增加一個(gè) ALU(包括 2組輸入總線(xiàn)和 1組輸出總線(xiàn)) BACK Pipeline.102 2021年 2月 20日星期六 2發(fā)射流水線(xiàn)數(shù)據(jù)通路(藍(lán)色是增加部分) 同時(shí)需為 ALU和 Store操作讀兩 個(gè)寄存器,同時(shí)需為 ALU運(yùn)算 和 Load結(jié)果寫(xiě)一個(gè)寄存器 需增加額外加法器或 ALU ALU/分支指令進(jìn)行 ALU運(yùn)算時(shí), Load/Sto
47、re指令要計(jì)算地址 指令成對(duì)放在 64位對(duì)齊內(nèi) 存區(qū)域,前面是 ALU/分支 指令。如果不能成對(duì),則 用 nop指令代替缺失指令, 每次取兩條指令,同時(shí)對(duì) 兩條指令譯碼 控制器和控制信號(hào)會(huì)要求數(shù)據(jù)通路怎樣改呢? 流水段寄存器要增寬,控制信號(hào)分別傳送。 Pipeline.103 2021年 2月 20日星期六 2發(fā)射流水線(xiàn)的特點(diǎn) 優(yōu)點(diǎn):潛在性能將提高大約 2倍 (實(shí)際上達(dá)不到! ) 缺點(diǎn): 為消除結(jié)構(gòu)冒險(xiǎn),需增加額外部件 增加潛在的由數(shù)據(jù)冒險(xiǎn)和控制冒險(xiǎn)導(dǎo)致的性能損失 - 例 1:對(duì)于 Load-use數(shù)據(jù)冒險(xiǎn) 單發(fā)射流水線(xiàn): 只有一條指令延遲 2發(fā)射流水線(xiàn): 有一個(gè)周期( 2條指令)延遲 - 例
48、 2:對(duì)于 ALU-Load/Store數(shù)據(jù)冒險(xiǎn) 單發(fā)射流水線(xiàn): 可用“轉(zhuǎn)發(fā)”技術(shù)使 ALU結(jié)果直接轉(zhuǎn)發(fā)到 Load/Store指 令的 EXE階段 2發(fā)射流水線(xiàn): 兩條指令同時(shí)進(jìn)行, ALU的結(jié)果不能直接轉(zhuǎn)發(fā),因而不能 提供給與其配對(duì)的 Load/Store指令使用,只能延遲一個(gè)周期 為了更有效地利用多發(fā)射處理器的并行性,必須有更強(qiáng)大的編譯器, 能夠充分消除指令間的依賴(lài)關(guān)系,使指令序列達(dá)到最大的并行性! Pipeline.104 2021年 2月 20日星期六 例: 2發(fā)射 MIPS指令調(diào)度 以下是一個(gè)循環(huán)代碼段 Loop: lw $t0, 0($s1) addu $t0, $t0, $s2
49、 sw $t0, 0($s1) addi $s1, $s1, -4 bne $s1, $zero, Loop (能看出這段程序的功能嗎? ) 為了能在 2發(fā)射 MIPS流水線(xiàn)中有效執(zhí)行,該怎樣重新排列指令 調(diào)度方案如下: 沒(méi)有指令配對(duì)時(shí),用 nop指令代替 一個(gè)循環(huán)內(nèi),五條指令在四個(gè)時(shí)鐘內(nèi)完成,實(shí)際 CPI為 0.8,即 : IPC=1.25 在循環(huán)中訪(fǎng)問(wèn)數(shù)組的更好的調(diào)度技術(shù)是“循環(huán)展開(kāi)” 前三條和后兩條各具有相關(guān)性 可把第四條指令調(diào)到第一條后面 sw指令是否有問(wèn)題?怎么辦? 循環(huán)內(nèi)進(jìn)行的是數(shù)組訪(fǎng)問(wèn)! 冒險(xiǎn)!同時(shí)對(duì)同一個(gè)寄存器讀,且 讀后要寫(xiě),取決于寄存器如何設(shè)計(jì) 能否把 addi和 lw配成
50、一對(duì)? $s1被減 4,故 sw指令偏移改為 4 Pipeline.105 2021年 2月 20日星期六 用“循環(huán)展開(kāi)”技術(shù)進(jìn)行指令調(diào)度 基本思想:展開(kāi)循環(huán)體,生成多個(gè)副本,在展開(kāi)的指令中統(tǒng)籌調(diào)度 上例采用“循環(huán)展開(kāi)”后的指令序列是什么? 為簡(jiǎn)化起見(jiàn),假定循環(huán)執(zhí)行次數(shù)是 4的倍數(shù) “循環(huán)展開(kāi)” 4次后循環(huán)內(nèi)每條指令( lw, addu, sw,與數(shù)組訪(fǎng)問(wèn)相關(guān) )有 4條 再加上 1條 addi和 1條 bne, 共 14條指令 指令最佳調(diào)度序列如下: 14條指令用了 8個(gè)時(shí)鐘, CPI達(dá)到 8/14=0.57。 需要用到 “重命名寄存器”技術(shù) ,多用了三個(gè)臨時(shí)寄存器 $t1,$t2,$t3,
51、消除了 名字依賴(lài)關(guān)系(非真實(shí)依賴(lài),只是寄存器名相同而已) 代價(jià)是什么? 多用了三個(gè)臨時(shí)寄存器,并增加了代碼大?。ù鎯?chǔ)空間變大) 為何第一條指令將 $s1減 16?與 $t0關(guān)聯(lián)的指令偏移為何不同? 好處:充分利用并行,并消除部分循環(huán)分支! Pipeline.106 2021年 2月 20日星期六 循環(huán)展開(kāi)后的偏移量 第一條指令將 $s1減 16,使指令執(zhí)行后, $s1的值變成了循環(huán)結(jié)束時(shí) $s1的值 所以循環(huán)體內(nèi)各數(shù)組元素的訪(fǎng)問(wèn)指令的偏移量依次為: 16 - 數(shù)組元素 1, 12 - 數(shù)組元素 2 , 8 - 數(shù)組元素 3, 4 - 數(shù)組元素 4 $s1 $s1-16 數(shù)組元素 1 數(shù)組元素
52、2 數(shù)組元素 3 數(shù)組元素 4 為什么第一個(gè)周期中的 lw指令的偏移量為 0? 因?yàn)榈谝粋€(gè)周期中的 lw指令進(jìn)行地址計(jì)算時(shí), addi指令的執(zhí)行結(jié)果還沒(méi)有寫(xiě)到 $s1中,所以, 此時(shí) $s1中還是原來(lái)的值 ? 為什么第一條 addu指令不放在第二周期 ? 為了避免 load-use數(shù)據(jù)冒險(xiǎn)! 當(dāng)循環(huán)次數(shù)不是 4的倍數(shù)時(shí),這樣做就有問(wèn)題! 可見(jiàn):編譯器和機(jī)器結(jié)構(gòu)密切相關(guān)!系統(tǒng)程序員必須非常 了解機(jī)器結(jié)構(gòu)!編譯器的好壞直接影響機(jī)器的性能! Pipeline.107 2021年 2月 20日星期六 實(shí)例: Intel IA-64架構(gòu) IA-64類(lèi)似于 64位 MIPS架構(gòu),是 Register-Re
53、gister型的 RISC風(fēng)格指令集 但有獨(dú)特性:要求編譯器顯式地給出指令級(jí)的并行性, Intel稱(chēng)其為 EPIC Explicitly Parallel Instruction Computer顯式并行指令計(jì)算機(jī) 與 MIPS-64架構(gòu)的區(qū)別 更多寄存器: 128個(gè)整數(shù)、 128個(gè)浮點(diǎn)數(shù)、 8個(gè)專(zhuān)用分支、 64個(gè) 1位謂詞 支持 寄存器窗口重疊技術(shù) 同時(shí)發(fā)射的指令組織在指令包( bundle)中 引入特殊的謂詞化技術(shù),以支持推測(cè)執(zhí)行和消除分支,提高指令級(jí)并行度 EPIC的實(shí)現(xiàn)技術(shù) 指令組( Instruction Group):相互間沒(méi)有寄存器級(jí)數(shù)據(jù)依賴(lài)的指令序列 - 指令組長(zhǎng)度任意,用“停
54、止標(biāo)記”在指令組之間明顯標(biāo)識(shí) - 指令組內(nèi)部的所有指令可并行執(zhí)行,只要有足夠硬件且無(wú)內(nèi)存操作依賴(lài) 指令包:同時(shí)發(fā)射的指令重新編碼并形成指令包 - 長(zhǎng)度為 128,由 5位長(zhǎng)的模板字段、三個(gè) 41位長(zhǎng)的指令組成 - 模板字段對(duì)應(yīng)于以下五類(lèi)功能部件中的三條指令 整數(shù) ALU、非整數(shù) ALU(移位和多媒體)、訪(fǎng)存、浮點(diǎn)、分支 謂詞化 :將指令的執(zhí)行與謂詞相關(guān)聯(lián),而不是與分支指令關(guān)聯(lián) Intel IA-64是 ?-發(fā)射流水線(xiàn)? 3-發(fā)射流水線(xiàn)! BACK Pipeline.108 2021年 2月 20日星期六 RISC的通用寄存器 RISC機(jī)采用大量寄存器 其目的: 減少程序訪(fǎng)問(wèn)存儲(chǔ)器的次數(shù) RIS
55、C機(jī)寄存器的組織方式有兩種: 重疊寄存器窗口技術(shù) ORW(硬件方法) - 執(zhí)行過(guò)程調(diào)用和返回時(shí),利用寄存器組而不是存儲(chǔ)器來(lái)完成參數(shù)傳遞 - 通過(guò)重疊窗口技術(shù),使得不再需要保存和恢復(fù)寄存器內(nèi)容 - 可大大提高了程序執(zhí)行的速度 優(yōu)化寄存器分配技術(shù)(軟件方法) - 規(guī)定一套寄存器分配算法 - 通過(guò)編譯程序的優(yōu)化處理來(lái)充分利用寄存器資源 - 編譯器為那些在一定的時(shí)間內(nèi)使用最多的變量分配寄存器 BACK Pipeline.109 2021年 2月 20日星期六 重疊寄存器窗口技術(shù)( Overlapped Register Window ) 用于保存 局部數(shù)據(jù) 與調(diào)用自己的 父過(guò)程的輸出 寄存器重疊 與被
56、調(diào)用子 過(guò)程的輸入 寄存器重疊 A調(diào)用 B時(shí),由于各自使用不同的局部寄存器,所以 不需保存現(xiàn)場(chǎng) A過(guò)程的輸出寄存器可直接把參數(shù)送給 B 從 B返回時(shí), B將返回結(jié)果送到其輸入寄存器, A可 直接得到 B返回的結(jié)果 寄存器分為兩類(lèi): 全局寄存器:所有過(guò)程共享 窗口寄存器:用于過(guò)程調(diào)用 BACK Pipeline.110 2021年 2月 20日星期六 Intel IA-64架構(gòu)的謂詞和推測(cè)執(zhí)行技術(shù) 謂詞和謂詞寄存器 分支指令中的條件稱(chēng)為謂詞 每個(gè)謂詞與一個(gè)謂詞寄存器相關(guān)聯(lián) 每條指令都可與最后 6位標(biāo)識(shí)( 64個(gè)一位謂詞,故謂詞寄存器的標(biāo)號(hào)用 6 位表示)的謂詞寄存器相關(guān)聯(lián),反映條件是否滿(mǎn)足 可消
57、除循環(huán)內(nèi) if-then-else分支(循環(huán)分支可由循環(huán)展開(kāi)部分消除) 例: if (p) Statement1 else Statement2 被編譯成: (p) Statement1 (p) Statement2 括號(hào)中的條件為 1時(shí),執(zhí)行后面的代碼,否則,轉(zhuǎn)化為 nop指令 條件分支指令被轉(zhuǎn)化為由謂詞寄存器關(guān)聯(lián)的指令,消除了分支 通過(guò)謂詞寄存器可實(shí)現(xiàn)指令的推測(cè)執(zhí)行 IA-64是采用靜態(tài)多發(fā)射機(jī)制的最復(fù)雜指令集,對(duì)編譯器的要求極高 BACK Pipeline.111 2021年 2月 20日星期六 動(dòng)態(tài)多發(fā)射處理器 由硬件在執(zhí)行時(shí)動(dòng)態(tài)完成指令打包或冒險(xiǎn)處理 通常被稱(chēng)為超標(biāo)量處理器( Sup
58、erscalar) 在一個(gè)周期內(nèi)執(zhí)行一條以上指令 與 VLIW處理器的不同點(diǎn): VLIW處理器: 編譯結(jié)果與機(jī)器結(jié)構(gòu)密切相關(guān),結(jié)構(gòu)有差異的機(jī)器上要重新編譯 超標(biāo)量處理器: 編譯器僅進(jìn)行指令順序調(diào)整,但不進(jìn)行指令打包,由硬件根據(jù) 機(jī)器的結(jié)構(gòu)來(lái)決定一個(gè)周期發(fā)射哪幾條指令。因此,編譯后的代碼能夠被不同 結(jié)構(gòu)的機(jī)器正確執(zhí)行 多數(shù)超標(biāo)量處理器都結(jié)合動(dòng)態(tài)流水線(xiàn)調(diào)度 ( Dynamic pipeline scheduling)技術(shù) 通過(guò)指令相關(guān)性檢測(cè)和動(dòng)態(tài)分支預(yù)測(cè)等手段,投機(jī)性地不按指令順序執(zhí)行,當(dāng) 發(fā)生流水線(xiàn)阻塞時(shí),可以到后面找指令來(lái)執(zhí)行 舉例說(shuō)明動(dòng)態(tài)流水線(xiàn)調(diào)度技術(shù): sub指令可以提前執(zhí)行,不需等 lw
59、和 addu指令執(zhí)行完 如果不將 sub調(diào)到前面,可能要等很長(zhǎng)時(shí)間( lw指令 的訪(fǎng)存操作耗時(shí)較長(zhǎng)?。?,從而影響 slti指令的執(zhí)行 左邊指令序列中,哪條指令可以提前執(zhí)行? 最佳的方案是什么? SKIP Pipeline.112 2021年 2月 20日星期六 動(dòng)態(tài)流水線(xiàn)調(diào)度的通用模型 動(dòng)態(tài)流水線(xiàn)的一個(gè)重要的思想:在等待解決阻塞時(shí),到后面找指令提前執(zhí)行! 動(dòng)態(tài)流水線(xiàn)的通用模型: 一個(gè)指令預(yù)取和譯碼單元: 有序發(fā)射 多個(gè)并列執(zhí)行的功能單元: 亂序執(zhí)行 一個(gè)提交單元: 有序提交 每個(gè)功能單元有各自的 保留站 用于保存操作數(shù)和操作命令 功能單元 一旦完成 ,則將結(jié)果同時(shí)送 其他等待該結(jié)果的 保留站和
60、提交單元 提交單元 緩存所有完成的指令結(jié)果,直 到該結(jié)果能安全寫(xiě)回到寄存器或存儲(chǔ)器 , 稱(chēng)為 Reorder Buffer 指令的結(jié)果也可 在 Reorder Buffer中被“轉(zhuǎn)發(fā)” Pipeline.113 2021年 2月 20日星期六 功能單元的性能 功能:用來(lái)執(zhí)行特定類(lèi)型的操作 性能:每個(gè)功能單元具有基本的操作性能,用兩個(gè)周期數(shù)來(lái)刻畫(huà) 執(zhí)行周期( Latency):完成特定操作所花的周期數(shù) 發(fā)射時(shí)間( Issue Time):連續(xù)、獨(dú)立操作之間的最短周期數(shù) 以下是 Pentium III 算術(shù)功能部件的性能 從上述圖中看出,哪些功能部件是流水化的?哪些是非流水化的? 整數(shù)加、整數(shù)乘、
61、浮點(diǎn)加、裝入、存儲(chǔ)這五種部件是流水化的 浮點(diǎn)乘部件是部分流水化 整數(shù)除和浮點(diǎn)除是完全沒(méi)有流水化 CPU設(shè)計(jì)的一個(gè)原則:有限的芯片空間應(yīng)該在各功能部件之間進(jìn)行平衡!盡量讓大多數(shù)資源用 于最關(guān)鍵的操作 (對(duì)大量基準(zhǔn)程序進(jìn)行評(píng)估) 從上述圖中能否看出:哪些是最重要的操作?哪些是不常用的? 整數(shù)加法和乘法、浮點(diǎn)數(shù)加法和乘法是重要的操作 除法相對(duì)來(lái)說(shuō)不太常用,而且本身難以實(shí)現(xiàn)流水線(xiàn) Pipeline.114 2021年 2月 20日星期六 動(dòng)態(tài)流水線(xiàn)的幾種執(zhí)行模式 根據(jù)動(dòng)態(tài)流水線(xiàn)指令發(fā)射和完成順序,可分為三種執(zhí)行模式: 按序發(fā)射按序完成( Pentium) 按序發(fā)射無(wú)序完成( Pentium II和 P
62、entium III) 無(wú)序發(fā)射無(wú)序完成( Pentium 4) 保留站:存放操作數(shù)和操作命令 最保守的方案是順序完成,好處: (1) 簡(jiǎn)化異常檢測(cè)和異常處理 (2) 能在被推測(cè)指令完成前得知推測(cè) 結(jié)果的正確性 指令發(fā)射時(shí),其操作數(shù)可能在寄存器堆或 ROB中,可 立即復(fù)制到保留站中,故源操作數(shù)寄存器可被覆蓋 若操作數(shù)不在寄存器堆或 ROB中,則一定在某個(gè)時(shí)刻 被一個(gè)功能單元計(jì)算出來(lái),硬件將定位該功能單元,并 將結(jié)果從旁路寄存器復(fù)制到保留站 ReOrder Buffer 重排序緩沖 : 用于保存已完成的指令結(jié)果, 等待 在可能時(shí) 寫(xiě)回寄存器堆 寫(xiě)回條件: 與前面的所 有指令結(jié)果不相關(guān)、并 預(yù)測(cè)正
63、確 SKIP Pipeline.115 2021年 2月 20日星期六 按序發(fā)射按序完成 舉例: 2發(fā)射超標(biāo)量,分為取指( F)、譯碼( D)、執(zhí)行( E)、寫(xiě)回( W)。 F 、 D、 W段在一個(gè)時(shí)鐘周期內(nèi)完成(可同時(shí)有兩條指令在這三個(gè)階段); E段有三 個(gè)執(zhí)行部件: Load/Store部件完成數(shù)據(jù) Cache訪(fǎng)問(wèn)需要 1個(gè)時(shí)鐘,整數(shù) ALU完成 簡(jiǎn)單 ALU操作需 2個(gè)時(shí)鐘,整數(shù)乘法器完成乘法運(yùn)算需要 3個(gè)時(shí)鐘。執(zhí)行部件采用 流水化方式。 按序發(fā)射按序完成的過(guò)程如下: i1 lw $1, A i2 add $2, $2, $1 i3 add $3, $3, $4 i4 mul $4, $
64、5, $4 i5 lw $6, B i6 mul $6, $6, $7 為了按序完成,雖然 i5在時(shí)鐘 6已經(jīng)完成, 但一直推遲到 i4寫(xiě)回后的第 9時(shí)鐘才寫(xiě)回 譯碼段 執(zhí)行段 寫(xiě)回段 i1 i2 2 時(shí)鐘 3 4 5 6 7 8 9 10 i2 ALU L/S Mul i1 i2 i2 i3 i3 i4 i4 i4 i3 i4 i5 i6 i5 i6 i6 i6 i5 i5 i1 i2 i3 i4 i5 i6 i6 i1、 i2間 RAW; i5、 i6間 RAW和 WAW,需 阻塞一個(gè)時(shí)鐘周期,并一定要按序完成! 指令被阻塞在“譯碼器” 中 如果還有一條乘法指令,則最多可有三條乘法指令同時(shí)
65、在執(zhí)行 BACK Pipeline.116 2021年 2月 20日星期六 按序發(fā)射無(wú)序完成 舉例: 2發(fā)射超標(biāo)量,分為取指( F)、譯碼( D)、執(zhí)行( E)、寫(xiě)回( W)。 F 、 D、 W段在一個(gè)時(shí)鐘周期內(nèi)完成(可同時(shí)有兩條指令在這三個(gè)階段); E段有三 個(gè)執(zhí)行部件: Load/Store部件完成數(shù)據(jù) Cache訪(fǎng)問(wèn)需要 1個(gè)時(shí)鐘,整數(shù) ALU完成 簡(jiǎn)單 ALU操作只需 2個(gè)時(shí)鐘,整數(shù)乘法器完成乘法運(yùn)算需要 3個(gè)時(shí)鐘。執(zhí)行部件采 用流水化方式。 按序發(fā)射無(wú)序完成的過(guò)程如下: i1 lw $1, A i2 add $2, $2, $1 i3 add $3, $3, $4 i4 mul $4
66、, $5, $4 i5 lw $6, B i6 mul $6, $6, $7 譯碼段 執(zhí)行段 寫(xiě)回段 i1 i2 2 時(shí)鐘 3 4 5 6 7 8 9 10 i2 ALU L/S Mul i1 i2 i2 i3 i3 i4 i4 i4 i3 i4 i5 i6 i5 i6 i6 i6 i5 i5 i1 i2 i3 i4 i5 i6 i6 無(wú)序完成時(shí), 因?yàn)?i5在時(shí)鐘 6已經(jīng)完成,和 i3、 i4沒(méi)有相關(guān)性,可以不需要等 i3、 i4寫(xiě) 回后再寫(xiě)回,所以可先于 i4完成。 BACK Pipeline.117 2021年 2月 20日星期六 無(wú)序發(fā)射無(wú)序完成 舉例: 2發(fā)射超標(biāo)量,分為取指( F)、譯碼( D)、執(zhí)行( E)、寫(xiě)回( W)。 F 、 D、 W段在一個(gè)時(shí)鐘周期內(nèi)完成(可同時(shí)有兩條指令在這三個(gè)階段); E段有三 個(gè)執(zhí)行部件: Load/Store部件完成數(shù)據(jù) Cache訪(fǎng)問(wèn)需要 1個(gè)時(shí)鐘,整數(shù) ALU完成 簡(jiǎn)單 ALU操作只需 2個(gè)時(shí)鐘,整數(shù)乘法器完成乘法運(yùn)算需要 3個(gè)時(shí)鐘。執(zhí)行部件采 用流水化方式。 無(wú)序發(fā)射無(wú)序完成的過(guò)程如下: i1 lw $1, A i2 add $2,
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案