Design af et ISA Niels Olof Bouvin Institut for Datalogi Aarhus Universitet
Level 2: Maskinniveau (ISA) Level 5 Problem-oriented language level Translation (compiler) Level 4 Assembly language level Translation (assembler) Level 3 Operating system machine level Partial interpretation (operating system) Level 2 Instruction set architecture level Interpretation (microprogram) or direct execution Level 1 Micro-architecture level Hardware Level 0 Digital logic level
Hvad karakteriserer en processor? Central Processing Unit (CPU) Control Unit Arithmetic Logic Unit (ALU) ISA niveauet og von Neumann-maskiner maskininstruktioner og instruktionsformater symbolsk og absolut maskinkode registre og hukommelse Registers Main Memory Input/Output devices Disk SP Printer Bus IJVM PC, SP, LV, CPP method area, constant pool, stakken metodekald, stakafsnit, parametre og lokale variabler Constant Pool CPP Current Operand Stack 3 Local Variable Frame 3 Local Variable Frame 2 Local Variable Frame 1 LV Method Area PC 32 bit 32 bit 8 bit
Design af et ISA Generelle overvejelser Introduktion til Intel Core i7, OMAP4430 og AVR ATMega Datatyper ISA design og eksempler Adressering
Kunsten at designe et instruktionssæt Hvad er formålet med maskinen? Hvilke operationer og hvilken slags data skal understøttes? Hvordan skal hukommelsen adresseres? Effektivitet! tid plads pris Bagudkompabilitet
CISC vs. RISC Før blev CPUer programmeret meget mere i symbolske maskinsprog der var naturligvis compilere, men den bedste kode blev skrevet i hånden For at gøre programmørerne mere effektive, tilføjede man med tiden flere og flere kommandoer til instruktionssættene disse kommandoer kunne typisk udføre flere handlinger i en omgang, f.eks. et procedurekald eller beregning med efterfølgende hukommelsesaccess dette betød, at man kún behøvede én instruktion for en række skridt fremfor adskillige instruktioner bedre performance, da man slap for adskillige cykler af fetch-decode-execute men med tiden kom der mange komplekse instruktioner til og nogen af instruktionerne blev nødvendigvis lange i udførsel alt dette gjorde mikrokoden på CPUerne mere og mere kompleks Disse CPUer blev under ét kaldt Complex Instruction Set Computers af folkene bag
Reduced Instruction Set Computers Filosofi: Fjern alt unødigt der behøver kun være én måde at gøre tingene på Hellere tre simple instruktioner end én kompleks skjul ikke kompleksitet på CPUen Al hukommelsetilgang ordnes eksplicit via load og store alle beregninger foregår i registre (som der til gengæld kan være masser af) Simple, men besværlige at programmere typisk via compilere (der var blevet bedre i mellemtiden) snarere end i symbolsk maskinkode Uniforme instruktioner (ofte af ens længde) simple nok til at kunne udføres af digitale kredsløb fremfor mikrokode høj performance og klokhastighed Vandt frem til (Unix) workstations og servere i senfirserne og halvfemserne
CISC vs. RISC i dag Mest af historisk interesse Moderne CISC CPUer (som Intels Core processorer) er internt højeffektive RISC processorer, gemt under det gamle IA-32 ISA lag, hvor de gamle CISC instruktioner bliver brudt om til korte RISC instruktioner og udført Moderne RISC CPUer (som ARM, SPARC eller POWER) har masser af instruktioner og har en sofistikeret intern arkitektur Performancemæssigt ligger de nogenlunde på niveau i dag er de vigtigste benchmarks snarere performance/watt
Registre og hukommelse Moderne processorer er typisk mellem 8- og 64-bit Dette har betydning for registre hukommelse En given registerbredde er typisk begrænsende for, hvor meget hukommelse man kan adressere, og hvor store tal, man kan regne på af gangen
Adressering af hukommelse Mængden af hukommelse, der kan adresseres, afhænger umiddelbart af registerbitbredden og ordlængden i hukommelsen!!! Bitbredde 8-bit ord 16-bit ord 32-bit ord 64-bit ord 8 256 bytes 512 bytes 1 KiB 2 KiB 16 64 KiB 128 KiB 256 KiB 512 KiB 32 4 GiB 8 GiB 16 GiB 32 GiB 64 17.179.869.184 GiB 34.359.738.368 GiB 68.719.476.736 GiB 137.438.953.472 GiB Hvis man vælger at adressere i større ord, kan man altså håndtere mere hukommelse på bekostning af granularitet
Hukommelsesalignment Skønt man (nutildags) tæller sin hukommelse i bytes, varierer det fra arkitektur til arkitektur, hvilke adresser der kan tilgås direkte Typisk tilgås hukommelsen i 4- eller 8-bytes intervaller dvs. man kan tilgå adresse 0, 4, 16, 40 i en 4-byte aligned hukommelse eller adresse 0, 8, 16, 64, 512 i en 8-byte aligned hukommelse men ikke adresse 5, 13, 129, 222 Grundet bagudkompabilitet, er man som regel tvunget til at kunne tilgå i byteopløsning, men i virkeligheden hentes data ind efter alignment Hvis man kún skal bruge én byte, virker det som spild at hente 8 bytes sådan som hukommelseadgang fungerer, er det faktisk ikke noget stort problem, men man skal naturligvis bruge cache på unødig data og tid på at fiske den relevante byte ud
Statusregister (Program Status Word) Vi kender N og Z fra Mic-1 Rigtige CPUer har et større sortiment Typisk i ét register PSW med bits efter behov Der vil være ISA understøttelse for at checkke de enkelte bits Der vil typisk også være bits, der relaterer sig til processorens tilstand N Negativt resultat Z Nul resultat V overløb C Mente på venstre bit A Mente på bit 3 P Lige paritet
Design af et ISA Generelle overvejelser Introduktion til Intel Core i7, OMAP4430 og AVR ATMega Datatyper ISA design og eksempler Adressering
Typer af CPUer Mikrokontrollere billige, kontrol af ydre enheder Mobile CPUer lavt strømforbrug Desktop CPUer høj performance Med forskellige brugsmønstre og markedsforhold kommer forskellige krav til CPUernes arkitekturer
Intel Core i7 Har sin egen forelæsning, så her kigger vi kún på de overordnede aspekter Intel (verdens største CPU-fabrikant) 8086 (1978), 8088 (1978) 80286 (1982) 80386 (1985), 80486 (1989) Pentium (1993), Pentium Pro (1995), Pentium II-III (1997), Pentium 4 (2000) Pentium M (2003) Core 2 (2006), Core i3/i5/i7 (2008), Atom (2008) Sandy Bridge/Ivy Bridge (2011) Haswell (2013) Herudover diverse varianter rettet mod servere og bærbare, og mange x86 kompatible CPUer fra (især) AMD, samt Cyrix, VIA, Transmeta og NEC
x86 s udvikling 8086 var til dels baseret på Intel 8080, der igen var baseret på 4004, den første CPU 8086 (8088) blev en massiv succes (IBM PC og MS-DOS), hvilket medførte, at bagudkompabilitet blev en afgørende parameter for alle fremtidige designvalg for Intel CPUer firmaet har flere gange prøvet, uden held, at introducere nye designs, der brød med fortidens synder seneste forsøg er Itanium (omtalt i SCO 5.8), der er endt som en nicheprocessor med meget uvis fremtid ( Itanic ) Apple er stort set det eneste eksempel på et firma, der TO gange har skiftet processorarkitektur med medfølgende tab af bagudkompabilitet Motorola 68XXX IBM PowerPC Intel IA-32
Pentium 4 Egenskaber mål: højtydende processor til personlige computere dyb pipeline (>20 trin) og høj klokfrekvens (introduceret med 1.3 Ghz; sluttede ved 3.8 Ghz) højt strømforbrug stort behov for køling relativ dyr Pentium 4 var ved lanceringen langsommere end Pentium III først da klokfrekvensen kom op i senere modeller, kunne ambitionerne opfyldes Arkitekturen kunne i længden ikke opfylde forventningerne (herunder forventede max klokfrekvens på 10 Ghz), og blev erstattet af Pentium M (og senere Core)
Intel Core i7 Intel opdeler deres Core linje i i3, i5, i7 og Xeon i7 er en processor rettet mod høj performance den i bogen omtalte processor er af Sandy Bridge E generationen 6 cores, 3,3 GHz, 15 MB cache, 64-bit 16 trins pipeline (tror man) Max. 130 watt (men kan skrue ned) 2,3 milliarder transistorer Extreme (angiveligt)
Dyb pipelining Fordele ved dybe pipelines Jo dybere pipeline, des flere instruktioner kan være i pipelinen, des højere antallet af udførte instruktioner per tid Da en dyb pipeline består af små (hurtigt udførte) skridt, kan klokfrekvensen skrues op Ulemper Ovenstående antager, at vi hele tiden kan holde pipelinen fyldt med instruktioner under udførsel Dette er langt fra tilfældet, f.eks. tager hukommelsesadgang kolossal lang tid i forhold til CPUen, og så løber pipelinen tør Hvis pipelinen ikke kan holdes fyldt, forsvinder hastighedsfordelene Klokfrekvensen skal typisk tilsvarende højere op for at matche andre CPUer med kortere pipelines i hastighed Blandt p.gr.a. pipelining er det meningsløst at sammenligne klokfrekvens på tværs af CPU-arkitekturer, for udført arbejde per taktslag er helt forskelligt
Core registre Skønt Core tilsyneladende har en del registre, er det kun de fire øverste (E(A-D)X), der kan bruges generelt, og selv de har specielle egenskaber (herunder indeholdte 8- og 16-bit registre (A-D og (A-D)X) ESI-ESP bruges til pointere CS-GS er fortidslevn til segmenteret hukommelse EIP er Program Counter (PC fra IJVM) EFLAGS indeholder CPUens status (herunder bits til brug for conditional branches)
ARMs historie Den oprindelige ARM1 processor blev designet i 1985 af fire ingeniører en til instruktionssættet, en til mikroarkitekturen, to til udvikling af understøttende chipsæt. Det tog 14 måneder Oprindeligt en del af det britiske Acorn, men blev et selvstændig firma i 1990 med Acorn, Apple og VLSI som investorer Apple anvendte en ARM CPU i deres Apple Newton Messagepad Har siden udviklet på ARM designet med stor succes 2300 ansatte, hovedkvarter i Cambridge, U.K. næsten total dominans på mobil og tabletmarkedet. Også meget udbredt på mindre enheder Designer chips, men overlader fabrikationen til deres licenstagere ARMs kunder har solgt mere end 34,8 milliarder ARM processorer (!!!)
ARM processorens udvikling Arkitektur Bitbredde Cores designet af ARM Holdings Cores designet af tredjepart ARMv1 32/26 ARM1 ARMv2 32/26 ARM2, ARM3 Amber ARMv3 32 ARM6, ARM7 ARMv4 32 ARM8 StrongARM, FA526 ARMv4T 32 ARM7TDMI, ARM9TDMI ARMv5 32 ARM7EJ, ARM9E, ARM10E XScale, FA626TE, Feroceon, PJ1/Mohawk ARMv6 32 ARM11 ARMv6-M 32 ARM Cortex-M0, ARM Cortex-M0+, ARM Cortex-M1 ARMv7-M 32 ARM Cortex-M3 ARMv7E-M 32 ARM Cortex-M4 ARMv7-R 32 ARM Cortex-R4, ARM Cortex-R5, ARM Cortex-R7 ARMv7-A 32 ARM Cortex-A5, ARM Cortex-A7, ARM Cortex-A8, ARM Cortex-A9, ARM Cortex-A12, ARM Cortex-A15 Krait, Scorpion, PJ4/Sheeva, Apple A6/A6X (Swift) ARMv8-A 64/32 ARM Cortex-A53, ARM Cortex-A57[22] X-Gene, Denver, Apple A7 (Cyclone) ARMv8-R 32 Endnu ikke annonceret
ARM specialitet: big.little De fleste processorer er i dag multi-core Hvis man har arbejde til dem alle, kan det gå stærkt Hvis ikke, spilder man strøm sluk for ikke anvendte cores Hvis man har en lille og svag, men strømbesparende, core, og en stor og stærk, men strømslugende, core i stedet for to ens cores, kan man spare mere strøm, når der ikke er meget at lave
ARM registre Mere ensartet og flad registerstruktur end hos Intel Tilsyneladende helt homogent, men konventioner dikterer anvendelsen af en række registre Bemærk: R12-R15 reserverede
Programmering på en ARM processor Hukommelsen tilgås gennem eksplicitte load og store instruktioner, der henter og bringer mellem hukommelsen og registrene Når der skal regnes på noget, foregår det altid i registrene Når man er færdig, gemmer man eksplicit i hukommelsen med store (i modsætning til sædvanlige (CISC) processorer, hvor hukommelsesoperationer ofte kan være implicitte, og bliver håndteret af processoren) et eksempel på, hvordan simple instruktioner kan medføre (lidt) mere arbejde for programmøren De enkelte instruktioner på ARM kan typisk udføres meget hurtigt ofte direkte af logiske kredsløb end igennem afvikling af et mikroprogram
OMAP4430 Produceret på licens af Texas Instruments Dual-core ARM Cortex-A9, ARM v7 ISA 1,2 GHz Indbygget GPU, accellereret video dekodning, SIMD 32-bit 0,6 watt Findes bl.a. i Kindle Fire og Google Glass
ATMEL ATmega168 AVR En microcontroller en CPU beregnet til indlejrede systemer styring af clockradioer, komfurer, USB-sticks, Arduino De to vigtigste designparametre for indlejrede CPUer: BILLIG, helst MEGET billig kraftfuld nok til at udføre den nødvendige opgave, men heller ikke mere (for ellers har den været for dyr) En 8-bit RISC processor Udviklet af Alf-Egil Bogen og Vegard Wollan, studerende på NTH i 1996
ATMEL ATmega168 AVR ATmega168 er et eksempel på SoC (System on a Chip) CPU, RAM, ROM, I/O, timere på den samme chip simpelt at integrere for designerne ATmega168 karakteristika 8-bit processor, op til 20 Mhz 16 kib flash RAM til program og 1 kib RAM til data Programhukommelsen opdelt i to bootloader: kan skrives én gang programhukommelse: kan skrives til af bootloaderen mulighed for signeret programkode sikrer, at softwaren ikke kan overskrives af tredjepart
ATmega168 AVR: Registre og hukommelse De nederste 32 bytes i hukommelsen er registre R0-31 De næste 64 bytes bruges til I/O De øvrige 928 bytes kan man bare bruge løs af SREG bruges til statusflag SP er delt over to bytes for at kunne adressere 1024 bytes
Design af et ISA Generelle overvejelser Introduktion til Intel Core i7, OMAP4430 og AVR ATMega Datatyper ISA design og eksempler Adressering
Datatyper Valget af datatyper, som en CPU understøtter fra designerens hånd, varierer helt efter hvad skal den bruges til? er der noget, som vi kan understøtte bedre ved direkte hardwareunderstøttelse, og er dét tilstrækkeligt vigtigt? hvad hænger vi på fra fortiden? Det typiske primitiv er heltal, med og uden fortegn, i forskellig længder Samt floating point tal (som vi ikke kommer ind på hér) Det er i høj grad et spørgsmål om, hvad vi ønsker at understøtte i hardware, og hvad vi overlader til programmøren/operativsystemet hvis vi bare har 8-bits heltal (bytes), kan vi klare resten i software
Numeriske datatyper på en Core i7 Type 8 bits 16 bits 32 bits 64 bits Signed Integer Unsigned integer Binary coded decimal integer Typiske integer typer for en 64-bits maskine Floating point BCD bruges hovedsageligt i financielle systemer (4 bits (en nibble) bruges til at repræsentere ét decimaltal) ikke så pladseffektivt som binære tal, men matcher præcist på decimaltal, hvor binære repræsentation af floating point tal kan være problematiske med hensyn til afrundingsfejl o.lign.
Numeriske datatyper på en OMAP4430 Type 8 bits 16 bits 32 bits 64 bits Signed Integer Unsigned integer Binary coded decimal integer Floating point Skønt ARMv7 er en 32-bit ISA, er den veludstyret med load og store instruktioner til at kunne hente 8- og 16-bitsværdier til og fra registre
Numeriske datatyper på en ATmega168 Type 8 bits 16 bits 32 bits 64 bits Signed Integer Unsigned integer Binary coded decimal integer Floating point Hér har vi skåret ind til benet. Det absolut nødvendige og intet mere 16 bit er hovedsageligt til hukommelsesadresser
Design af et ISA Generelle overvejelser Introduktion til Intel Core i7, OMAP4430 og AVR ATMega Datatyper ISA design og eksempler Adressering
Valget af en ISA enkodning Når man har valgt sin arbejdsområde for sin CPU, de grundlæggende karakteristika (f.eks. registerbredde og hukommelsens organisering) og de nødvendige instruktioner til understøttelse heraf, melder spørgsmålet sig hvordan repræsenteres de nødvendige instruktioner mest effektivt i bitmønstre? Dette er på ingen måde simpelt
Ønsker til et ISA Jo kortere instruktioner, des bedre mere pladseffektivt, flere instruktioner kan hentes over tid, bedre udnyttelse af kodecache, bedre performance Jo mere ensartede instruktioner, des bedre det gør det enkelt og dermed hurtigt at afkode dem, altså bedre performance Der skal være plads til udvidelser til senere generationer af CPUen vi kan på ingen måde forudsige nu, hvad behovet måske er om 10 år Man skal kunne adressere tilstrækkelig hukommelse med passende opløsning hvad er den mindst adressérbare enhed i hukommelsen? En byte, et 4 bytes word, 8 bytes, 16? Hvilke forfærdelige valg gjorde vores forgængere? disse fortidsvalg er uomgængelige, hvis man vil være bagudkompatibel
Typiske instruktionsformater Fire typiske instruktionsformater: jo længere adresse, des højere opløsning (a) Ingen adresse angivet (b) En adresse angivet! (c) To adresser angivet (d) Tre adresser angivet
Længden af instruktioner Man kan vælge instruktioner af forskellig, men ensartet længde eller tillade blandede længder Ensartede længde er hurtige at afkode, men kan spilde plads ARM er speciel ved at have 32-bits instruktioner OG et 16-bits Thumb instruktionsæt, der ganske vist er reduceret, men fylder det halve
Udvidbare opcodes (16-bit eksempel) En instruktion med 4-bit opcode og tre 4-bit adressefelter velegnet f.eks. til at angive tre registre ud af maksimalt 16 Hvor mange typer instruktioner kan der maksimalt være af denne type? absolut ikke flere end 16, for vi har 4 bits til angive opcode med men hvis vi bruger 16 opcodes, har vi afskåret os fra andre muligheder
Udvidbare opcodes (16-bit eksempel) Hvis man pakker det effektivt, kan man have 15 tre-adresser, 14 to-adresser, 31 en-adresse og 16 adresseløse instruktioner i 16-bit
Core i7 s instruktionsformat! Historisk betinget instruktionssæt har betydet, at afkodning af x86 instruktioner er kompliceret med masser af special tilfælder Instruktioner varierer i længde fra 1 op til 17 bytes
OMAP4430 s instruktionsformat 32 bit ISA vist her Meget tæt pakket kompleks decode
Brug af conditionals i ARM ISA 32 bits instruktionerne bruger 4 bits til cond hvorfor dét? Conditionals afhænger af statusbits, og den tilhørende instruktion udføres kún, hvis conditions er opfyldte Kan skabe super kompakt og hurtig kode: loop: CMP Rx, Ry ; set condition "NE" if (x!= y), ; "GT" if (x > y), ; or "LT" if (x < y) SUBLT Ry, Ry, Rx ; if "LT" (Less Than), y = y-x; SUBGT Rx, Rx, Ry ; if "GT" (Greater Than), x = x-y; BNE loop ; if "NE" (Not Equal), then loop ARM IJVM // { while: // while iload x iload y if_icmpeq end_while // (x!=y) { iload x // if iload y isub // stack=x-y, x-y<0 (x<y) iflt then goto else then: // then iload y iload x isub istore y // y=y-x; goto end_if else: // else iload x iload y isub istore x // x=x-y; end_if: goto while end_while: // }
ATmega168 s instruktionsformat Simpelt og kompakt: 2 til 4 bytes lange instruktioner
Design af et ISA Generelle overvejelser Introduktion til Intel Core i7, OMAP4430 og AVR ATMega Datatyper ISA design og eksempler Adressering
Adressering CPUens instruktioner har behov for at kunne referere/adressere data og lokationer i hukommelsen og i registrene (også kendt som operander) Hvordan gør man dét? fleksibelt? kompakt? effektivt? Følgende er eksempler på adresseringsformer det er langtfra afgjort, at en processor understøtter dem alle
Immediate addressing OPCODE OPERAND Operanden er en del af instruktionen bipush 42 Det sætter selvfølgeligt sine begrænsninger på operandens størrelse i IJVMs tilfælde med bipush er vi begrænset til en byte Effektivt vi har vores operand med det samme (immediately!) Begrænset det skal være hardcodet fra begyndelsen
Register addressing Operanderne ligger i registre add R1, R2 // R1 = R1 + R2 add R1, R2, R3 // R1 = R2 + R3 OPCODE REGISTER REGISTER OPCODE REGISTER REGISTER REGISTER Kræver, at vi har vores data liggende i registre Effektivt registre er den hurtigste form for hukommelse Kompakt vil ofte kunne enkodes i en (relativ) kort instruktion
Direct addressing OPCODE REGISTER ADDRESS Operand ligger på en absolut adresse i hukommelsen add R1, 1069 // R1 = R1 + m[1069] Meget ufleksibelt kræver, at vi ved præcist hvor i hukommelsen vores data ligger, når vi skriver programmet Dvs. måske velegnet til konstanter og globale variable, men ikke til adressering relativt til f.eks. stakken Fint nok til processorer som ATmega168, men uholdbart til multitasking
Register indirect addressing OPCODE REGISTER REGISTER Operand ligger på en absolut adresse i hukommelsen udpeget af et register add R1, (R2) // R1 = R1 + m[r2] Mere fleksibelt, nu kan vi beregne adressen på operanden
Register indexed addressing Operand udpeges af et register og et offset add R1, 4(R2) // R1 = R1 + m[r2 + 4] Fleksibelt og effektivt OPCODE REGISTER REGISTER OFFSET OPCODE OFFSET Bruges f.eks. implicit i IJVM, når vi bruger iload og istore (indekseret relativt til LV) goto og branching i IJVM foregår også indekseret relativt til PC
Based-indexed addressing OPCODE REGISTER REGISTER OFFSET OPCODE REGISTER REGISTER Operand udpeges af summen af to registre (og måske et offset) add R1, (R2+R3) // R1 = R1 + m[r2 + R3] Effektivt og særdeles fleksibelt
Core i7, OMAP4430 ARMv7 og ATmega168 AVR Adresseringsform Core i7 OMAP4430 ATmega168 Immediate Direct Register Register indirect Indexed Based-indexed
Opsummering ISA design er et spørgsmål om kompromiser og historie Hvad skal maskinen kunne? Hvor meget må den koste? Er hastighed den vigtigste parameter, eller hvad med kompakthed? Hvilke valg er der truffet i fortiden? Hvordan undgår vi at vanskeliggøre fremtidige valg?