computer architecture: a constructive approach six stage pipeline/bypassing joel emer

26
Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology March 14, 2012 http:// csg.csail.mit.edu/6.S078 L11-1

Upload: morton

Post on 23-Feb-2016

53 views

Category:

Documents


0 download

DESCRIPTION

Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer Computer Science & Artificial Intelligence Lab. Massachusetts Institute of Technology. Three-Cycle SMIPS: Analysis. Decode/ RegRead / Execute/Memory. Fetch. Writeback. pc. wr. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Computer Architecture: A Constructive Approach

Six Stage Pipeline/Bypassing

Joel EmerComputer Science & Artificial Intelligence Lab.Massachusetts Institute of Technology

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-1

Page 2: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Three-Cycle SMIPS: Analysis

Fetch Decode/RegRead/Execute/Memory

Decode/RegRead/Execute/Memory

Fetch

Does Fetch or DRXM depend on Writeback?

March 14, 2012http://csg.csail.mit.edu/

6.S078

Yes, for register values

pc

ir Writebackmr

Writeback

wr

L11-2

Page 3: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Stall calculation

March 14, 2012http://csg.csail.mit.edu/

6.S078

Stall calculation

WB Stall Reg

WB Feedback

wbStall

L11-3

Page 4: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Data dependence waterfall

March 14, 2012http://csg.csail.mit.edu/

6.S078

From whiteboard

L11-4

Page 5: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Types of Data Hazards

March 14, 2012http://csg.csail.mit.edu/

6.S078

Data-dependencer3 (r1) op (r2) Read-after-Write r5 (r3) op (r4) (RAW) hazard

Consider executing a sequence of instructions like:rk (ri) op (rj)

Anti-dependencer3 (r1) op (r2) Write-after-Read r1 (r4) op (r5) (WAR) hazard

Output-dependencer3 (r1) op (r2) Write-after-Write r3 (r6) op (r7) (WAW) hazard

L11-5

Page 6: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

March 14, 2012http://csg.csail.mit.edu/

6.S078

Detecting Data HazardsRange and Domain of instruction i

R(i) = Registers (or other storage) modified by instruction i

D(i) = Registers (or other storage) read by instruction i

Suppose instruction j follows instruction i in the program order. Executing instruction j before the effect of instruction i has taken place can cause a

RAW hazard if R(i) D(j) WAR hazard if D(i) R(j) WAW hazard if R(i) R(j)

L11-6

Page 7: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

March 14, 2012http://csg.csail.mit.edu/

6.S078

Register vs. MemoryData Dependence

Data hazards due to register operands can be determined at the decode stage but

Data hazards due to memory operands can be determined only after computing the effective address

store M[(r1) + disp1] (r2) load r3 M[(r4) + disp2]

Does (r1 + disp1) = (r4 + disp2) ?

L11-7

Page 8: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

March 14, 2012http://csg.csail.mit.edu/

6.S078

Data Hazards: An ExampleI1 DIVD f6, f6, f4

I2 LD f2, 45(r3)

I3 MULTD f0, f2, f4

I4 DIVD f8, f6, f2

I5 SUBD f10, f0, f6

I6 ADDD f6, f8, f2RAW HazardsWAR HazardsWAW Hazards

L11-8

Page 9: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Scoreboard

Add a scoreboard of registers in use: Set bit for each register to be updated Clear bit when a register is updated Stall if bit for a register needed is set

March 14, 2012http://csg.csail.mit.edu/

6.S078

R31 • • • • • R0

Register#(Bit#(32)) scoreboard <- mkReg(0);

L11-9

Page 10: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

SMIPs Pipeline AnalysisStage Tclock >

Six stageFetch tM

Decode tDEC

Register Read tRF

Execute tALU

Memory tM

Writeback tWB

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-10

Page 11: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six Stage Pipeline

March 14, 2012http://csg.csail.mit.edu/

6.S078

F

Fetch

fr D

Decode

dr R

RegRead

rr X

Execute

xr M

Memory

mr W

Write-back

pc

wb

Where do we need feedback?X to F and W to R

L11-11

Page 12: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Statemodule mkProc(Proc); Reg#(Addr) fetchPc <- mkRegU; RFile rf <- mkRFile; Memory mem <- mkMemory;

FIFO#(FBundle) fr <- mkFIFO; FIFO#(DecBundle) dr <- mkFIFO; FIFO#(RegBundle) rr <- mkFIFO; FIFO#(EBundle) xr <- mkFIFO; FIFO#(WBundle) mr <- mkFIFO;

FIFOF#(Addr) nextPc <- mkFIFOF; FIFOF#(Rindx) wbRind <- mkFIFOF;

// and internal control state…

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-12

Page 13: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Fetchrule doFetch; Addr pc = ?; Bool epoch = fetchEpoch;

if (nextPc.notEmpty) begin pc = nextPc.first; epoch = !fetchEpoch; nextPc.deq; end else pc = fetchPc + 4;

fetchPc <= pc; fetchEpoch <= epoch;

let instResp <- mem.op(MemReq{op:Ld, addr:pc, data:?});

fr.enq(FBundle{pc:pc,epoch:epoch,InstResp:instResp});

endrule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-13

Page 14: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Decoderule doDecode; let fetchInst = fr.first; let pcPlus4 = fetchInst.predpc + 4;

let decInst = decode(fetchInst.instResp, pcPlus4);

decInst.epoch = fetchInst.epoch;

dr.enq(decInst); fr.deq;

