Föreläsning 11 OR-datorn är för långsam! Alternativa arkitekturer kritik av OR-datorn RISC => pipelining LDA 13 (exempelvis) Hämta : 3CP 2 1 CP Absolut,1: 3 CP EXE: 4 CP Summa: 11 CP mem ADR XR SP DR TR 1 2 M mem AR Alltså 11 CPI (clocks per instructions) Vi siktar på 1 CPI! IN Vad bör göras? Parallellism Gör fler saker samtidigt Pipelining Gör fler saker samtidigt RISC(reduced instruction set computer) Förenkla instruktionerna så att pipelining kan införas => gör dem likadana Öka klockfrekvensen x y Leta rätt på längsta tidsfördröjningen mellan två register. alla den T. Då gäller f < 1/T Omplacering av register Ta bort onödiga register Förbättrat mem Nya LDA 13 Hämta 1 CP 2 1CP Absolut 1 CP Steg 1 data adress ADR XR 1 2 SP M AR EXE 1CP IN mem
Skilda program- och dataminnen Bredare programminne, så att hela instruktionen kan hämtas på 1 CP OP M byte Steg 2 Flera register! adress ADR pmem R0 R1 R2 R3 R0 R1 R2 R3 Nya LDA 13 Hämta 1 CP 2 1CP Absolut EXE 1 CP AR XR SP 1 2 M byte mem Eempelis: Exempelvis: ; R3 = R2R1 RISC = reduced instruction set computer Steg 3 1 Vi avskaffar XR,SP och inför generella register Vi avskaffar a-moderna ADD Rx,Ry,Rz inga andra a-moder! LD Rx,(Ry) enda sättet att läsa i minnet! ST (Rx),Ry enda sättet att skriva i minnet! Vi avskaffar M och mikroprogrammering Alla snuttar tar 1 CP ADD Rx,Ry,Rz LD Rx,(Ry) ST (Ry),Rx JMP N ADDI Rx,Ry, pmem byte Instruction decoder Hämta 1CP Exe 1CP Förhämtning! 1 CPI, clock per instruction R0 R1 R2 R3
lassisk 5-stegs pipeline pmem 4 Inspirerad av OpenRISC Annat exempel: ARM (mobiltelefon) 5 steg IF: instruction fetch RR: register read EXE: execute MEM: read/write WB: write back register Några instruktioner 6 5 5 5 ADD Rd, Ra, Rb ; Rd=RaRb OP d a b - 16 ADD Rd, Ra, ; Rd=Ra OP d a 16 MOVHI Rd, ; RdH=,RdL=0 OP d - 16 LD Rd, (Ra) ; Rd=(Ra) OP d a 11 ST (Ra), Rb ; (Ra)=Rb OP a b SFEQ Ra, Rb ; F = (A==B)?1:0 OP - a b - 26 JMP ; = OP BF ; = F? : 4 OP 4:LD R6,(R5) 0 pmem 4 4:LD R6,(R5) 4 pmem 4 Några snälla instruk- tioner
4:LD R6,(R5) 8 pmem 4 4:LD R6,(R5) C pmem 4 LD R6,(R5) SFEQ R7,R8 R1 R2 LD R6,(R5) R5 R1R2 4:LD R6,(R5) 10 pmem 4 4:LD R6,(R5) 14 pmem 4 XXX YYY R3 SFEQ R7,R8 XXX LD R6,(R5) R5 SFEQ R7,R8 F R1R2 LD R6,(R5) DM(R5)
Problem Hårdvarukonflikter, redan fixat i vår maskin Två minnen, pmem och Separat adderare för adresser Fördröjda hopp Instruktionen efter hoppet exekveras alltid Databeroenden Registren läses i steg 2 men skrivs i steg 5 Pipelinen måste i vissa lägen stängas av stall 0:SFEQ 4:BF 8:XXX C:YYY... 20:ZZZ Fördröjt hopp med branch penalty 8 pmem 4 BF SFEQ 4 0:ADD R5,R2,R1 4:ADD R6,R5,R5 pmem 4 Databeroende Registerfilen kan innehålla gamla data! Var kan nya resultat finnas?,, Databeroende ADD R6,R5,R5 5 5 ADD R5,R2,R1 3 Hur ska muxarna styras? if.op == instruktion som läser reg. if.op == instruktion som skriver reg. if.a ==.d muxarn = ; else /
0:LD R3,(R2) 4:ADD R4,R3,R3 pmem 4 Det finns mer! Pipeline stall ADD R4,R3,R3 LD R3,(R2) R3 R3 ADD R4,R3,R3 LD R3,(R2) Vi låter LD fortsätta -> -> -> -> När ska vi stalla? an man göra något åt hoppen? BPT: Branch Prediction Table Utformat som associativt minne Dyrt en komparator per rad Strongly not taken Not taken Taken Strongly taken BPT pmem 4 BPT Hoppets adress Hoppadress Hoppstatistik Hoppets adress Hoppadress Hoppstatistik Hoppets adress Hoppadress Hoppstatistik Skiss: Varje gång ett hopp påträffas 1) Finns inte i BPT: stoppa in det och uppdatera hoppstatistiken 2) Finns i BPT: läs ut hoppadressen