Advanced Computer Architecture Chapter 4 Advanced Pipelining Ioannis Papaefstathiou CS 590.25 Easter 2003 (thanks to Hennesy & Patterson) Chapter Overview 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP Chap. 4 - Pipelining II 2 Chapter Overview Technique Reduces Section Loop Unrolling Control Stalls 4.1 Basic Pipeline Scheduling RAW Stalls 4.1 Dynamic Scheduling with Scoreboarding RAW stalls 4.2 Dynamic Scheduling with Register Renaming WAR and WAW stalls 4.2 Dynamic Branch Prediction Control Stalls 4.3 Issue Multiple Instructions per Cycle Ideal CPI 4.4 Compiler Dependence Analysis Ideal CPI & data stalls 4.5 Software pipelining and trace scheduling Ideal CPI & data stalls 4.5 Speculation All data & control stalls 4.6 Dynamic memory disambiguation RAW stalls involving memory 4.2, 4.6 Chap. 4 - Pipelining II 3 Instruction Level Parallelism 4.1 Instruction Level Parallelism: Concepts and Challenges ILP is the principle that there are many instructions in code that don’t depend on each other. That means it’s possible to execute those instructions in parallel. 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP This is easier said than done: Issues include: • Building compilers to analyze the code, • Building hardware to be even smarter than that code. This section looks at some of the problems to be solved. Chap. 4 - Pipelining II 4 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling Terminology Basic Block - That set of instructions between entry points and between branches. A basic block has only one entry and one exit. Typically this is about 6 instructions long. Loop Level Parallelism - that parallelism that exists within a loop. Such parallelism can cross loop iterations. Loop Unrolling - Either the compiler or the hardware is able to exploit the parallelism inherent in the loop. Chap. 4 - Pipelining II 5 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling Simple Loop and its Assembler Equivalent This is a clean and simple example! for (i=1; i<=1000; i++) x(i) = x(i) + s; Loop: LD ADDD SD SUBI BNEZ NOP F0,0(R1) F4,F0,F2 0(R1),F4 R1,R1,8 R1,Loop ;F0=vector element ;add scalar from F2 ;store result ;decrement pointer 8bytes (DW) ;branch R1!=zero ;delayed branch slot Chap. 4 - Pipelining II 6 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling FP Loop Hazards Loop: LD ADDD SD SUBI BNEZ NOP F0,0(R1) F4,F0,F2 0(R1),F4 R1,R1,8 R1,Loop Instruction producing result FP ALU op FP ALU op Load double Load double Integer op Where are the stalls? ;F0=vector element ;add scalar in F2 ;store result ;decrement pointer 8B (DW) ;branch R1!=zero ;delayed branch slot Instruction using result Another FP ALU op Store double FP ALU op Store double Integer op Chap. 4 - Pipelining II Latency in clock cycles 3 2 1 0 0 7 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling FP Loop Showing Stalls 1 Loop: 2 3 4 5 6 7 8 9 10 LD stall ADDD stall stall SD SUBI stall BNEZ stall F0,0(R1) ;F0=vector element F4,F0,F2 ;add scalar in F2 0(R1),F4 R1,R1,8 ;store result ;decrement pointer 8Byte (DW) R1,Loop ;branch R1!=zero ;delayed branch slot Instruction producing result FP ALU op FP ALU op Load double Load double Integer op Instruction using result Another FP ALU op Store double FP ALU op Store double Integer op 10 clocks: Rewrite code Chap. 4 - Pipelining II to minimize stalls? Latency in clock cycles 3 2 1 0 0 8 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling Scheduled FP Loop Minimizing Stalls 1 Loop: 2 3 4 5 6 LD SUBI ADDD stall BNEZ SD F0,0(R1) R1,R1,8 F4,F0,F2 R1,Loop 8(R1),F4 Stall is because SD can’t proceed. ;delayed branch ;altered when move past SUBI Swap BNEZ and SD by changing address of SD Instruction producing result FP ALU op FP ALU op Load double Instruction using result Another FP ALU op Store double FP ALU op Latency in clock cycles 3 2 1 Now 6 clocks: Now unroll Chap. 4 - Pipelining II loop 4 times to make faster. 9 Pipeline Scheduling and Instruction Level Loop Unrolling Parallelism Unroll Loop Four Times (straightforward way) 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 LD stall ADDD stall stall SD LD stall ADDD stall stall SD LD stall F0,0(R1) F4,F0,F2 0(R1),F4 F6,-8(R1) F8,F6,F2 -8(R1),F8 F10,-16(R1) 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ADDD stall stall SD LD stall ADDD stall stall SD SUBI BNEZ stall NOP F12,F10,F2 -16(R1),F12 F14,-24(R1) F16,F14,F2 -24(R1),F16 R1,R1,#32 R1,LOOP 15 + 4 x (1+2) +1 = 28 clock cycles, or 7 per iteration Assumes R1 is multiple of 4 Rewrite loop to minimize stalls. Chap. 4 - Pipelining II 10 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling Unrolled Loop That Minimizes Stalls 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 LD LD LD LD ADDD ADDD ADDD ADDD SD SD SD SUBI BNEZ SD F0,0(R1) F6,-8(R1) F10,-16(R1) F14,-24(R1) F4,F0,F2 F8,F6,F2 F12,F10,F2 F16,F14,F2 0(R1),F4 -8(R1),F8 -16(R1),F12 R1,R1,#32 R1,LOOP 8(R1),F16 What assumptions made when moved code? – OK to move store past SUBI even though changes register – OK to move loads before stores: get right data? – When is it safe for compiler to do such changes? ; 8-32 = -24 No Stalls!! 14 clock cycles, or 3.5 per iteration Chap. 4 - Pipelining II 11 Instruction Level Parallelism Pipeline Scheduling and Loop Unrolling Summary of Loop Unrolling Example • • • • • • Determine that it was legal to move the SD after the SUBI and BNEZ, and find the amount to adjust the SD offset. Determine that unrolling the loop would be useful by finding that the loop iterations were independent, except for the loop maintenance code. Use different registers to avoid unnecessary constraints that would be forced by using the same registers for different computations. Eliminate the extra tests and branches and adjust the loop maintenance code. Determine that the loads and stores in the unrolled loop can be interchanged by observing that the loads and stores from different iterations are independent. This requires analyzing the memory addresses and finding that they do not refer to the same address. Schedule the code, preserving any dependences needed to yield the same result as the original code. Chap. 4 - Pipelining II 12 Instruction Level Parallelism Dependencies Compiler Perspectives on Code Movement Compiler concerned about dependencies in program. Not concerned if a HW hazard depends on a given pipeline. • Tries to schedule code to avoid hazards. • Looks for Data dependencies (RAW if a hazard for HW) – Instruction i produces a result used by instruction j, or – Instruction j is data dependent on instruction k, and instruction k is data dependent on instruction i. • If dependent, can’t execute in parallel • Easy to determine for registers (fixed names) • Hard for memory: – Does 100(R4) = 20(R6)? – From different loop iterations, does 20(R6) = 20(R6)? Chap. 4 - Pipelining II 13 Instruction Level Parallelism Data Dependencies Compiler Perspectives on Code Movement 1 Loop: 2 3 4 5 LD ADDD SUBI BNEZ SD F0,0(R1) F4,F0,F2 R1,R1,8 R1,Loop 8(R1),F4 Where are the data dependencies? ;delayed branch ;altered when move past SUBI Chap. 4 - Pipelining II 14 Instruction Level Parallelism Name Dependencies Compiler Perspectives on Code Movement • • • Another kind of dependence called name dependence: two instructions use same name (register or memory location) but don’t exchange data Anti-dependence (WAR if a hazard for HW) – Instruction j writes a register or memory location that instruction i reads from and instruction i is executed first Output dependence (WAW if a hazard for HW) – Instruction i and instruction j write the same register or memory location; ordering between instructions must be preserved. Chap. 4 - Pipelining II 15 Instruction Level Parallelism Name Dependencies Compiler Perspectives on Code Movement 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 LD ADDD SD LD ADDD SD LD ADDD SD LD ADDD SD SUBI BNEZ NOP F0,0(R1) F4,F0,F2 0(R1),F4 F0,-8(R1) F4,F0,F2 -8(R1),F4 F0,-16(R1) F4,F0,F2 -16(R1),F4 F0,-24(R1) F4,F0,F2 -24(R1),F4 R1,R1,#32 R1,LOOP Where are the name dependencies? No data is passed in F0, but can’t reuse F0 in cycle 4. How can we remove these dependencies? Chap. 4 - Pipelining II 16 Instruction Level Parallelism Name Dependencies Compiler Perspectives on Code Movement • • Again Name Dependencies are Hard for Memory Accesses – Does 100(R4) = 20(R6)? – From different loop iterations, does 20(R6) = 20(R6)? Our example required compiler to know that if R1 doesn’t change then: 0(R1) ≠ -8(R1) ≠ -16(R1) ≠ -24(R1) There were no dependencies between some loads and stores so they could be moved around each other Chap. 4 - Pipelining II 18 Instruction Level Parallelism Control Dependencies Compiler Perspectives on Code Movement • • Final kind of dependence called control dependence Example if p1 {S1;}; if p2 {S2;}; S1 is control dependent on p1 and S2 is control dependent on p2 but not on p1. Chap. 4 - Pipelining II 19 Instruction Level Parallelism Control Dependencies Compiler Perspectives on Code Movement • Two (obvious) constraints on control dependences: – An instruction that is control dependent on a branch cannot be moved before the branch so that its execution is no longer controlled by the branch. – An instruction that is not control dependent on a branch cannot be moved to after the branch so that its execution is controlled by the branch. • Control dependencies relaxed to get parallelism; get same effect if preserve order of exceptions (address in register checked by branch before use) and data flow (value in register depends on branch) Chap. 4 - Pipelining II 20 Instruction Level Parallelism Control Dependencies Compiler Perspectives on Code Movement 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .... LD ADDD SD SUBI BEQZ LD ADDD SD SUBI BEQZ LD ADDD SD SUBI BEQZ F0,0(R1) F4,F0,F2 0(R1),F4 R1,R1,8 R1,exit F0,0(R1) F4,F0,F2 0(R1),F4 R1,R1,8 R1,exit F0,0(R1) F4,F0,F2 0(R1),F4 R1,R1,8 R1,exit Where are the control dependencies? Chap. 4 - Pipelining II 21 Instruction Level Parallelism Loop Level Parallelism When Safe to Unroll Loop? • Example: Where are data dependencies? (A,B,C distinct & non-overlapping) for (i=1; i<=100; i=i+1) { A[i+1] = A[i] + C[i]; /* S1 */ B[i+1] = B[i] + A[i+1]; /* S2 */ } 1. S2 uses the value, A[i+1], computed by S1 in the same iteration. 2. S1 uses a value computed by S1 in an earlier iteration, since iteration i computes A[i+1] which is read in iteration i+1. The same is true of S2 for B[i] and B[i+1]. This is a “loop-carried dependence” between iterations • Implies that iterations are dependent, and can’t be executed in parallel • Note the case for our prior example; each iteration was distinct Chap. 4 - Pipelining II 22 Instruction Level Parallelism Loop Level Parallelism When Safe to Unroll Loop? • Example: Where are data dependencies? (A,B,C,D distinct & non-overlapping) for (i=1; i<=100; i=i+1) { A[i+1] = A[i] + B[i]; /* S1 */ B[i+1] = C[i] + D[i]; /* S2 */ } 1. 2. No dependence from S1 to S2. If there were, then there would be a cycle in the dependencies and the loop would not be parallel. Since this other dependence is absent, interchanging the two statements will not affect the execution of S2. On the first iteration of the loop, statement S1 depends on the value of B[1] computed prior to initiating the loop. Chap. 4 - Pipelining II 23 Instruction Level Parallelism Loop Level Parallelism Now Safe to Unroll Loop? (p. 240) OLD: NEW: for (i=1; i<=100; i=i+1) { A[i+1] = A[i] + B[i]; /* S1 */ B[i+1] = C[i] + D[i];} /* S2 */ A[1] = A[1] + B[1]; for (i=1; i<=99; i=i+1) { B[i+1] = C[i] + D[i]; A[i+1] = + A[i+1] + B[i+1]; } B[101] = C[100] + D[100]; Chap. 4 - Pipelining II No circular dependencies. Loop caused dependence on B. Have eliminated loop dependence. 24 Dynamic Scheduling 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism Dynamic Scheduling is when the hardware rearranges the order of instruction execution to reduce stalls. Advantages: • Dependencies unknown at compile time can be handled by the hardware. • Code compiled for one type of pipeline can be efficiently run on another. Disadvantages: • Hardware much more complex. 4.7 Studies of ILP Chap. 4 - Pipelining II 25 Dynamic Scheduling The idea: HW Schemes: Instruction Parallelism • • • Why in HW at run time? – Works when can’t know real dependence at compile time – Compiler simpler – Code for one machine runs well on another Key Idea: Allow instructions behind stall to proceed. Key Idea: Instructions executing in parallel. There are multiple execution units, so use them. DIVD ADDD SUBD F0,F2,F4 F10,F0,F8 F12,F8,F14 – Enables out-of-order execution => out-of-order completion Chap. 4 - Pipelining II 26 Dynamic Scheduling The idea: HW Schemes: Instruction Parallelism • Out-of-order execution divides ID stage: 1. Issue—decode instructions, check for structural hazards 2. Read operands—wait until no data hazards, then read operands • • • • • • Scoreboards allow instruction to execute whenever 1 & 2 hold, not waiting for prior instructions. A scoreboard is a “data structure” that provides the information necessary for all pieces of the processor to work together. We will use In order issue, out of order execution, out of order commit ( also called completion) First used in CDC6600. Our example modified here for DLX. CDC had 4 FP units, 5 memory reference units, 7 integer units. DLX has 2 FP multiply, 1 FP adder, 1 FP divider, 1 integer. Chap. 4 - Pipelining II 27 Dynamic Scheduling Using A Scoreboard Scoreboard Implications • • • • • • Out-of-order completion => WAR, WAW hazards? Solutions for WAR – Queue both the operation and copies of its operands – Read registers only during Read Operands stage For WAW, must detect hazard: stall until other completes Need to have multiple instructions in execution phase => multiple execution units or pipelined execution units Scoreboard keeps track of dependencies, state or operations Scoreboard replaces ID, EX, WB with 4 stages Chap. 4 - Pipelining II 28 Dynamic Scheduling Using A Scoreboard Four Stages of Scoreboard Control 1. Issue —decode instructions & check for structural hazards (ID1) If a functional unit for the instruction is free and no other active instruction has the same destination register (WAW), the scoreboard issues the instruction to the functional unit and updates its internal data structure. If a structural or WAW hazard exists, then the instruction issue stalls, and no further instructions will issue until these hazards are cleared. Chap. 4 - Pipelining II 29 Dynamic Scheduling Using A Scoreboard Four Stages of Scoreboard Control 2. Read operands —wait until no data hazards, then read operands (ID2) A source operand is available if no earlier issued active instruction is going to write it, or if the register containing the operand is being written by a currently active functional unit. When the source operands are available, the scoreboard tells the functional unit to proceed to read the operands from the registers and begin execution. The scoreboard resolves RAW hazards dynamically in this step, and instructions may be sent into execution out of order. Chap. 4 - Pipelining II 30 Dynamic Scheduling Using A Scoreboard Four Stages of Scoreboard Control 3. Execution —operate on operands (EX) The functional unit begins execution upon receiving operands. When the result is ready, it notifies the scoreboard that it has completed execution. 4. Write result —finish execution (WB) Once the scoreboard is aware that the functional unit has completed execution, the scoreboard checks for WAR hazards. If none, it writes results. If WAR, then it stalls the instruction. Example: DIVD F0,F2,F4 ADDD F10,F0,F8 SUBD F8,F8,F14 Scoreboard would stall SUBD until ADDD reads operands Chap. 4 - Pipelining II 31 Using A Scoreboard Dynamic Scheduling Three Parts of the Scoreboard 1. Instruction status—which of 4 steps the instruction is in 2. Functional unit status—Indicates the state of the functional unit (FU). 9 fields for each functional unit Busy—Indicates whether the unit is busy or not Op—Operation to perform in the unit (e.g., + or –) Fi—Destination register Fj, Fk—Source-register numbers Qj, Qk—Functional units producing source registers Fj, Fk Rj, Rk—Flags indicating when Fj, Fk are ready 3. Register result status—Indicates which functional unit will write each register, if one exists. Blank when no pending instructions will write that register Chap. 4 - Pipelining II 32 Dynamic Scheduling Using A Scoreboard Detailed Scoreboard Pipeline Control Instruction status Wait until Bookkeeping Issue Not busy (FU) and not result(D) Busy(FU) yes; Op(FU) op; Fi(FU) `D’; Fj(FU) `S1’; Fk(FU) `S2’; Qj Result(‘S1’); Qk Result(`S2’); Rj not Qj; Rk not Qk; Result(‘D’) FU; Read operands Rj and Rk Rj No; Rk No Execution complete Functional unit done f((Fj( f )≠Fi(FU) or Rj( f )=No) & Write result (Fk( f ) ≠Fi(FU) or Rk( f )=No)) f(if Qj(f)=FU then Rj(f) Yes); f(if Qk(f)=FU then Rj(f) Yes); Result(Fi(FU)) 0; Busy(FU) No Chap. 4 - Pipelining II 33 Dynamic Scheduling Using A Scoreboard Scoreboard Example This is the sample code we’ll be working with in the example: LD LD MULT SUBD DIVD ADDD F6, 34(R2) F2, 45(R3) F0, F2, F4 F8, F6, F2 F10, F0, F6 F6, F8, F2 What are the hazards in this code? Chap. 4 - Pipelining II Latencies (clock cycles): LD 1 MULT 10 SUBD 2 DIVD 40 ADDD 2 34 Using A Scoreboard Dynamic Scheduling Scoreboard Example Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Clock Issue Read Execution Write operandscompleteResult Busy No No No No No Op dest Fi F0 F2 F4 S1 Fj S2 Fk FU for j FU for k Fj? Qj Qk Rj Fk? Rk F6 F8 F10 F30 F12 ... FU Chap. 4 - Pipelining II 35 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 1 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Clock 1 FU Issue 1 Read Execution W rite operandscompleteResult Issue LD #1 Shows in which cycle the operation occurred. Busy Yes No No No No Op Load dest Fi F6 F0 F2 F4 S1 Fj S2 Fk R2 FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 F12 ... Fk? Rk Yes F30 Integer Chap. 4 - Pipelining II 36 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 2 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 Clock F0 2 FU Busy Op Yes Load No No No No F2 S2 Fk R2 LD #2 can’t issue since integer unit is busy. MULT can’t issue because we require in-order issue. dest Fi F6 S1 Fj FU for j FU for k Fj? Qj Qk Rj F4 F6 F8 F10 F12 ... Fk? Rk Yes F30 Integer Chap. 4 - Pipelining II 37 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 3 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 Clock F0 3 FU Busy Op Yes Load No No No No F2 dest Fi F6 S1 Fj S2 Fk R2 FU for j FU for k Fj? Qj Qk Rj F4 F6 F8 F10 F12 ... Fk? Rk Yes F30 Integer Chap. 4 - Pipelining II 38 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 4 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 Clock F0 4 FU Busy Op Yes Load No No No No F2 dest Fi F6 S1 Fj S2 Fk R2 FU for j FU for k Fj? Qj Qk Rj F4 F6 F8 F10 F12 ... Fk? Rk Yes F30 Integer Chap. 4 - Pipelining II 39 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 5 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 Clock F0 5 FU Busy Op Yes Load No No No No F2 S2 Fk R3 Issue LD #2 since integer unit is now free. dest Fi F2 S1 Fj FU for j FU for k Fj? Qj Qk Rj F4 F6 F8 F10 F12 ... Fk? Rk Yes F30 Integer Chap. 4 - Pipelining II 40 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 6 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 6 Clock F0 6 FU Busy Op Yes Load Yes Mult No No No F2 Issue MULT. dest Fi F2 F0 S1 Fj F4 F6 F8 F10 F2 S2 Fk R3 F4 FU for j FU for k Fj? Qj Qk Rj Integer F12 No Fk? Rk Yes Yes ... F30 Mult1 Integer Chap. 4 - Pipelining II 41 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 7 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 6 7 Busy Yes Yes No Yes No Clock F0 7 FU MULT can’t read its operands (F2) because LD #2 hasn’t finished. Op Load Mult dest Fi F2 F0 S1 Fj F2 S2 Fk R3 F4 Sub F8 F6 F2 F2 F4 F6 F8 F10 Mult1 Integer FU for j FU for k Fj? Qj Qk Rj Integer No Fk? Rk Yes Yes Integer Yes No F12 F30 ... Add Chap. 4 - Pipelining II 42 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 8a Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 6 7 8 Busy Yes Yes No Yes Yes Clock F0 8 FU DIVD issues. MULT and SUBD both waiting for F2. Op Load Mult dest Fi F2 F0 S1 Fj F2 S2 Fk R3 F4 Sub Div F8 F10 F6 F0 F2 F6 F2 F4 F6 F8 F10 Mult1 Integer FU for j FU for k Fj? Qj Qk Rj Integer Mult1 No Fk? Rk Yes Yes Integer Yes No No Yes F12 F30 ... Add Divide Chap. 4 - Pipelining II 43 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 8b Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 7 8 Busy No Yes No Yes Yes Clock F0 8 FU Mult1 LD #2 writes F2. Op dest Fi S1 Fj S2 Fk FU for j FU for k Fj? Qj Qk Rj Mult F0 F2 F4 Yes Yes Sub Div F8 F10 F6 F0 F2 F6 Yes No Yes Yes F2 F4 F6 F8 F10 ... F30 Mult1 F12 Fk? Rk Add Divide Chap. 4 - Pipelining II 44 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 9 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 10 Mult1 Mult2 2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 8 Busy No Yes No Yes Yes Clock F0 9 FU Mult1 Now MULT and SUBD can both read F2. How can both instructions do this at the same time?? Op dest Fi S1 Fj S2 Fk FU for j FU for k Fj? Qj Qk Rj Mult F0 F2 F4 Yes Yes Sub Div F8 F10 F6 F0 F2 F6 Yes No Yes Yes F2 F4 F6 F8 F10 ... F30 Mult1 F12 Fk? Rk Add Divide Chap. 4 - Pipelining II 45 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 11 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 8 Mult1 Mult2 0 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 8 Busy No Yes No Yes Yes Clock F0 11 FU Mult1 ADDD can’t start because add unit is busy. Op dest Fi S1 Fj S2 Fk FU for j FU for k Fj? Qj Qk Rj Mult F0 F2 F4 Yes Yes Sub Div F8 F10 F6 F0 F2 F6 Yes No Yes Yes F2 F4 F6 F8 F10 ... F30 Mult1 F12 Fk? Rk Add Divide Chap. 4 - Pipelining II 46 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 12 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 7 Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 Clock F0 12 FU Busy Op No Yes Mult No No Yes Div F2 SUBD finishes. DIVD waiting for F0. dest Fi S1 Fj S2 Fk F0 F2 F4 F10 F0 F6 F4 F6 F8 F10 Mult1 FU for j FU for k Fj? Qj Qk Rj Mult1 F12 Fk? Rk Yes Yes No Yes ... F30 Divide Chap. 4 - Pipelining II 47 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 13 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 6 Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 13 FU Mult1 F2 F4 ADDD issues. FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 48 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 14 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 5 Mult1 Mult2 2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 14 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 14 FU Mult1 F2 F4 FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 49 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 15 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 4 Mult1 Mult2 1 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 14 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 15 FU Mult1 F2 F4 FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 50 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 16 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 3 Mult1 Mult2 0 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 16 FU Mult1 F2 F4 FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 51 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 17 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 2 Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 17 FU Mult1 F2 F4 ADDD can’t write because of DIVD. RAW! FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 52 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 18 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 1 Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 7 9 11 12 8 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 18 FU Mult1 F2 F4 Nothing Happens!! FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 53 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 19 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer 0 Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 7 9 11 12 8 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No Yes Mult F0 F2 F4 No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 19 FU Mult1 F2 F4 MULT completes execution. FU for j FU for k Fj? Qj Qk Rj Mult1 F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes No Yes Yes ... F30 Divide 54 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 20 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 20 7 9 11 12 8 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No No No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 20 FU F2 F4 MULT writes. FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes Yes ... F30 Divide 55 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 21 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 20 7 9 11 12 8 21 13 14 16 dest S1 S2 Busy Op Fi Fj Fk No No No Yes Add F6 F8 F2 Yes Div F10 F0 F6 Clock F0 21 FU F2 F4 DIVD loads operands FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 Add Chap. 4 - Pipelining II F12 Fk? Rk Yes Yes Yes Yes ... F30 Divide 56 Dynamic Scheduling Using A Scoreboard Scoreboard Example Cycle 22 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add 40 Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 20 7 9 11 12 8 21 13 14 16 22 dest S1 S2 Busy Op Fi Fj Fk No No No No Yes Div F10 F0 F6 Clock F0 22 F2 F4 Now ADDD can write since WAR removed. FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 FU F12 Fk? Rk Yes Yes ... F30 Divide Chap. 4 - Pipelining II 57 Dynamic Scheduling Using A Scoreboard Scoreboard Example Cycle 61 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add 0 Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 20 7 9 11 12 8 21 61 13 14 16 22 dest S1 S2 Busy Op Fi Fj Fk No No No No Yes Div F10 F0 F6 Clock F0 61 F2 F4 DIVD completes execution FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 FU F12 Fk? Rk Yes Yes ... F30 Divide Chap. 4 - Pipelining II 58 Using A Scoreboard Dynamic Scheduling Scoreboard Example Cycle 62 Instruction status Instruction j k LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Functional unit status Time Name Integer Mult1 Mult2 Add 0 Divide Register result status Read Execution W rite Issue operandscompleteResult 1 2 3 4 5 6 7 8 6 9 19 20 7 9 11 12 8 21 61 62 13 14 16 22 dest S1 S2 Busy Op Fi Fj Fk No No No No No Clock F0 62 F2 F4 DONE!! FU for j FU for k Fj? Qj Qk Rj F6 F8 F10 F12 ... Fk? Rk F30 FU Chap. 4 - Pipelining II 59 Dynamic Scheduling Using A Scoreboard Another Dynamic Algorithm: Tomasulo Algorithm • • • For IBM 360/91 about 3 years after CDC 6600 (1966) Goal: High Performance without special compilers Differences between IBM 360 & CDC 6600 ISA – IBM has only 2 register specifiers / instruction vs. 3 in CDC 6600 – IBM has 4 FP registers vs. 8 in CDC 6600 • Why Study? lead to Alpha 21264, HP 8000, MIPS 10000, Pentium II, PowerPC 604, … Chap. 4 - Pipelining II 60 Dynamic Scheduling Using A Scoreboard Tomasulo Algorithm vs. Scoreboard • Control & buffers distributed with Function Units (FU) vs. centralized in scoreboard; – FU buffers called “reservation stations”; have pending operands • Registers in instructions replaced by values or pointers to reservation stations(RS); called register renaming ; – avoids WAR, WAW hazards – More reservation stations than registers, so can do optimizations compilers can’t • Results to FU from RS, not through registers, over Common Data Bus that broadcasts results to all FUs • Load and Stores treated as FUs with RSs as well • Integer instructions can go past branches, allowing FP ops beyond basic block in FP queue Chap. 4 - Pipelining II 61 Dynamic Scheduling Using A Scoreboard Tomasulo Organization Load Buffer FP Op Queue FP Registers Store Buffer Common Data Bus FP Add Res. Station FP Mul Res. Station Chap. 4 - Pipelining II 62 Dynamic Scheduling Using A Scoreboard Reservation Station Components Op—Operation to perform in the unit (e.g., + or –) Vj, Vk—Value of Source operands – Store buffers have V field, result to be stored Qj, Qk—Reservation stations producing source registers (value to be written) – Note: No ready flags as in Scoreboard; Qj,Qk=0 => ready – Store buffers only have Qi for RS producing result Busy—Indicates reservation station or FU is busy Register result status—Indicates which functional unit will write each register, if one exists. Blank when no pending instructions that will write that register. Chap. 4 - Pipelining II 63 Dynamic Scheduling Using A Scoreboard Three Stages of Tomasulo Algorithm 1. Issue—get instruction from FP Op Queue If reservation station free (no structural hazard), control issues instruction & sends operands (renames registers). 2. Execution—operate on operands (EX) When both operands ready then execute; if not ready, watch Common Data Bus for result 3. Write result—finish execution (WB) Write on Common Data Bus to all awaiting units; mark reservation station available • Normal data bus: data + destination (“go to” bus) • Common data bus: data + source (“come from” bus) – 64 bits of data + 4 bits of Functional Unit source address – Write if matches expected Functional Unit (produces result) – Does the broadcast Chap. 4 - Pipelining II 64 Using A Scoreboard Dynamic Scheduling Tomasulo Example Cycle 0 Instruction status Instruction j k Issue LD F6 34+ R2 LD F2 45+ R3 MULTDF0 F2 F4 SUBD F8 F6 F2 DIVD F10 F0 F6 ADDD F6 F8 F2 Reservation Stations Time Name Busy Op 0 Add1 No 0 Add2 No 0 Add3 No 0 Mult1 No 0 Mult2 No Register result status Execution complete S1 Vj S2 Vk RS for j Qj RS for k Qk Clock F2 F4 F6 F8 0 F0 Write Result Load1 Load2 Load3 Busy No No No Address F10 F12 ... F30 FU Chap. 4 - Pipelining II 65 Dynamic Scheduling Using A Scoreboard Review: Tomasulo • • • • • Prevents Register as bottleneck Avoids WAR, WAW hazards of Scoreboard Allows loop unrolling in HW Not limited to basic blocks (provided branch prediction) Lasting Contributions – Dynamic scheduling – Register renaming – Load/store disambiguation • 360/91 descendants are PowerPC 604, 620; MIPS R10000; HP-PA 8000; Intel Pentium Pro Chap. 4 - Pipelining II 66 Dynamic Hardware Prediction 4.1 Instruction Level Parallelism: Concepts and Challenges Dynamic Branch Prediction is the ability of the hardware to make an educated guess about which way a branch will go - will the branch be taken or not. 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP The hardware can look for clues based on the instructions, or it can use past history - we will discuss both of these directions. 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP Chap. 4 - Pipelining II 67 Dynamic Hardware Prediction Basic Branch Prediction: Branch Prediction Buffers Dynamic Branch Prediction • Performance = ƒ(accuracy, cost of misprediction) • Branch History Lower bits of PC address index table of 1-bit values – Says whether or not branch taken last time • Problem: in a loop, 1-bit BHT will cause two mis-predictions: – End of loop case, when it exits instead of looping as before – First time through loop on next time through code, when it predicts exit instead of looping Address 31 0 1 Bits 13 - 2 1023 Chap. 4 - Pipelining II P r e d i c t i o n 68 Dynamic Hardware Prediction Basic Branch Prediction: Branch Prediction Buffers Dynamic Branch Prediction • Solution: 2-bit scheme where change prediction only if get misprediction twice: (Figure 4.13, p. 264) T NT Predict Taken Predict Taken T Predict Not Taken T NT NT Predict Not Taken T NT Chap. 4 - Pipelining II 69 Dynamic Hardware Prediction Basic Branch Prediction: Branch Prediction Buffers BHT Accuracy • Mispredict because either: – Wrong guess for that branch – Got branch history of wrong branch when index the table • 4096 entry table programs vary from 1% misprediction (nasa7, tomcatv) to 18% (eqntott), with spice at 9% and gcc at 12% • 4096 about as good as infinite table, but 4096 is a lot of HW Chap. 4 - Pipelining II 70 Dynamic Hardware Prediction Basic Branch Prediction: Branch Prediction Buffers Correlating Branches Idea: taken/not taken of recently executed branches is related to behavior of next branch (as well as the history of that branch behavior) Branch address 2-bits per branch predictors – Then behavior of recent branches selects between, say, four predictions of next branch, updating just that prediction Prediction 2-bit global branch history Chap. 4 - Pipelining II 71 Basic Branch Prediction: Branch Prediction Buffers Dynamic Hardware Prediction Frequency of Mispredictions Accuracy of Different Schemes 18% (Figure 4.21, p. 272) 4096 Entries 2-bits per entry Unlimited Entries 2-bits per entry 1024 Entries - 2 bits of history, 2 bits per entry 18% 16% 12% 11% 10% 8% 6% 6% 6% 6% 5% 5% 4% 4% 2% 1% 0% 1% 0% 4,096 entries: 2-bits per entry Chap. 4 - Pipelining II 1,024 entries (2,2) Unlimited entries: 2-bits/entry li eqntott espresso gcc fpppp spice doducd tomcatv matrix300 0% nasa7 Frequency of Mispredictions 14% 72 Dynamic Hardware Prediction • Basic Branch Prediction: Branch Target Buffers Branch Target Buffer Branch Target Buffer (BTB): Use address of branch as index to get prediction AND branch address (if taken) – Note: must check for branch match now, since can’t use wrong branch address (Figure 4.22, p. 273) Predicted PC • Branch Prediction: Taken or not Taken Return instruction addresses predicted with stack Chap. 4 - Pipelining II 73 Dynamic Hardware Prediction Example Instructions in Buffer Yes Yes No Basic Branch Prediction: Branch Target Buffers Prediction Taken Taken Actual Branch Taken Not taken Taken Penalty Cycles 0 2 2 Example on page 274. Determine the total branch penalty for a BTB using the above penalties. Assume also the following: • Prediction accuracy of 80% • Hit rate in the buffer of 90% • 60% taken branch frequency. Branch Penalty = Percent buffer hit rate X Percent incorrect predictions X 2 + ( 1 - percent buffer hit rate) X Taken branches X 2 Branch Penalty = ( 90% X 10% X 2) + (10% X 60% X 2) Branch Penalty = 0.18 + 0.12 = 0.30 clock cycles Chap. 4 - Pipelining II 74 Multiple Issue Multiple Issue is the ability of the processor to start more than one instruction in a given cycle. 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling Flavor I: 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP Superscalar processors issue varying number of instructions per clock - can be either statically scheduled (by the compiler) or dynamically scheduled (by the hardware). Superscalar has a varying number of instructions/cycle (1 to 8), scheduled by compiler or by HW (Tomasulo). IBM PowerPC, Sun UltraSparc, DEC Alpha, HP 8000 Chap. 4 - Pipelining II 75 Multiple Issue Issuing Multiple Instructions/Cycle Flavor II: VLIW - Very Long Instruction Word - issues a fixed number of instructions formatted either as one very large instruction or as a fixed packet of smaller instructions. fixed number of instructions (4-16) scheduled by the compiler; put operators into wide templates – Joint HP/Intel agreement in 1999/2000 – Intel Architecture-64 (IA-64) 64-bit address – Style: “Explicitly Parallel Instruction Computer (EPIC)” Chap. 4 - Pipelining II 76 Multiple Issue Issuing Multiple Instructions/Cycle Flavor II - continued: • • • • • • 3 Instructions in 128 bit “groups”; field determines if instructions dependent or independent – Smaller code size than old VLIW, larger than x86/RISC – Groups can be linked to show independence > 3 instr 64 integer registers + 64 floating point registers – Not separate files per functional unit as in old VLIW Hardware checks dependencies (interlocks => binary compatibility over time) Predicated execution (select 1 out of 64 1-bit flags) => 40% fewer mis-predictions? IA-64 : name of instruction set architecture; EPIC is type Merced is name of first implementation (1999/2000?) Chap. 4 - Pipelining II 77 Multiple Issue A SuperScalar Version of DLX Issuing Multiple Instructions/Cycle – Fetch 64-bits/clock cycle; Int on left, FP on right – Can only issue 2nd instruction if 1st instruction issues – More ports for FP registers to do FP load & FP op in a pair In our DLX example, we can handle 2 instructions/cycle: • Floating Point • Anything Else Type Pipe Stages Int. instruction IF ID EX MEM WB FP instruction IF ID EX MEM WB Int. instruction IF ID EX MEM WB FP instruction IF ID EX MEM WB Int. instruction IF ID EX MEM WB FP instruction IF ID EX MEM WB • 1 cycle load delay causes delay to 3 instructions in Superscalar – instruction in right half can’t use it, nor instructions in next slot Chap. 4 - Pipelining II 78 Multiple Issue A SuperScalar Version of DLX Unrolled Loop Minimizes Stalls for Scalar 1 Loop: 2 3 4 5 6 7 8 9 10 11 12 13 14 LD LD LD LD ADDD ADDD ADDD ADDD SD SD SD SUBI BNEZ SD F0,0(R1) F6,-8(R1) F10,-16(R1) F14,-24(R1) F4,F0,F2 F8,F6,F2 F12,F10,F2 F16,F14,F2 0(R1),F4 -8(R1),F8 -16(R1),F12 R1,R1,#32 R1,LOOP 8(R1),F16 Latencies: LD to ADDD: 1 Cycle ADDD to SD: 2 Cycles ; 8-32 = -24 14 clock cycles, or 3.5 per iteration Chap. 4 - Pipelining II 79 Multiple Issue A SuperScalar Version of DLX Loop Unrolling in Superscalar Integer instruction FP instruction Loop: LD F0,0(R1) LD F6,-8(R1) LD F10,-16(R1) ADDD F4,F0,F2 LD F14,-24(R1) ADDD F8,F6,F2 LD F18,-32(R1) ADDD F12,F10,F2 SD 0(R1),F4 ADDD F16,F14,F2 SD -8(R1),F8 ADDD F20,F18,F2 SD -16(R1),F12 SD -24(R1),F16 SUBI R1,R1,#40 BNEZ R1,LOOP SD 8(R1),F20 • Unrolled 5 times to avoid delays (+1 due to SS) • 12 clocks, or 2.4 clocks per iteration Chap. 4 - Pipelining II Clock cycle 1 2 3 4 5 6 7 8 9 10 11 12 80 Multiple Issue Multiple Instruction Issue & Dynamic Scheduling Dynamic Scheduling in Superscalar Code compiler for scalar version will run poorly on Superscalar May want code to vary depending on how Superscalar Simple approach: separate Tomasulo Control for separate reservation stations for Integer FU/Reg and for FP FU/Reg Chap. 4 - Pipelining II 81 Multiple Issue Multiple Instruction Issue & Dynamic Scheduling Dynamic Scheduling in Superscalar • How to do instruction issue with two instructions and keep in-order instruction issue for Tomasulo? – Issue 2X Clock Rate, so that issue remains in order – Only FP loads might cause dependency between integer and FP issue: • Replace load reservation station with a load queue; operands must be read in the order they are fetched • Load checks addresses in Store Queue to avoid RAW violation • Store checks addresses in Load Queue to avoid WAR,WAW Chap. 4 - Pipelining II 82 Multiple Issue Multiple Instruction Issue & Dynamic Scheduling Performance of Dynamic Superscalar Iteration Instructions Issues Executes Writes result no. clock-cycle number 1 LD F0,0(R1) 1 2 4 1 ADDD F4,F0,F2 1 5 8 1 SD 0(R1),F4 2 9 1 SUBI R1,R1,#8 3 4 5 1 BNEZ R1,LOOP 4 5 2 LD F0,0(R1) 5 6 8 2 ADDD F4,F0,F2 5 9 12 2 SD 0(R1),F4 6 13 2 SUBI R1,R1,#8 7 8 9 2 BNEZ R1,LOOP 8 9 4 clocks per iteration Branches, Decrements still take 1 clock cycle Chap. 4 - Pipelining II 83 VLIW Multiple Issue Loop Unrolling in VLIW Memory reference 1 LD F0,0(R1) LD F10,-16(R1) LD F18,-32(R1) LD F26,-48(R1) Memory FP reference 2 operation 1 LD F6,-8(R1) LD F14,-24(R1) LD F22,-40(R1) ADDD F4,F0,F2 ADDD F12,F10,F2 ADDD F20,F18,F2 SD 0(R1),F4 SD -8(R1),F8 ADDD F28,F26,F2 SD -16(R1),F12 SD -24(R1),F16 SD -32(R1),F20 SD -40(R1),F24 SD -0(R1),F28 FP op. 2 Int. op/ branch Clock ADDD F8,F6,F2 ADDD F16,F14,F2 ADDD F24,F22,F2 SUBI R1,R1,#48 BNEZ R1,LOOP • Unrolled 7 times to avoid delays • 7 results in 9 clocks, or 1.3 clocks per iteration • Need more registers to effectively use VLIW Chap. 4 - Pipelining II 84 1 2 3 4 5 6 7 8 9 Multiple Issue Limitations With Multiple Issue Limits to Multi-Issue Machines • Inherent limitations of ILP – 1 branch in 5 instructions => how to keep a 5-way VLIW busy? – Latencies of units => many operations must be scheduled – Need about Pipeline Depth x No. Functional Units of independent operations to keep machines busy. • Difficulties in building HW – Duplicate Functional Units to get parallel execution – Increase ports to Register File (VLIW example needs 6 read and 3 write for Int. Reg. & 6 read and 4 write for Reg.) – Increase ports to memory – Decoding SS and impact on clock rate, pipeline depth Chap. 4 - Pipelining II 85 Multiple Issue Limitations With Multiple Issue Limits to Multi-Issue Machines • Limitations specific to either SS or VLIW implementation – Decode issue in SS – VLIW code size: unroll loops + wasted fields in VLIW – VLIW lock step => 1 hazard & all instructions stall – VLIW & binary compatibility Chap. 4 - Pipelining II 86 Multiple Issue Limitations With Multiple Issue Multiple Issue Challenges • While Integer/FP split is simple for the HW, get CPI of 0.5 only for programs with: – Exactly 50% FP operations – No hazards • If more instructions issue at same time, greater difficulty of decode and issue – Even 2-scalar => examine 2 opcodes, 6 register specifiers, & decide if 1 or 2 instructions can issue • VLIW: tradeoff instruction space for simple decoding – The long instruction word has room for many operations – By definition, all the operations the compiler puts in the long instruction word are independent => execute in parallel – E.g., 2 integer operations, 2 FP ops, 2 Memory refs, 1 branch • 16 to 24 bits per field => 7*16 or 112 bits to 7*24 or 168 bits wide – Need compiling technique that schedules across several branches Chap. 4 - Pipelining II 87 Compiler Support For ILP 4.1 Instruction Level Parallelism: Concepts and Challenges How can compilers be smart? 1. Produce good scheduling of code. 2. Determine which loops might contain parallelism. 3. Eliminate name dependencies. 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP Compilers must be REALLY smart to figure out aliases -- pointers in C are a real problem. Techniques lead to: Symbolic Loop Unrolling Critical Path Scheduling Chap. 4 - Pipelining II 88 Compiler Support For ILP Symbolic Loop Unrolling Software Pipelining • Observation: if iterations from loops are independent, then can get ILP by taking instructions from different iterations • Software pipelining: reorganizes loops so that each iteration is made from instructions chosen from different iterations of the original loop (Tomasulo in SW) Iteration 0 Iteration Iteration 1 2 Iteration 3 Iteration 4 Softwarepipelined iteration Chap. 4 - Pipelining II 89 Compiler Support For ILP Symbolic Loop Unrolling SW Pipelining Example After: Software Pipelined Before: Unrolled 3 times 1 LD F0,0(R1) 2 ADDD F4,F0,F2 3 SD 0(R1),F4 4 LD F6,-8(R1) 5 ADDD F8,F6,F2 6 SD -8(R1),F8 7 LD F10,-16(R1) 8 ADDD F12,F10,F2 9 SD -16(R1),F12 10 SUBI R1,R1,#24 11 BNEZ R1,LOOP SD IF ADDD LD 1 2 3 4 5 Read F4 ID IF EX ID IF LD ADDD LD SD ADDD LD SUBI BNEZ SD ADDD SD Read F0 Mem EX ID F0,0(R1) F4,F0,F2 F0,-8(R1) 0(R1),F4; Stores M[i] F4,F0,F2; Adds to M[i-1] F0,-16(R1); loads M[i-2] R1,R1,#8 R1,LOOP 0(R1),F4 F4,F0,F2 -8(R1),F4 WB Write F4 Mem WB EX Mem WB Chap. 4 - Pipelining II Write F0 90 Compiler Support For ILP Symbolic Loop Unrolling SW Pipelining Example Symbolic Loop Unrolling – Less code space – Overhead paid only once vs. each iteration in loop unrolling Software Pipelining Loop Unrolling 100 iterations = 25 loops with 4 unrolled iterations each Chap. 4 - Pipelining II 91 Compiler Support For ILP Critical Path Scheduling Trace Scheduling • • • • Parallelism across IF branches vs. LOOP branches Two steps: – Trace Selection • Find likely sequence of basic blocks (trace) of (statically predicted or profile predicted) long sequence of straight-line code – Trace Compaction • Squeeze trace into few VLIW instructions • Need bookkeeping code in case prediction is wrong Compiler undoes bad guess (discards values in registers) Subtle compiler bugs mean wrong answer vs. poorer performance; no hardware interlocks Chap. 4 - Pipelining II 92 Hardware Support For Parallelism 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling Software support of ILP is best when code is predictable at compile time. But what if there’s no predictability? 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction Here we’ll talk about hardware techniques. These include: 4.4 Taking Advantage of More ILP with Multiple Issue • Conditional Instructions • Hardware Speculation 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism or Predicated 4.7 Studies of ILP Chap. 4 - Pipelining II 93 Hardware Support For Parallelism Nullified Instructions Tell the Hardware To Ignore An Instruction • Avoid branch prediction by turning branches into conditionally executed instructions: IF (x) then A = B op C else NOP – If false, then neither store result nor cause exception – Expanded ISA of Alpha, MIPs, PowerPC, SPARC, have conditional move. PA-RISC can annul any following instruction. – IA-64: 64 1-bit condition fields selected so conditional execution of any instruction • Drawbacks to conditional instructions: – Still takes a clock, even if “annulled” – Stalls if condition evaluated late – Complex conditions reduce effectiveness; condition becomes known late in pipeline. This can be a major win because there is no time lost by taking a branch!! Chap. 4 - Pipelining II x A= B op C 94 Hardware Support For Parallelism Nullified Instructions Tell the Hardware To Ignore An Instruction Suppose we have the code: if ( VarA == 0 ) VarS = VarT; Previous Method: LD R1, VarA BNEZ R1, Label LD R2, VarT SD VarS, R2 Label: Compare and Nullify Next Instr. If Not Zero Compare and Move IF Zero Nullified Method: LD R1, VarA LD R2, VarT CMPNNZ R1, #0 SD VarS, R2 Label: Nullified Method: LD R1, VarA LD R2, VarT CMOVZ VarS,R2, R1 Chap. 4 - Pipelining II 95 Hardware Support For Parallelism Compiler Speculation Increasing Parallelism The theory here is to move an instruction across a branch so as to increase the size of a basic block and thus to increase parallelism. Primary difficulty is in avoiding exceptions. For example if ( a ^= 0 ) c = b/a; may have divide by zero error in some cases. Methods for increasing speculation include: 1. Use a set of status bits (poison bits) associated with the registers. Are a signal that the instruction results are invalid until some later time. 2. Result of instruction isn’t written until it’s certain the instruction is no longer speculative. Chap. 4 - Pipelining II 96 Hardware Support For Parallelism Increasing Parallelism Example on Page 305. Code for if ( A == 0 ) A = B; else A = A + 4; Assume A is at 0(R3) and B is at 0(R4) Note here that only ONE side needs to take a branch!! Compiler Speculation Original Code: LW R1, 0(R3) BNEZ R1, L1 LW R1, 0(R2) J L2 L1: ADDI R1, R1, #4 L2: SW 0(R3), R1 Load A Test A If Clause Skip Else Else Clause Store A Speculated Code: LW R1, 0(R3) LW R14, 0(R2) BEQZ R1, L3 ADDI R14, R1, #4 L3: SW 0(R3), R14 Load A Spec Load B Other if Branch Else Clause Non-Spec Store Chap. 4 - Pipelining II 97 Hardware Support For Parallelism Compiler Speculation Poison Bits In the example on the last page, if the LW* produces an exception, a poison bit is set on that register. The if a later instruction tries to use the register, an exception is THEN raised. Speculated Code: LW R1, 0(R3) LW* R14, 0(R2) BEQZ R1, L3 ADDI R14, R1, #4 L3: SW 0(R3), R14 Chap. 4 - Pipelining II Load A Spec Load B Other if Branch Else Clause Non-Spec Store 98 Hardware Support For Parallelism Hardware Speculation HW support for More ILP • Need HW buffer for results of uncommitted instructions: reorder buffer – Reorder buffer can be operand FP source Op – Once operand commits, result is Queue found in register – 3 fields: instr. type, destination, value – Use reorder buffer number instead of reservation station Res Stations – Discard instructions on misFP Adder predicted branches or on exceptions Reorder Buffer FP Regs Res Stations FP Adder Figure 4.34, page 311 Chap. 4 - Pipelining II 99 Hardware Support For Parallelism Hardware Speculation HW support for More ILP How is this used in practice? Rather than predicting the direction of a branch, execute the instructions on both side!! We early on know the target of a branch, long before we know it if will be taken or not. So begin fetching/executing at that new Target PC. But also continue fetching/executing as if the branch NOT taken. Chap. 4 - Pipelining II 100 Studies of ILP • 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism • • Conflicting studies of amount of improvement available – Benchmarks (vectorized FP Fortran vs. integer C programs) – Hardware sophistication – Compiler sophistication How much ILP is available using existing mechanisms with increasing HW budgets? Do we need to invent new HW/SW mechanisms to keep on processor performance curve? 4.7 Studies of ILP Chap. 4 - Pipelining II 101 Studies of ILP Limits to ILP Initial HW Model here; MIPS compilers. Assumptions for ideal/perfect machine to start: 1. Register renaming–infinite virtual registers and all WAW & WAR hazards are avoided 2. Branch prediction–perfect; no mispredictions 3. Jump prediction–all jumps perfectly predicted => machine with perfect speculation & an unbounded buffer of instructions available 4. Memory-address alias analysis–addresses are known & a store can be moved before a load provided addresses not equal 1 cycle latency for all instructions; unlimited number of instructions issued per clock cycle Chap. 4 - Pipelining II 102 Studies of ILP Upper Limit to ILP: Ideal Machine This is the amount of parallelism when there are no branch mis-predictions and we’re limited only by data dependencies. (Figure 4.38, page 319) 160 150.1 FP: 75 - 150 Instruction Issues per cycle IPC 140 120 118.7 Integer: 18 - 60 100 75.2 80 62.6 60 54.8 40 17.9 20 0 gcc Instructions that could theoretically be issued per cycle. espresso li fpppp doducd tomcatv Programs Chap. 4 - Pipelining II 103 Studies of ILP Impact of Realistic Branch Prediction What parallelism do we get when we don’t allow perfect branch prediction, as in the last picture, but assume some realistic model? Possibilities include: 1. Perfect - all branches are perfectly predicted (the last slide) 2. Selective History Predictor - a complicated but do-able mechanism for selection. 3. Standard 2-bit history predictor with 512 2-bit entries. 4. Static prediction based on past history of the program. 5. None - Parallelism is limited to basic block. Chap. 4 - Pipelining II 104 Studies of ILP Bonus!! Selective History Predictor 8096 x 2 bits 1 0 11 Choose Non-correlator 10 01 Choose Correlator 00 Branch Addr 2 Global History Taken/Not Taken 00 01 10 11 8K x 2 bit Selector 11 Taken 10 2048 x 4 x 2 bits 01 Not Taken 00 Chap. 4 - Pipelining II 105 Impact of Realistic Branch Prediction Studies of ILP Figure 4.42, Page 325 Limiting the type of branch prediction. 61 60 58 60 FP: 15 - 45 48 50 46 45 46 45 45 Instruction issues per cycle IPC 41 40 35 Integer: 6 - 12 29 30 19 20 16 15 12 10 13 14 10 9 6 7 6 6 6 7 4 2 2 2 0 gcc espresso li fpppp doducd tomcatv Program Perfect Perfect Selective predictor Standard 2-bit Static Chap. 4 - Pipelining II Selective Hist BHT (512) Profile None 106 No prediction More Realistic HW: Register Impact Studies of ILP Effect of limiting the number of renaming registers. 60 Figure 4.44, Page 328 59 FP: 11 - 45 54 49 Instruction issues per cycle IPC 50 45 40 44 35 Integer: 5 - 15 30 29 28 20 20 15 15 11 10 10 10 16 13 12 12 12 11 10 9 5 5 4 11 6 4 15 5 5 5 4 7 5 5 0 gcc espresso li fpppp doducd tomcatv Program Infinite Infinite 64 Chap. 4128 - Pipelining II 256 256 128 64 32 32 None None 107 Studies of ILP More Realistic HW: Alias Impact What happens when there may be conflicts with memory aliasing? Figure 4.46, Page 330 49 50 FP: 4 - 45 (Fortran, no heap) 49 45 45 45 Instruction issues per cycle IPC 40 35 Integer: 4 - 9 30 25 20 16 16 15 15 12 10 10 5 9 7 7 4 5 5 4 3 3 4 6 4 3 5 0 gcc espresso li fpppp doducd tomcatv Program Global/Stack perf; Perfect Inspec. Perfect Global/stack Perfect Inspection Chap. 4 Pipelining II heap conflicts Assem. None None 108 4 Summary 4.1 Instruction Level Parallelism: Concepts and Challenges 4.2 Overcoming Data Hazards with Dynamic Scheduling 4.3 Reducing Branch Penalties with Dynamic Hardware Prediction 4.4 Taking Advantage of More ILP with Multiple Issue 4.5 Compiler Support for Exploiting ILP 4.6 Hardware Support for Extracting more Parallelism 4.7 Studies of ILP Chap. 4 - Pipelining II 109