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