【正文】
??For simple RISC pipeline, CPI = 1: 計(jì)算機(jī)體系結(jié)構(gòu) 例如: Dualport vs. Singleport ? 機(jī)器 A: Dual ported memory (“Harvard Architecture”) ? 機(jī)器 B: Single ported memory, 但其流水線實(shí)現(xiàn)時(shí)比非流水實(shí)現(xiàn)時(shí)鐘頻率快 倍 ? Ideal CPI = 1 for both ? 所執(zhí)行的指令中 Loads指令占 40% SpeedUpA = Pipeline Depth/(1 + 0) x (clockunpipe/clockpipe) = Pipeline Depth Cycle Timeunpipeb = CycleTimepipe SpeedUpB = Pipeline Depth/(1 + x 1) x (cycleTimeunpipe/(cycletimepipe) = (Pipeline Depth/) x = x Pipeline Depth SpeedUpA / SpeedUpB = Pipeline Depth/( x Pipeline Depth) = ? Machine A 比 MachineB快 計(jì)算機(jī)體系結(jié)構(gòu) I n s t r. O r d e r add r1,r2,r3 sub r4,r1,r3 and r6,r1,r7 or r8,r1,r9 xor r10,r1,r11 Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg 數(shù)據(jù)相關(guān)問題(圖 Page 100) Time (clock cycles) IF ID/RF EX MEM WB 計(jì)算機(jī)體系結(jié)構(gòu) ?寫后讀相關(guān) (Read After Write (RAW)) InstrJ tries to read operand before InstrI writes it ?由于實(shí)際的通信需求而引起的 三種基本的數(shù)據(jù)相關(guān) I: add r1,r2,r3 J: sub r4,r1,r3 計(jì)算機(jī)體系結(jié)構(gòu) ? 讀后寫相關(guān) Write After Read (WAR) InstrJ writes operand before InstrI reads it ? 編譯器編寫者稱之為 “antidependence”( 反相關(guān)),是由于重復(fù)使用寄存器名 “r1”引起的 . ? DLX 5 段流水線不會(huì)有此類相關(guān)因?yàn)?: ? 所有的指令都是 5段 , 并且 ? 讀操作總是在第 2段,而 ? 寫操作在第 5段 I: sub r4,r1,r3 J: add r1,r2,r3 K: mul r6,r1,r7 計(jì)算機(jī)體系結(jié)構(gòu) ? 寫后寫相關(guān)( Write After Write (WAW)) InstrJ writes operand before InstrI writes it. ? 編譯器編寫者稱之為 “output dependence” , 也是由于重復(fù)使用寄存器名 “r1”引起的 . ? 在 DLX 5段流水線中,也不會(huì)發(fā)生。因?yàn)? ? 所有指令都是 5段,并且寫操作都在第 5段 ? 在后面的復(fù)雜的流水線中我們將會(huì)看到 WAR 和 WAW 相關(guān) I: sub r1,r4,r3 J: add r1,r2,r3 K: mul r6,r1,r7 計(jì)算機(jī)體系結(jié)構(gòu) 采用定向技術(shù)避免數(shù)據(jù)相關(guān)(圖 Page 102) Time (clock cycles) I n s t r. O r d e r add r1,r2,r3 sub r4,r1,r3 and r6,r1,r7 or r8,r1,r9 xor r10,r1,r11 Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg 計(jì)算機(jī)體系結(jié)構(gòu) I n s t r. O r d e r lw r1, 0(r2) sub r4,r1,r6 and r6,r1,r7 or r8,r1,r9 采用定向技術(shù)仍然存在相關(guān) (圖 Page 153) Time (clock cycles) Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg Reg ALU DMem Ifetch Reg 計(jì)算機(jī)體系結(jié)構(gòu) DMem Time (clock cycles) or r8,r1,r9 I n s t r. O r d e r lw r1, 0(r2) sub r4,r1,r6 and r6,r1,r7 Reg ALU DMem Ifetch Reg Reg Ifetch ALU DMem Reg Bubble Ifetch ALU DMem Reg Bubble Reg Ifetch ALU Bubble Reg 計(jì)算機(jī)體系結(jié)構(gòu) Try producing fast code for a = b + c。 Repeat Interval ?延時(shí) (Latency) ? 定義為完成某一操作所需的 cycle數(shù) ? 定義為使用當(dāng)前指令所產(chǎn)生結(jié)果的指令與當(dāng)前指令間的最小間隔周期數(shù) ?循環(huán)間隔( Repeat/Initiation interval) ? 發(fā)射相同類型的指令所需的間隔周期數(shù) ?對(duì)于 EX部件流水化的新的 DLX Function Unit Latency Repeat Interval Integer ALU 0 1 Data Memory (Integer and FP loads(1 less for store latency)) 1 1 FP Add 3 1 FP multiply 6 1 FP Divide (also integer divide and FP sqrt) 24 25 計(jì)算機(jī)體系結(jié)構(gòu) 將部分執(zhí)行部件流水化后的 DLX流水線 計(jì)算機(jī)體系結(jié)構(gòu) 新的相關(guān)和定向問題 ?結(jié)構(gòu)沖突增多 ? 非流水的 Divide部件,使得 EX段增長(zhǎng) 24個(gè) cycles ? 在一個(gè)周期內(nèi)有多個(gè)寄存器寫操作 3 FPR write ?可能指令亂序完成(亂序到達(dá) WB段)有可能存在 WAW ?由于在 ID段讀,還不會(huì)有 WAR 相關(guān) ?亂序完成導(dǎo)致異常處理復(fù)雜 ?由于指令的延遲加大導(dǎo)致 RAW 相關(guān)的 stall數(shù)增多 ?需要付出更多的代價(jià)來增加定向路徑 計(jì)算機(jī)體系結(jié)構(gòu) 新的結(jié)構(gòu)相關(guān) ?縱向檢查指令所使用的資源 ? 第 10個(gè) cycle, 三條指令同時(shí)進(jìn)入 MEM, 但由于 MULTD和 ADDD在 MEM段沒有實(shí)際動(dòng)作,這種情況沒有關(guān)系 ? 第 11個(gè) cycle, 三條指令同時(shí)進(jìn)入 WB段,存在結(jié)構(gòu)相關(guān) 計(jì)算機(jī)體系結(jié)構(gòu) 解決方法 ?Option 1 ? 在 ID段跟蹤寫端口的使用情況,以便能暫停該指令的發(fā)射 ? 一旦發(fā)現(xiàn)沖突,暫停當(dāng)前指令的發(fā)射 ?Option 2 ? 在進(jìn)入 MEM或 WB段時(shí),暫停沖突的指令,讓有較長(zhǎng)延時(shí)的指令先做,因?yàn)檩^長(zhǎng)延時(shí)的指令,會(huì)更容易引起其他 RAW相關(guān),從而導(dǎo)致更多的 stalls 計(jì)算機(jī)體系結(jié)構(gòu) 關(guān)于數(shù)據(jù)相關(guān) ?較長(zhǎng)延時(shí)的流水線,導(dǎo)致數(shù)據(jù)相關(guān)比例增多, stalls數(shù)增多 計(jì)算機(jī)體系結(jié)構(gòu) 新的沖突源 ?GPR與 FPR間的數(shù)據(jù)傳送造成的數(shù)據(jù)相關(guān) ? MOVI2FP and MOVFP2I instructions ?如果在 ID段進(jìn)行相關(guān)檢測(cè),指令發(fā)射前須做如下檢測(cè): ? 結(jié)構(gòu)相關(guān) 循環(huán)間隔檢測(cè) 確定寄存器寫端口是否可用 ? RAW相關(guān) 列表所有待寫的目的寄存器 不發(fā)射以待寫寄存器做為源寄存器的指令,直到該寄存器值可用 ? WAW相關(guān) 仍然使用上述待寫寄存器列表 不發(fā)射那些目的寄存器在待寫寄存器列表中的指令,直到對(duì)應(yīng)的待寫寄存器值可用 (完成 WB)。 ?方法 2:緩存操作結(jié)果,直到早期發(fā)射的指令執(zhí)行完。 assuming a, b, c, d ,e, and f in memory. Slow code: