Digitale Methoden Onderdeel van vak Computer Systemen Micha de Groot (A,D) Tessa Wagenaar (B) Hendrik Huang (C) Martijn Brehm (E) Kyrian Maat (F) https://staff.fnwi.uva.nl/b.terwijn/computer-systems-2/
Digitale Methoden Syllabus “Van 0 en 1 tot pipelined processor”, Ben Bruidegom week 1: hfdstk 1,2,3 week 2: hfdstk 7,8 week 3: hfdstk 9 week 4: tentamen week 5: hfdstk 10 week 6: hfdstk 11 week 7: nog te bepalen week 8: tentamen
Digitale Methoden Wekelijkse opgaven tellen ieder voor 3% van het totale cijfer. Opgaven maken in Sakai in paren van 2: http://sbt.science.uva.nl:8080/portal De opgaven zijn een goede voorbereiding voor Digitale Methoden tentamen vragen.
Hfdstk 1,2,3: Rekenmachine
Hfdstk 1,2,3: Rekenmachine Een computer is logisch gezien opgebouwd als een zeer grote combinatie van een klein aantal logische poorten: AND, OR, NOT, XOR Poorten worden gebruikt voor representatie van en operaties op data zoals optellen/aftrekken van getallen door een Adder. 7 – 6 = 0111 - 0110 = 0111 + 1010 (inverteer en plus 1) = 0001
Hfdstk 1,2,3: Rekenmachine Een processor kan een reeks van instructies (een programma) uitvoeren en bestaat in de basis uit: Program Counter Instruction Memory Registers ALU
Hfdstk 1,2,3: Rekenmachine
Hfdstk 1,2,3: Rekenmachine Paragraaf 3.7 Opdracht 4, een voorbeeld programma wat de waarde van register 1 en register 2 wisselt zonder gebruik van een derde register. @include "Rekenmachine_II.wasm" .code MyCode : REKENMACHINE_II LOADI $1, 0x00FF # Laad test data in register 1 LOADI $2, 0xFF00 # Laad test data in register 2 XOR $1, $1, $2 # 0xFFFF XOR $2, $1, $2 # 0x00FF XOR $1, $1, $2 # 0xFF00 Wat is een andere manier om te wisselen en waarom is deze manier nuttig?
Hfdstk 7,8: Harvard Processor
Hfdstk 7: Calulator with loops Branch instructies zijn toegevoegd aan de processor om "loops" te kunnen uitvoeren. BZ, branch if rt is zero BNZ, branch if rt is not zero BEQ, branch when rs equals rt BNE, branch when rs not equal rt BRA, branch always
Hfdstk 7: Calulator with loops Hiervoor is de processor uitgebreid met extra elementen. Branch, maakt branch mogelijk Zero, test of uitgang ALU 0 is Invert, inverteerd de zero bit waarde RegWrite, beslist of naar rd geschreven wordt SecReg, beslist of ALU rt of Constant Number binnen krijg
Hfdstk 7: Calulator with loops
Hfdstk 8: Harvard Processor Data Memory is toegevoegd om in meer dan alleen registers data op te kunnen slaan. Nieuwe instructies: SW, schrijf waarde van rt naar adres wat de ALU bepaalt LW, laad rd met de waarde op adres wat de ALU bepaalt
Hfdstk 8: Harvard Processor Hiervoor is de processor uitgebreid met extra elementen. MemWrite, beslist of data naar Data Memory geschreven wordt Mem2Reg, beslist dat of Data Memory of de ALU data aan biedt aan rd
Hfdstk 8: Harvard Processor
Hfdstk 7,8: Harvard Processor Paragraaf 7.5 Opdracht 7, sorteer 2 registers van klein naar groot @include "CalculatorWithLoops.wasm" .code MyRegisters : REGISTERS 0x1: WORD a 15 0x2: WORD b 13 0x3: WORD a_min_b 0x4: WORD temp .code MyCode : LOOPS_MACHINE, MyRegisters SUB a_min_b, a, b # subtract to compare ANDI temp, a_min_b, 0x8000 # bit mask of last bit BNZ temp, end # if last bit is 1 (negative) go to end COPY temp, a # else switch: remember value of a COPY a, b # a gets value of b COPY b, temp # b gets old value of a end: HALT Waarvoor dient de bit mask "0x8000"?
Hfdstk 9: Pipelined Processor
Hfdstk 9: Pipelined Processor Bij een Pipelined Processor wordt er per cycle maar een deel van een instructie uitgevoerd, maar de processor werkt wel aan meerdere instructies tegelijkertijd. Dit levert (vaak) snelheidswinst op, maar kan ook voor problemen zorgen: Data Hazard Branch Hazard
Hfdstk 9: Pipelined Processor Data Hazard, een instructie heeft data nodig, maar de instructie die deze data produceert is nog niet klaar. Mogelijke oplossingen: bubbles (NOP) toevoegen, wachten op de data (snelheidsverlies) forwarding, processor aanpassen zodat data (in sommige gevallen) sneller beschikbaar is scheduling, volgorde van instructies aanpassen zonder gevolgen voor de uitkomst van programma
Hfdstk 9: Pipelined Processor Branch Hazard, de instructie die bepaalt of een branch plaats vindt is nog niet klaar waardoor niet duidelijk is welke volgende instructies in de processor moeten worden geladen. Mogelijke oplossingen: flushing, verkeerd geladen instructies worden automatisch verwijderd, het werk hieraan is voor niks geweest scheduling, volgorde van instructies aanpassen zonder gevolgen voor de uitkomst van programma branch prediction, proberen te raden of de branch plaats vindt op basis van vorige keren
Hfdstk 9: Pipelined Processor Paragraaf 9.6 Opdracht 5, kopieer data van 'start' naar 'dest' zonder forwarding en met branch prediction @include "PipelinedHarvard.wasm" .data MyData : DATAMEM 0x10: WORD start 0x01 WORD 0x02 WORD 0x03 WORD 0x04 WORD 0x05 WORD 0x00 0x20: WORD dest .data MyRegisters: REGISTERS 0x00: WORD index 0 0x01: WORD temp .code MyCode : HARVARD, MyData, MyRegisters loop: LW temp, start, index NOPasasNOP NOP SW temp, dest, index ADDI index, index, 1 BNZ temp, loop HALT Waarvoor zijn de NOPs nodig, en hoe zou scheduling of forwarding dit programma kunnen versnellen?
Hfdstk 10: Procedures
Hfdstk 10: Procedures Een procedure aanroep is een branch instructie waarbij we het adres bewaren waarnaar we willen terugkeren aan het einde van de procedure. Ook willen we dat het uitvoeren van de procedure de waarden van registers die in gebruik zijn niet verandert. Daarom bewaren we deze waarden tijdelijk op de stack.
Hfdstk 10: Procedures Hiervoor is de processor uitgebreid met extra elementen. First Reg, kan PC nu ook de waarde van rs geven Result Origin, kan rd nu ook de waarde van PC+1 geven
Hfdstk 10: Procedures
Hfdstk 10: Procedures @include "16bitJumper.wasm" Paragraaf 10.6 Opdracht 6, functie max3 bepaalt het maximum van 3 waarden @include "16bitJumper.wasm" .code MyCode : REGSTACK, MyData LOADI $arg1, 1 LOADI $arg2, 2 LOADI $arg3, 3 JSR max3 HALT # endless loop max: #--------------- max procedure --------------- SUB $tmp1, $arg1, $arg2 ANDI $tmp1, $tmp1, 0x8000 BZ $tmp1, arg1max COPY $val1, $arg2 RETURN $ra arg1max: COPY $val1, $arg1 RETURN $ra #------------ return max ------------- Max3: #--------------- max3 procedure -------------- SUBI $sp,$sp,2 # reserve memory on stack SW $ra, 0, $sp # write to stack SW $s1, 1, $sp COPY $s1, $arg3 JSR max COPY $arg1, $val1 COPY $arg2, $s1 LW $s1, 1, $sp # read back from stack LW $ra, 0, $sp ADDI $sp,$sp,2 # release memory on stack RETURN $ra # ------------ return max3 ------------ Waarom wordt bij "max" niet naar de stack geschreven maar bij "max3" wel?
Hfdstk 11: Caching
Hfdstk 11: Caching Cache geheugen is snel geheugen wat data van een groter langzamer geheugen sneller beschikbaar probeert te maken. Dit doet het door tijdelijk data van het langzame geheugen te bewaren waarvan de kans groot is dat dit gelezen of overschreven gaat worden.
Hfdstk 11: Caching Hiervoor is de processor uitgebreid met extra elementen. De Cache, het snelle geheugen Mem Read, vertelt de Cache wanneer uit Data Memory gelezen wordt Advance PC, houdt PC tegen bij cache miss
Hfdstk 11: Caching
Hfdstk 11: Caching @include "16bitDirectMappedCache.wasm" .data MyData : DATAMEM 0d0: WORD base .code MyCode : HARVARD, MyData LOADI $1, 10 # set loop counter loop: SUBI $1, $1, 1 # decrease loop counter LW $2, base, $1 # load next word BNZ $1, loop # loop when loop counter not zero HALT We gebruiken direct-mapped cache van 16 blocks van ieder 4 words. Hoeveel cache misses komen dan voor bij uitvoeren van dit programma?