design af et isa - users-cs.au.dk af et isa.pdfarkitektur til arkitektur, hvilke adresser der kan...
TRANSCRIPT
Design af et ISANiels Olof Bouvin
Institut for Datalogi Aarhus Universitet
Level 2: Maskinniveau (ISA)Problem-oriented language levelLevel 5
Assembly language levelLevel 4
Level 3 Operating system machine level
Level 2 Instruction set architecture level
Level 1 Micro-architecture level
Level 0 Digital logic level
Translation (compiler)
Translation (assembler)
Partial interpretation (operating system)
Interpretation (microprogram) or direct execution
Hardware
Hvad karakteriserer en processor?
ISA niveauet og von Neumann-maskiner maskininstruktioner og instruktionsformater symbolsk og absolut maskinkode registre og hukommelse
IJVM PC, SP, LV, CPP method area, constant pool, stakken metodekald, stakafsnit, parametre og lokale variabler
Central Processing Unit (CPU)
Control Unit
Arithmetic Logic Unit (ALU)
Registers
MainMemory Disk Printer
Bus
Input/Output devices
Method Area
8 bit
Local Variable Frame 1
32 bit
Local Variable Frame 2
Local Variable Frame 3
Current Operand Stack 3
ConstantPool
32 bit
CPP
LV
SP
PC
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. RISCFø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
!
!
!
Hvis man vælger at adressere i større ord, kan man altså håndtere mere hukommelse
på bekostning af granularitet
Bitbredde 8-bit ord 16-bit ord 32-bit ord 64-bit ord8 256 bytes 512 bytes 1 KiB 2 KiB
16 64 KiB 128 KiB 256 KiB 512 KiB32 4 GiB 8 GiB 16 GiB 32 GiB64 17.179.869.184 GiB 34.359.738.368 GiB 68.719.476.736 GiB 137.438.953.472 GiB
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 i7Har 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 registreSkø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 udviklingArkitektur Bitbredde Cores designet af ARM Holdings Cores designet af tredjepart
ARMv1 32/26 ARM1ARMv2 32/26 ARM2, ARM3 AmberARMv3 32 ARM6, ARM7ARMv4 32 ARM8 StrongARM, FA526
ARMv4T 32 ARM7TDMI, ARM9TDMIARMv5 32 ARM7EJ, ARM9E, ARM10E XScale, FA626TE, Feroceon, PJ1/MohawkARMv6 32 ARM11
ARMv6-M 32 ARM Cortex-M0, ARM Cortex-M0+, ARM Cortex-M1ARMv7-M 32 ARM Cortex-M3
ARMv7E-M 32 ARM Cortex-M4ARMv7-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.LITTLEDe 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
Typiske integer typer for en 64-bits maskine
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.
Type 8 bits 16 bits 32 bits 64 bits
Signed Integer ✔ ✔ ✔ ✔
Unsigned integer ✔ ✔ ✔ ✔
Binary coded decimal integer ✔
Floating point ✔ ✔
Numeriske datatyper på en OMAP4430
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
Type 8 bits 16 bits 32 bits 64 bits
Signed Integer ✔ ✔ ✔
Unsigned integer ✔ ✔ ✔
Binary coded decimal integer
Floating point ✔ ✔
Numeriske datatyper på en ATmega168
Hér har vi skåret ind til benet. Det absolut nødvendige og intet mere 16 bit er hovedsageligt til hukommelsesadresser
Type 8 bits 16 bits 32 bits 64 bits
Signed Integer ✔
Unsigned integer ✔ ✔
Binary coded decimal integer
Floating point
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 ISAJo 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 ISA32 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:
// { 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: // }
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
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
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
OPCODE OPERAND
Register addressing
Operanderne ligger i registre add R1, R2 // R1 = R1 + R2 add R1, R2, R3 // R1 = R2 + R3
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
OPCODE REGISTER REGISTER
OPCODE REGISTER REGISTER REGISTER
Direct addressing
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
OPCODE REGISTER ADDRESS
Register indirect addressing
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
OPCODE REGISTER REGISTER
Operand udpeges af et register og et offset add R1, 4(R2) // R1 = R1 + m[R2 + 4]
Fleksibelt og effektivt
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
OPCODE REGISTER REGISTER OFFSET
Register indexed addressing
OPCODE OFFSET
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
OPCODE REGISTER REGISTER OFFSET
Based-indexed addressing
OPCODE REGISTER REGISTER
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?