Hoofdstuk 4: the processor Flashcards
ALU control (including ALU control bits)
De ALU is een Arithmetic Logical Unit. Het wordt gebruikt voor verschillende bewerkingen zoals add, substract, less then, OR, AND en NOR. Hiervoor bestaat er een implementatie schema voor de ALU om te bepalen welke bewerking hij moet doen. Voor elke soort instructie zal er een andere bewerking moeten gebeuren.
We kunnen de 4-bit ALU control input genereren door gebruik te maken van een kleine control unit met als inputs funct7 en funct3 velden van de instructies en een 2-bit controle veld, namelijk de ALUOp (zie def ALUOp). De output van een ALU control unit is dus een 4-bit signaal dat afhangt van de ALUop control bits en de verschillende opcodes voor de R-type instructies. De ALUOp (gegenereerd door de main control unit) is het 1ste niveau van decodering. In het 2de niveau wordt (optioneel - niet voor ld, st, beq) gebruik gemaakt van de func3 en func7 velden. 2 niveaus want main control unit is kritisch voor performantie -> kleiner is sneller.
0000 AND
0001 OR
0010 add
0110 substract
Branch hazard
Een vorm van een control hazard, waarbij men moet wachten op het branch target adress voor men verder kan gaan.
Figure 4.10
Het datapad voor S-, en R-type instructies. Zie foto en zie dat je nut van elk element kan uitleggen. (zie def. S-, en R-type instructions). Two multiplexors worden hier gebruikt.
Branch history table
= Branch prediction buffer = klein geheugenelement dat geindexeerd wordt door een deel van het adres van een branch instructie en 1 bit bevat dat behoud of de vorige branch recent was genomen of niet. We weten niet zeker of deze assumptie de juiste is, want twee branches kunnen wijzen naar hetzelfde element van de tabel. Dit is niet erg want we beschouwen de assumptie gewoon als een hint.
Branch prediction
Een methode om een branch hazard (control hazard) op te lossen door een bepaalde uitkomst aan te nemen en met die assumptie verder te gaan ipv. te wachten. Als de assumptie juist was, wordt de pipeline hierdoor niet vertraagd. Je hebt dus enkel een stall bij een misvoorspelling.
Indien de voorspelling fout was worden de reeds uitgevoerde instructies ongedaan gemaakt (meestal gebruikt men daarom een soort tijdelijke opslag) en geflusht door controle op 0 te zetten en dit door te laten sijpelen in de pipeline. Kan static en dynamisch. Er zijn verschillende soorten prediction. Bijvoorbeeld kijken naar wat de vorige keer werd gedaan of altijd voorspellen dat de branch niet genomen wordt. De kost van een foute prediction moet worden afgewogen tegen de kost van de voorspellingsmethode. De 2-bit predictor is een oplossing voor een tekortkoming van een 1-bit predictor. In een 2-bit predictor moet de voorspelling twee keer fout zijn voordat het wordt veranderd.
Branch prediction buffer
= branch history table = Klein geïndexeerd geheugen in de lagere portie van het adres van de branch instructies en bevat 1 bit dat zegt of de vorige branch recent was genomen of niet. We weten niet zeker of deze assumptie de juiste is, want twee branches kunnen wijzen naar hetzelfde element van de tabel. Dit is niet erg want we beschouwen de assumptie gewoon als een hint.
Branch taken
Indien de conditie van de branch geldig is bij een I-type instructie en de program counter het branch target adres wordt.
Als de branch untaken is, is de conditie vals en wordt de PC gewoon het adres van de instructie dat sequentieel volgt op de branch.
Figure 4.13
De waarheidstabel voor de 4 ALU controle bits, met X = don’t-cares. Inputs: ALUOp (2 bits), funct7 veld (7 bits), funct3 veld (3 bits) → 4 controle bits als output.
Branch target address
Dit wordt gebruikt in de beq instructie.
Het adres dat in de branch wordt gespecifieerd dat de nieuwe PC wordt als de branch taken is (dus als de condition true is). Dit adres is gelijk aan de som van het offset veld van de instructie en het adres van de branch.
Als de branch untaken is, is de conditie van de branch vals en wordt de PC gewoon het adres van de instructie dat sequentieel volgt op de branch.
Branch target buffer
Een structuur dat de bestemming voor de PC of een instructie voor een branch bijhoudt via tags (duurder dan simpele prediction buffer).
Een branch predictor vertelt ons of een conditionele branch genomen is of niet, maar het moet ook nog steeds de branch target berekenen. Deze calculatie neemt 1 cyclus in beslag en dus taken branches hebben een 1 cyclus penalty. Een alternatief is dus dat we ook adressen bijhouden. De branch target buffer is dus de cache van target adressen.
Bubble
= pipeline stall = pause om een (load-use) hazard op te lossen
Bypassing
= forwarding = een methode om data hazards op te lossen door het missende data elements uit interne buffers te halen ipv. Te wachten tot deze in een register of het geheugen wordt gestoken . (gaat alleen indien destination stage later is de source stage) (lost niet echt load-use data hazards op = een load nog niet zichtbaar voor instructie dat hem nodig heeft)
Figure 4.14
De 4 types voor de instructieklassen (elks 32 bit → 64 bit via Imm Gen).
- R-type = arithmetische operaties. Het heeft 3 register operanden, rs1, rs2 en rd. rs1 en rs2 zijn bronnen, rd is de destinatie. De ALU functie zit in the funct3 en funct7 velden.
- I-type = immediate en load. Het register rs1 is het basisregister dat opgeteld wordt aan het 12-bit immediate veld om het geheugenadres te vormen. Het veld rd is het destinatie register voor de geladen waarde.
- S-type = store. Het register rs1 is het basisregister dat opgeteld wordt aan het 12-bit immediate veld om het geheugenadres te vormen. Het immediate veld is opgesplitst in een 7-bit stuk en een 5-bit stuk. Het feld rs2 is het bronregister waarvan de waarde in het geheugen moeten worden opgeslagen.
- SB-type = conditional branch. De registers rs1 en rs2 worden met elkaar vergeleken. He 2-bit immediate adres wordt sighn-extended, wordt naar links geschift met 1 bit en wordt toegevoegd aan de PC om het branch target adres te vormen.
Check yourself p. 250
1) Voor een load instructie zorgt de MemtoReg ervoor dat de data van het geheugen naar de register file wordt gestuurd.
2) In een single-cycle datapath hebben we een apart geheugen voor instructies en data, omdat de processor per cyclus werkt en geen 2 opvragingen kan doen in 1 geheugen in 1 cyclus.
Combinational element +
Er zijn 2 soorten logische elementen in een datapad( combinational en sequential element). Een combinational element is een element dat opereert op data (zoals en AND gate of een ALU). De output is enkel afhankelijk van de input (geen intern geheugen) Het geeft dus altijd hetzelfde resultaat bij dezelfde input.
Pipelining
Mooi voorbeeld van parallelisme: een implementatie techniek waarbij verschillende instructies overlappen tijdens uitvoering. Pipelining verbetert de performantie door de instructie throughput te vergroten ipv. de lengte van een instructie te verkorten.
De processor wordt hierbij in verschillende stages verdeeld (vb. IF, ID, EXE, MEM, WB). Een RISC-V instructie heeft meestal 5 stappen:
- intrusction fetch IF
- instruction decode / register lezen ID
- execution / adres berekenen EX
- memory access MEM
- resultaat in register schrijven WB
The RISC-V pipeline heeft dus 5 stages. De klok cyclus is gelijk aan de duur van de traagste operatie. (bij single cycle implementantion bepaalt langste instructie klok cyclus).
In ideale omstandigheden duren alle stages even lang en voer je een heel groot aantal instructies uit waardoor de speedup = aantal stages. In realiteit is dit echter niet zo en is de speedup < aantal stages.
RISC-V is ontworpen voor pipelining:
- elke instructie is even lang, ophalen altijd gelijk (makkelijker voor fetch en decodering)
- heeft weinig instructieformaten
- geheugen operanden alleen in stores en loads
Comment figure 4.77
DGEMM, met zowel AVX subword-parallelism als loop unrolling om meer kansen te creëren voor instruction-level parallelism. (performantie: unoptimized 1.7 GFLOPS, AVX 6.4, AVX + unroll 14.6)
Comment figures 4.73, 4.75, 4.76
- 73: performantie ARM cortex-A53 op benchmarks: ideale CPI = 0.5 (2 micro operaties/cyclus) + pipeline stalls + memory hierarchy stalls + mcf heel moeilijk programma snel te krijgen.
- 75: performantie i7 op benchmarks: 4 micro operaties/cyclus (theoretisch) + stalls en misvoorspellingen
- 76: I7 ‘verloren werk’: percentage misvoorspellingen van branches en hun verloren werk
Commit unit
Dit is 1 van 3 grote delen van een processor bij dynamic pipeline scheduling. Dynamische of out-of-order pipeline dat bepaalt wanneer het veilig is een resultaat van een operatie in het register en geheugen te plaatsen, zichtbaar voor de programmeur.
Control hazard
Algemeen veroorzaken hazards pipeline stalls (situatie waardoor een instructie-stroom niet gewoon verder kan uitgevoerd worden in de pipeline). Bij control hazards (= branch hazards) is de uitkomst van een conditionele branch nog niet geweten. We moeten dus een beslissing maken gebasseerd op een resultaat dat nog aan het uitvoeren is (bv. Branch): We kunnen dit oplossen via een stall of via branch prediction.
Control signal
Een signaal dat gebruikt wordt voor het aansturen van multiplexors of om te bepalen welke operatie een functionele unit moet uitvoeren. Het staat in contrast met een data signaal dat de info bevat dat gebruikt wordt door het functionele element.
Voor de eenvoud tonen we geen controle signaal als er bij elke klok tik in een state element geschreven worden. Als dit niet het geval is, is een expliciet controle signaal nodig en zal een controle lijn aangeven wanneer er geschreven wordt.
De output van een control unit bestaat uit 2 1-bit signalen dat gebruikt worden om multiplexors the controleren (ALUSrc en MemtoReg), 3 signalen om het lezen en schrijven in een register file en geheugen te controlereren (RegWrite, MemRead en MemWrite), 1 signaal om te bepalen of er gebranched wordt (Branch) en een 2-bit signaal voor de ALU (ALUOp).
Correlating predictors
Je gebruikt niet alleen de info van de lokale branches (per sprong bijhouden wat die sprong de vorige keer / keren deed), maar ook het globale gedrag van de meest recente branches om een prediction te maken voor het branch target adress. Door niet enkel info te gebruiken van de lokale branches (zoals gedaan wordt bij 1-bit of 2-bit dynamic predictors), zorgt men voor een grotere predictie accuraatheid voor hetzelfde aantal prediction bits.
De globale geschiedenis (= gedrag van sprong hangt af van vorige sprongen in heel programma) wordt bijgehouden in 1 lang schuifregister.
Data hazards
Algemeen veroorzaken hazards pipeline stalls (situatie waardoor een instructie-stroom niet gewoon verder kan uitgevoerd worden in de pipeline). Bij data hazards heeft een instructie gegevens nodig die nog niet beschikbaar zijn. Er is dus een stall in pipeline doordat een stap moet wachten op een voorgaande stap om te voltooien.
Primaire oplossing is gebaseerd op de observatie dat we niet moeten wachten tot de instructie voltooid is om de hazard op te lossen. Forwarding: het toevoegen van extra HW om het resultaat direct naar de plaats te brengen waar het nodig is. Kan enkel als de bestemminsgstage later in tijd voorkomt.
Datapath
Een verzameling van functionele elementen (bv alu, data memory, instruction memory, …) die operaties uitvoeren voor gegevensverwerking, als ook registers en buses (=datapad voor informatieuitwisseling tussen CPU, RAM en I/O). Samen met de controle eenheid vormt het datapad de CPU.
De basiselementen van een datapad zijn:
- een geheugen unit om de instructies van het programma in op te slaan en instructies te geven gegeven het adres (dit is een state element)
- PC dat het adres van de huidige instructie bijhoudt (dit is een state element)
- adder dat de PC verandert naar het adres van de volgende instructie
Destination register in instruction format
Destination register is 5 bits lang en komt voor bij R en I type instructies. Het bepaald in welk register het resultaat van de ALU of uit het geheugen geschreven moet worden.
Difference between figures 4.11 and 4.15
Het verschil is dat nu alle nodige multiplexors en controlelijnen zijn toegevoegd (in fig 4.15). Ook de ALUOp control signal is toegevoegd.
Differences between figures 4.9 and 4.10
4.10 is een datapad voor een R, S, en I-type en 4.9 is voor een SB-type (branch)
Don’t care terms
Termen in een waarheidstabel die geen invloed hebben op de uitkomst, ongeacht of ze 0 of 1 zijn. Deze maken de tabellen korter.
bv. bij de waarheidstabel voor de 4 ALU controle bits maakt het bij de ALUOp bits 00 niet uit wat de funct7 en funct3 velden zijn.
Dynamic branch prediction
Prediction of een branch al dan niet genomen wordt die zich baseert op runtime informatie en zich dus aanpast tijdens de uitvoer van het programma. De predictie wordt dus bepaald tijdens de uitvoering. De hardware meet het branch gedrag door de recente geschiedenis van elke branch bij te houden. Het veronderstelt dat het toekomstig gedrag = huidig gedrag en bij misvoorspelling krijg je een stall + aanpassing van geschiedenis.
Dynamic branch prediction: 1-bit predictor
Houdt 1 bit bij van de vorige status van de branch (taken of untaken), nadeel is dat de nauwkeurigheid gelijk zal zijn aan de taken branch frequentie voor veel voorkomende branches. Bij de 1-bit predictor kunnen binnenste lussen twee maal misvoorspeld worden. Een beter alternatief is de 2-bit predictor.
Figure 4.19: explain all lines that are active during an R-type instruction
1) Instructie wordt opgevraagd en de PC wijst naar de volgende adres.
2) De controle eenheid berekent de setting van de controle lijnen en 2 registers worden gelezen uit het register file
3) De ALU voert de bewerking uit, afhankelijk van de opcode
4) Het resultaat van de ALU wordt geschreven in het destination register
Figure 4.20: explain all lines that are active during a load instruction
1) Instructie wordt opgevraagd en de PC wijst naar de volgende adres
2) Een register waarde wordt gelezen uit register file
3) De ALU neemt de som van de read en de sign extended 12 bits van de instructie (offset)
4) Som van de ALU wordt gebruikt als adres in het geheugen
5) De data uit het geheugen wordt geschreven in het destination register
Figure 4.21: explain active lines during branch-if-equal instruction
1) Instructive wordt opgevraagd en de PC wordt naar het volgende adres gezet
2) 2 registers worden gelezen uit register file
3) De ALU trekt de waarden van de reads van elkaar af en de waarde van de PC wordt opgeteld bij de sign-extended 12 bits van de instructe (left shift met 1(, het resultaat is het branch target adress
4) De nul status van de ALU wordt gebruikt om te beslissen welk adres het volgende is en dus de PC.
AluOp
2-bit controle veld dat aanduid of de operatie die moet uitgevoerd worden een add(00) is voor loads en stores, substract en test if zero (01) voor beq of afhankelijk is van de operaties gecodeerd in de velden funct7 en func3 (10) voor R-type instructies.
De bits worden gegenereerd in de main controle unit en zijn output wordt gebruikt door de ALU control unit
Dynamic branch prediction: 2-bit predictor
Een prediction moet 2 keer fout zijn voordat de prediction wordt veranderd. Dit is het betere alternatief van de 1-bit predictor
Dynamic multiple issue
Een implementatie van een multiple issue schema waarbij de beslissingen worden gemaakt tijdens de executie door de processor. De hardware bepaalt dan welke instructies samen worden uitgevoerd.
Alternatief is static multiple issue
Dynamic pipeline scheduling
Kiest welke instructie we gaan uitvoeren in een gegeven clock-cyclus om stalls en hazards te vermijden. (herorganisatie van de volgorde van de instructies). Een superscalar processor bevat dit.
In zo’n processor wordt de pipeline in 3 delen onderverdeeld:
- instruction fetch en issue unit: fetchen van instructies, ze decoderen en elke instructie naar de overeenstemmende functionele unit sturen voor execution.
- multiple functional units (inclusief reservation stations)
- commit unit
Edge-triggered clocking
Een clocking methodology bepaalt wanneer signalen gelezen of geschreven worden (kan niet tegelijk want dit zou de hardware onvoorspelbaar maken door rommel).
Een clocking methodology, waarin elke verandering van een staat op een clock edge moet gebeuren wordt een edge-triggered clocking methodology genoemd. (clock edge = snelle transitie van H-voltage L-voltage) Aangezien enkel state elementen een datawaarde kunnen opslaan, moeten de inputs van een set van state elements komen en de outputs in een set van state elementen geschreven worden.
(state element 1 -> combinational logic -> state element 2). Deze methodology laat ons toe dat het lezen, bewerken en schrijven in 1 klokcyclus kan gebeuren.
Figure 4.28
Een voorbeeld van een pipeline stall of bubble (bij data hazards)
Exception
= interrupt = een onvoorziene omstandigheid dat een executie van het programma tegenhoudt (kan zowel een externe als interne oorzaak zijn), wordt gebruikt om niet gedefinieerde instructies op te sporen (bv. overflow, een niet bestaande instructie, oproep naar OS)
Het behandelen van exceptions is een kritisch element in het ontwerp en is een deel van de controle. Het is het moeilijkste deel om juist te krijgen en snel te maken. Het moet goed bekeken worden van bij het begin.
Exception program counter
= SEPC (supervisor exception program counter)
Wordt gebruikt om het adres op te slaan van de instructie waarbij tijdens het uitvoeren een exception is ontstaan. Dit is een van de basisacties die de processor moet ondernemen wanneer een exception zich voordoet. Men doet dit zodat men hier eventueel naar kan terugkeren (bv. nadat de OS actie heeft ondernomen) .