Program Datorteknik Abstraktionsnivå: Högnivåspråk ERIK LARSSON» t ex C, C++ Assemblyspråk» t ex ADD R, R Maskinspråk» t ex 000.0 Exekvering av en instruktion Kontrollenhet () Hämta instruktion på 0000000 (där PC pekar) Fetch ADD XOR ClearY System buss () Flytta instruktionen 000000000 till CPU (3) Avkoda instruktionen: 0000 MOVE, 0000 Adress, 0 Register 3 (4) Hämta data på adress: 0000 Execute Z out Z Z in ALU Carry in Y Y out Y in MBR MBR out MBR in MAR MAR in PC PC out PC in (5) Lagra datan i register 3 R0 out R0 in RN out RN in IR in IR out Kontroll signaler Primärminne Address Instruktion/data 0000000 000000000 000000 000000000 000000 0000000000 00000 000000000 Data Instruktioner Register CPU Kontrollenhet Aritmetisk Logisk Enhet (ALU) R 0 R n IR Klocka Kontrollenhet Statussignaler Carry, overflow MBR out Y in R0 RN out out MAR in MAR out PC in ADD
Exekveringstid Exekveringstid Instruktion: ADD R, R3 // R <- R + R3 Kontrollsteg = Klockcykler per instruktion (CPI). PC out, MAR in, Read, Clear Y, Carry-in, Add, Z in. Z out, PC in 3. MBR out, IR in 4. R out, Y in 5. R3 out, Add, Z in 6. Z out, R in, End Antal klockcykler för att exekvera en maskininstruktion Clocks per instruction (CPI) Tid för en klockcykel Tid för en klockperiod (T) Frekvens (f) är: f=/t Antal maskininstruktioner Instruction count (IC) Exekveringstid i klockcykler = CPI x T x IC Exekveringstid Prestanda Prestanda kan ökas genom: Öka klockfrekvensen (f) (minska T) Minska antal instruktioner (IC) Minska antal klockcykler per instruktion (CPI) Algoritm Bestämmer vilka och hur många operationer som ska utföras Programmeringsspråk, kompilator, arkitektur Bestämmer hur många maskininstruktioner som ska utföras per operation Processor och minnessystem Bestämmer hur snabbt instruktioner exekveras I/O (Input/Output) och operativsystem Bestämmer hur snabbt I/O operationer ska exekveras
Maskininstruktioner Maskininstruktioner Typer av instruktioner: Aritmetiska och logiska (ALU) Dataöverföring Hopp In- och utmatning Definitioner: Vad ska göras (operationskod)? Vem är inblandad (source operander)? Vart ska resultatet (destination operand)? Hur fortsätta efter instruktionen? Maskininstruktioner Aritmetiska operationer Att bestämma: Typ av operander och operationer Antal adresser och adresserings format Registeraccess Instruktionsformat» Fixed eller flexibelt Addition (+) och subtraktion (-) Två källor (sources) och en destination (destination) add a, b, c // a = b + c Alla aritmetiska funktioner följer detta mönster Design regel: Enkelhet föredrar regelbundenhet Regelbundenhet gör implementation enklare Enkelhet ökar möjligheten till högre prestanda till lägre kostnad
Aritmetiska operationer Adressering C kod: Immediate adressering f = ( g + h ) ( i + j ); ADD R4,#3 //R4<-R4+3 Kompileras till assemblykod (MIPS): Operanden finns direkt i instruktionen add t0, g, h # temp t0 = g + h add t, i, j # temp t = i + j sub f, t0, t # f = t0 - t ADD R4 3 Adressering Adressering Direkt adressering ADD R4, 3 //R4<-R4+[3] Adressen till operanden ligger i instruktionen ADD R4 3 Adress 0 3 4 Data 33 44 55 Register adressering ADD R4,R3 //R4<-R4+R3 Liknar direkt adressering men istället för att peka ut i minnet så pekas ett register ut ADD R4 3 Register 0 3 4 Data 33 44 55
Adressering Adressering Memory indirect ADD R4,(3) R4<-R4+[[3]] Instruktionen innehåller adressen till en minnesplats som innehåller den önskade adressen Adress ADD R4 3 Med indirekt adressering kan en större minnesarea adresseras då stora adresser kan läggas i minnet och instruktionen pekar ut dem. Data Register indirect ADD R4,(R3) R4<-R4+[R3] Liknar indirekt adressering men instruktion pekar ut register istället för minnesplats ADD R4 3 R3 Adress Data Adressering Adressering Displacement ADD R4,R.X R4 R4+[R+X] Ett basregister (vanligen ett general purpose register) ger basen och ett par bitar ger displacement (en offset från basregister) ADD R 3 R + Adress Data Relativ adressering Använd t ex PC för att skapa adress. Enbart liten bit finns i instruktionen ADD R4 3 PC + Adress Data
Varför olika sätt att adressera? Adressering: avvägningar Extra tid (jmf ovan) Öka flexibiliteten vid programmering, vilken förenklar programmering Antal bitar för att specificera en adress är begränsat. Exempel: Om 8-bitar används:. Adress.. kan 8 adresser pekas ut. Men, om 8-bitar används att peka ut ett register som innehåller adress kan 6 adresser pekas ut Minne R. Adress.. Adress. (6-bitar) Minne Få och enkla adresseringsmöjligheter Stora adressfält i instruktion för att kunna täcka stor adressrymd Begränsar programmering Snabbare adressberäkning Mindre komplex processor Många och avancerade adresseringsmöjligheter Tillåter mindre addressfält utan att påverka adressrymd Flexibel programmering Kan ge långsam adressberäkning Ökar komplexitet av processorn Z out R0 out Kontrollenhet komplexitet Z R 0 Z in ADD ALU Carry in XOR R0 in RN out R n ClearY Y Y out Y in RN in IR in MBR MBR out IR System buss MBR in IR out Klocka MAR MAR in Kontrollenhet PC PC out Kontroll signaler PC in MBR out Y in R0 RN out out MAR in Hoppinstruktioner Exempel a=a+b; c=a-b; d=a*f; Instruktionerna utförs i ordning Instruktionen här görs flera gånger Exempel a=0; while (a<0) a=a+; if (b==5) c=0; else c=0; d=a*f; Beroende på villkor görs olika saker (olika instruktioner exekveras) Statussignaler Carry, overflow MAR out PC in ADD
Hoppinstruktion Nästa instruktion är normalt nästa i programmet. PC=PC+; Programräknaren (program counter) räknas upp och nästa instruktion hämtas För att göra hopp till annan del av kod, ladda programräknaren med nytt värde PC=ditt hopp ska sek Två typer av hopp Ovillkorliga hopp Villkorliga hopp Ovillkorliga hopp Exempel: Programräknaren får nytt värde och hämtar nästa instruktion på nytt ställe Adress Instruktion Kommentar 00 Instruktion 9 //Instruktion 9,PC=PC+ 000 BR 00 // PC = 00, PC=PC+ 00 Instruktion 3 //Instruktion 3, PC=PC+ 00 Instruktion 89 //Instruktion 89, PC=PC+ Villkorliga hopp Villkorliga hopp Villkor bestäms av flaggor i statusregister Exempel: Kan påverka statusflagga De vanligaste flaggorna är: N: om resultatet är negativt (annars 0) SUB R, # BEZ TARGET // R=R- // IF Z= THEN PC=TARGET Z: om resultatet är noll (annars 0) OP V: om aritmetiskt overflow (annars 0) C: om carry (annars 0) UT ALU IN IN Kollar statusflagga N Z V C UT ALU OP IN IN Status Statusregister Status
Villkorliga hopp Subrutiner och funktioner ADD XOR ClearY System buss Program: Exekvering: Z out R0 out Z Z in ALU Zero Carry in R0 in RN out Y Y out Y in RN in IR in MBR MBR out MBR in MAR in IR out MAR PC PC out Kontroll signaler PC in void main(void){ int a, b, c; a=5; b=6; c=my_add(a,b); } a=5 //instruktion b=6 //instruktion funktionsanrop +parameteröverföring c=my_add(a,b); instruktion återhopp+parameteröverföring R 0 R n IR Klocka Kontrollenhet Statussignaler Carry, overflow MBR out Y in R0 RN out out MAR in MAR out PC in ADD int my_add(int x, int y) { x+y; } Subrutiner och funktioner Subrutiner och funktioner Problem instruktion instruktion 3 instruktion 4 instruktion 6 Hopp till subrutin Återhopp från subrutin Parameteröverföring Nästlade subrutinanrop 3 4 proca: instruktion Instruktion instruktion 3 3 4 Exekvering: instruktion instruktion //Proc A Instruktion //Proc A Instruktion 3 //Proc A instruktion 3 instruktion 4 instruktion //Proc A Instruktion //Proc A instruktion 3 //Proc A instruktion 6 Problem instruktion instruktion 3 instruktion 4 instruktion 6 Hopp till subrutin Återhopp från subrutin Parameteröverföring Nästlade subrutinanrop 5 8 4 proca: instruktion call proc B instruktion 3 3 6 7 3 4 5 6 7 8 procb: Instruktion Instruktion Exekvering: instruktion instruktion //Proc A Instruktion //Proc B Instruktion instruktion 3 //Proc A instruktion 3 instruktion 4 instruktion //Proc A Instruktion //Proc B Instruktion instruktion 3 //Proc A instruktion 6
Subrutiner och funktioner Stack instruktion instruktion 3 instruktion 4 instruktion 6 Vid call: Innan hopp, spara PC Vid call: Innan hopp, spara PC proca: instruktion call proc B instruktion 3 Vid : Kolla återhopp Vid call: Innan hopp, spara PC procb: Instruktion Instruktion Vid : Kolla återhopp Två operationer: push och pop Push A A 3 Push B B A 4 Pop A 5 Pop Stackpekare Stack Adress Byte Data Push 0 A 0 0000 00 00 00 00 3 3 00 00 4 4 5 5 0000 6 6 0000 7 7 00 00 Stack Stack Två operationer: push och pop Push A A Adress Byte Data Push 0 A 0 0000 00 00 Två operationer: push och pop Push A A Adress Byte Data Push 0 A 0 0000 00 00 3 Push B B A 4 Pop A 5 Pop Stackpekare 00 00 3 3 00 00 4 4 A 5 5 0000 3 Push B B A 4 Pop A 5 Pop 3 Stackpekare 00 00 3 3 00 00 4 4 A 5 5 B 6 6 0000 6 6 0000 7 7 00 00 7 7 00 00
Stack Stack Två operationer: push och pop Push A A Adress Byte Data Push 0 A 0 0000 00 00 Två operationer: push och pop Push A A Adress Byte Data Push 0 A 0 0000 00 00 3 Push B B A 4 Pop A 5 Pop 4 Stackpekare 00 00 3 3 00 00 4 4 A 5 5 B 3 Push B B A 4 Pop A 5 Pop 5 Stackpekare 00 00 3 3 00 00 4 4 A 5 5 B 6 6 0000 6 6 0000 7 7 00 00 7 7 00 00 Stack för subrutiner och funktioner instruktion instruktion 3 instruktion 4 instruktion 6 Push (tid ) Push 5 (tid 5) proca: instruktion call proc B instruktion 3 5 Pop (tid 8) Pop (tid 7) Ger 5 0 ger 0 5 Pop (tid 4) ger Push 0 (tid 6) 0 Push 0 (tid ) 0 5 0 5 0 procb: Instruktion Instruktion Pop (tid 3) ger 0 0 Register för subrutiner och funktioner Level i Level i+ Level i+ R 0 instruktion instruktion 3 instruktion 4 instruktion 6 Register window In Local Out CWP CWP Alla register In Local Out proca: instruktion call proc B instruktion 3 In Local Out R N CWP: Current Window Pointer procb: Instruktion Instruktion CWP
Återhopp och parameteröverföring In- och utmatning Register Läsning och skrivning: Använd ett antal register för att spara återhoppsadress och för parameteröverföring Fördel: snabbt. Nackdel: register behövs Stack Reservera en del av minnet och skapa en kö som fungerar enligt Last-In First-Out Enhet för indata Primärminne (CPU) Enhet för utdata Fördel: stort. Nackdel: långsamt (jmf register) Sekundärminne Minnesmappad och isolerad I/O Exempel på minnesmappad I/O LOAD R, 7 //Ladda R med värde på adress 7 STORE R, 6 //Lagra värdet i R på adressplats 6 Adress Instruktion/ Data 0 0000 00 00 00 00 3 00 00 4 5 0000 6 000 0000 7 000 0000
Maskininstruktioner Instruktionsformat Aritmetiska och logiska (ALU) Dataöverföring (adressering) Hopp och subrutiner Inmatning/utmating (Input/Output (I/O)) Hur definiera fälten i instruktioner? Opcode Operand Operand Hur ska högnivåspråk kompileras och exekveras effektivt? Abstraktionsnivå Högnivåspråk Maskinspråk Semantiskt gap Antal adresser i instruktion Antal adresser i instruktion För att beräkna: X = (A+B)*C 4-adress instruktioner: Op A, A, A3, A4 //A <- [A] op [A3], nästa instruktion = A4 I: ADD X, A, B, I I: MUL X, X, C, I3 I3: 3-adress instruktioner: Op A, A, A3 //A <- [A] op [A3] I: ADD X, A, B I: MUL X, X, C I3: OP A A A3 A4 OP A A A3 För att beräkna: X = (A+B)*C -adress instruktioner: Op A, A //A <- [A] op [A] MOVE A, X ADD X, B MUL X, C -adress instruktioner: Op A //Acc <- [Acc] op [A] LOAD A ADD B MUL C STORE X OP A A OP A
Antal adresser i instruktion Vanligast med och 3 adresser i instruktioner 4 adress instruktioner är opraktiskt. Nästa instruktion antas vara nästa instruktion. PC räknas upp av sig själv. Måste ha hopp-instruktioner adress instruktion är ganska begränsande Exempel, antag 3 register (5 bitar behövs): 3-adress format: 5 bitar -adress format: 0 bitar -adress format: 5 bitar OP Rdest Rsrc Rsrc Få adresser, få instruktioner förenklar processorn men gör den mer primitiv Intel x86 ISA Utveckling med backward compatibility 8080 (974): 8-bit microprocessor» Accumulator, plus 3 index-register pairs 8086 (978): 6-bit extension to 8080» Complex instruction set (CISC) 8087 (980): floating-point coprocessor» Adds FP instructions and register stack 8086 (98): 4-bit addresses, MMU» Segmented memory mapping and protection 80386 (985): 3-bit extension (now IA-3)» Additional addressing modes and operations» Paged memory mapping as well as segments Intel x86 ISA Bakåtkompabilitet (Backward compatibility) Semantiskt glapp Två alternativ: CISC (Complex Instruction Set Computers): utveckla komplex arkitektur med många instruktioner och många adresseringsmöjligheter; ta med instruktioner som liknas högnivåinstruktioner. RISC (Reduced Instruction Set Computers): förenkla instruktionsuppsättningen och anpassa den till de verkliga kraven ett applikationsprogram har
Utvärdering av applikationsprogram Utvärdering av applikationsprogram Många studier har gjorts för att ta fram karaktärsdrag av maskinkod som genererats från högnivåspråk Intressanta aspekter: Hur ofta används varje instruktion? Hur används operander? Och hur ofta? Hur mycket används hopp, loopar, anrop till procedurer/ funktioner/subrutiner? Typ Instruktioner i högnivåspråk (%) Instruktioner i maskinspråk (%) Minnesreferenser (%) Pascal C Pascal C Pascal C Tilldelning 45 38 3 3 4 5 Loop 5 3 4 3 33 6 Call 5 3 33 44 45 Villkor (if) 9 43 7 3 Andra 6 3 Många tilldelningar i högnivåspråk men dessa ger få instruktioner i maskinspråk och relativt få minnesreferenser Relativt få loopar men looparna resulterar i många maskininstruktioner och många minnesreferenser Utvärdering av applikationsprogram Utvärdering av applikationsprogram Typ Instruktioner i högnivåspråk (%) Instruktioner i maskinspråk (%) Minnesreferenser (%) Pascal C Pascal C Pascal C Tilldelning 45 38 3 3 4 5 Loop 5 3 4 3 33 6 Call 5 3 33 44 45 Villkor (if) 9 43 7 3 Andra 6 3 Få CALL (anrop till funktioner/ procedurer/subrutiner) men de ger många instruktioner i maskinspråk och relativt många minnesreferenser Relativt många villkor med de ger relativt få maskininstruktioner och relativt få minnesreferenser Fördelning av maskininstruktioner (frekvens av användande): Flytta data (move): ~33% Villkorliga hopp: ~0% ALU operationer: ~6% Adressering Komplexa adressering: ~8% (memory indirect, indexed+indirect, displacement+indexed, stack) Enkel adressering: vanligast (adress kan beräknas i en klockcykel, register, register indirekt, displacement)
Utvärdering av applikationsprogram Utvärdering av applikationsprogram Typer av operander 74-80% av operander är skalärer (heltal, flyttal, tecken, etc), vilka kan lagras i register (icke-skalär, t ex array) Resterande (0-6%) är arrayer; 90% är globala variabler 80% av skalärer är lokala variabler Slutsats: Lagring i register Trots att endast 0-5% av högnivå instruktionerna var funktion/procedure/ subrutin anrop, så svarar dessa CALL och RETURN instruktioner för: 3-43% av maskininstruktionerna 44-45% av minnesreferenserna För procedurer: Endast.5% har fler än 6 parametrar Endast 6.7% har fler än 6 lokala variabler Antal nästlingar är ofta få (korta) och mycket sällan längre än 6 int x, y; float z; void proc3(int a, int b, int c) { ---------------- } void proc(int k) { int j, q; ---------------- proc3(j, 5, q); } void proc() { int i; ---------------- proc(i); } main () { proc(); } Karaktärsdrag hos RISC processorer Enkla och få instruktioner Enkla och få adresseringsmöjligheter Fixt (fast) instruktionsformat Stort antal register Load-and-store architecture Karaktärsdrag hos RISC processorer Ett litet exempel: Antag ett program med 80% enkla instruktioner och 0% komplexa instruktioner som exekveras på en CISC och en RISC CISC: enkla instruktioner tar 4 klockcykler medan komplexa instruktioner tar 8 klockcykler. Antag klockcykel tid på 00 ns (0-7 s) RISC: enkla instruktioner klockcykel medan komplexa instruktioner implementeras som en sekvens av enkla. Antag att det tar i genomsnitt 4 instruktioner för en komplex instruktion. Antag klockcykel tid på 75 ns (0.75*0-7 ). Hur lång tid tar det att exekvera 000 000 instruktioner? CISC: (0 6 *0.80*4 + 0 6 *0.0*8)*0-7 =0.48s RISC: ( 0 6 *0.80* + 0 6 *0.0*4)*0.75*0-7 =0.7s
Karaktärsdrag hos RISC processorer Karaktärsdrag hos RISC processorer Ett litet exempel (fortsättning): Komplexa instruktioner tar längre tid på en RISC, men det är relativt fler enkla instruktioner På grund av sin (relativa) enkelhet, kan RISC operera med kortare cykeltid (högre klockfrekvens). För CISC bromsas enkla instruktioner av mer komplex data path och mer komplex kontrollenhet (det som inte är kontrollenhet kallas för data path) Instruktioner använder få adresseringsmöjligheter: Typiskt: register, direkt, register indirekt, displacement Instruktioner har fixt (fast) längd och uniformt format Detta förenklar och snabbar upp laddning och avkodning. Processorn behöver inte vänta på att hela instruktionen är laddad innan avkodning kan påbörjas Uniformt format, dvs opcode och adressfält är placerat på samma position för olika instruktioner, gör att avkodning förenklas. Karaktärsdrag hos RISC processorer RISC eller CISC? Stort antal register Register kan användas för att lagra variabler och för mellanlagring resultat. Det minskar behov av att använda upprepade load och store med primärminnet. Alla lokala variabler från CALL/RETURN strukturer (anrop till funktioner, procedurer, subrutiner) kan lagras i register. Vad händer vid anrop till funktioner och procedurer? Register innehåll måste sparas, parametrar ska föras över, återhopps adresser ska sparas. Relativt mycket minnes access, vilket tar mycket tid. Med många register, kan nya register allokeras vid anrop Ett entydigt svar är svårt att ge Flera prestanda jämförelser (benchmarking) visar att RISC exekverar snabbare än CISC Men, det är svårt att identifiera vilket karaktärsdrag som är avgörande. Det är svårt att jämföra; t ex olika halvledartekniker, kompilatorer Ett argument för CISC: Den enklare RISC konstruktionen gör att program behöver mer minne (fler instruktioner) jämfört med samma program för en CISC processor Processorer av idag använder sig ofta av lite RISC och lite CISC
Några exempel CISC VAX /780 Nr. of instructions: 303 Instruction size: 57 bytes Instruction format: not fixed Addressing modes: Number of general purpose registers: 6 Pentium Nr. of instructions: 35 Instruction size: bytes Instruction format: not fixed Addressing modes: Number of general purpose registers: 8 (3-bitar mode), 6 (64-bitar mode) Några exempel RISC Sun SPARC Nr. of instructions: 5 Instruction size: 4 bytes Instruction format: fixed Addressing modes: Number of general purpose registers: up to 50 PowerPC Nr. of instructions: 06 Instruction size: 4 bytes Instruction format: not fixed (but small differences) Addressing modes: Number of general purpose registers: 3 Några exempel ARM (Advanced RISC Machine och Acorn RISC Machine) Antal instruktioner (standard set): Instruktions storlek: 4 (standard), (Thumb) byte Instruktions format: fixerat (olika mellan standard och Thumb) Adresserings modes: 3 Antal general purpose register: 7 (6 kan användas samtidigt) Dagens ARM processorer kan exekvera både standard set (3 bitars instruktioner och 6 bitars Thumb instruktions set. Thumb består av en delmängd av 3-bitars setet, kodat som 6-bitars instruktioner).