endrule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-14

Page 15: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Register Read Stage

March 14, 2012http://csg.csail.mit.edu/

6.S078

dr R

RegRead

rr

Readregs

RF

W

RF must beavailable to ReadSrcs and Writeback!

D

Decode

Decode

L11-15

Page 16: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Register Read Moduletypedef struct { Data: src1; Data: src2 } Sources;

module mkRegRead#(RFile rf)(RegRead); Reg#(Bool) scoreboardReg <- mkReg(False); Dwire#(Bool) scoreboard <-mkDwire(scoreboardReg);

rule updateScoreboard; scoreboardReg <= scoreboard; endrule

method Maybe#(Sources) readRegs(DecodeInst decInst); let src1 = rf.rd1(decInst.op1); let src2 = …

if (scoreboardReg) return tagged Invalid; else return tagged Valid Sources{src1:src1,…}; endmethod

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-16

Page 17: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Register Read Moduletypedef struct { Data: src1; Data: src2 } Sources;

module mkRegRead#(RFile rf)(RegRead); Reg#(Bool) scoreboardReg <- mkReg(False); method Maybe#(Sources) readRegs(DecodeInst decInst); let src1 = rf.rd1(decInst.op1); let src2 = …

if (scoreboardReg) return tagged Invalid; else return tagged Valid Sources{src1:src1,…}; endmethod

March 14, 2012http://csg.csail.mit.edu/

6.S078

To use need to instantiate with:

let readreg <- mkReadReg(rf);

L11-17

Page 18: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Register Read (cont) RWire#(Bool) next_available <-mkRWire; RWire#(Bool) next_unavailable <- mkRWire;

method markAvailable(); next_available.wset(False); endmethod method markUnavailable(); next_unavailable.wset(True); endmethod

rule updateScoreboard; if (next_unavailable matches tagged Valid .ua) scoreboardReg <= True; else if (next_available matches tagged Valid .a) scoreboardReg <= False; endruleendmodule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-18

Page 19: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Register Readrule doRegRead; if (wbRind.notEmpty) begin readreg.markAvailable(); wbRind.deq; end let decInst = dr.first(); if (execEpoch != decInst.epoch) begin readreg.markAvailable(); dr.deq() end; else begin maybeSources = readregs.readRegs(decInst); if (maybeSources match tagged Valid .sources) begin if (writesreg(decInst)) rr.markUnavailable(); rr.enq(RegBundle{decodebundle: decInst, src1: srouces.src1, src2: sources.src2}); dr.deq(); end endendrule

March 14, 2012http://csg.csail.mit.edu/

6.S078

Better scoreboard will need register index!L11-19

Page 20: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Executerule doExecute; let decInst = rr.first.decodebundle; let epochChange = (decInst.epoch != execEpoch); let src1 = rr.first.src1; let src2 = ...

if (! epochChange) begin let execInst = exec.exec(decInst, src1, src2); if (execInst.cond) begin nextPc.enq(execInst.addr); execEpoch <= !execEpoch; end xr.enq(execInst); end rr.deq();endrule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-20

Page 21: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Memoryrule doMemory; let execInst = xr.first;

if (execInst.itype==Ld || execInst.itype==St) begin execInst.data <- mem(MemReq{ op:execInst.itype==Ld ? Ld : St, addr:execInst.addr, data:execInst.data}); end

mr.enq(WBBundle{itype:execInst.itype, rdst:execInst.rdst, data:execInst.data}); xr.deq();endrule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-21

Page 22: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six-Stage Writebackrule doWriteBack;

wbRind.enq(mr.first.rdst);

rf.wr(mr.first.rdst, mr.first.data); mr.deq;endrule

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-22

Page 23: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Six Stage Waterfall

March 14, 2012http://csg.csail.mit.edu/

6.S078

From whiteboard

L11-23

Page 24: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Bypass

March 14, 2012http://csg.csail.mit.edu/

6.S078

RegRead Executerr

If scoreboard says register is not available then RegRead needs to stall, unless it sees what it needs on the bypass line….

What does RegRead need to do?

L11-24

Page 25: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Bypass Network

March 14, 2012http://csg.csail.mit.edu/

6.S078

typedef struct { Rindx regnum; Data value;} BypassValue;

Module mkBypass(BypassNetwork) Rwire#(BypassValue) bypass;

method produceBypass(Rindx regnum, Data value); bypass = BypassValue{regname: regnum, value:value}; endmethod

method Maybe#(Data) consumeBypass(Rindx regnum); if (bypass matches tagged Valid .b && b.regnum == regnum) return tagged Valid b.value; else return tagged Invalid; endmethodendmodule

Real network will have many sources. How are they ordered?

From earlier stages to laterL11-25

Page 26: Computer Architecture: A Constructive Approach Six Stage Pipeline/Bypassing Joel Emer

Register Read (with bypass)module mkRegRead#(RFile rf, BypassNetwork bypass)(RegRead); method Maybe#(Sources) readRegs(DecodeInst decInst); let src1 = rf.rd1(decInst.op1); let src2 = … if (!scoreboardReg) return tagged Valid Sources{src1:src1,…}; else begin let b1 = bypass.consumebypass(decInst.op1); let b2 = if (b1 matches tagged Valid .v1 && b2 matches…) return tagged Valid Sources{src1:v1.value …); else return tagged Invalid; end endmethod

March 14, 2012http://csg.csail.mit.edu/

6.S078 L11-26