290 likes | 443 Views
Instructie set: principes. classificatie van instructie sets. classificatie gebaseerd op type intern geheugen op CPU zie fig. 2.1 stapel-architectuur (impliciete operanden) accumulator-architectuur (één operand is impliciet) register-architectuur (expliciete operanden)
E N D
classificatie van instructie sets • classificatie gebaseerd op type intern geheugen op CPUzie fig. 2.1 • stapel-architectuur (impliciete operanden) • accumulator-architectuur (één operand is impliciet) • register-architectuur (expliciete operanden) • register-geheugen-architectuur • register-register-architectuur • geheugen-geheugen-architectuur • verdere verdeling van register-architectuur (fig. 2.2) • aantal operanden die uit het geheugen mogen komen • 2 of 3 operanden voor een ALU operatie • voor en nadelen van deze varianten: fig. 2.3
classificatie van instructie sets • voordelen van registers • gemakkelijker te gebruiken voor compiler dan stapel of accumulator • efficiënter dan stapel of accumulator voor lange expressies • registers kunnen variabelen bevatten • minder verkeer met geheugen • vermindert de geheugen-bottleneck • sneller • compactere code • geen echte lange instructies • vermindert de geheugen-bottleneck
classificatie van instructie sets • aantal registers • nodig voor evaluatie van expressies, doorgeven van parameters, bijhouden van variabelen • voor compiler: liefst allemaal algemeen bruikbaar • indien teveel: veel werk bij saven bij procedure oproepen
geheugen adressering • little endian ; big endian (2143 ; 1234) • bytes, half-woorden, woorden, dubbel-woorden • aligneren • adresseringsmodes • fig. 2.5 geeft een mooi overzicht • meest gebruikte: immediate, displacement, register indirect • keuze van adressingsmodes beïnvloeden: • aantal instructies in een programma (IC) • complexiteit van de processor • gemiddelde duur van een instructie (CPI)
geheugen adressering (vervolg) • adresseringsmodes (vervolg) • fig. 2.6-2.9 tonen statistieken van gebruik van deze adresseringsmodes • fig 2.6: immediate, displacement, register deferred of indirect stellen 75% tot 99% van de adresseringsmodes voor • displacement: de grootte die aangeboden wordt beïnvloedt direct de instructielengte (fig 2.7) • immediate: • aangeboden in welke operaties ? (fig. 2.8) • de grootte die aangeboden wordt beïnvloedt direct de instructielengte (fig 2.9)
operaties • verschillende categorieën: zie fig. 2.10 • nieuwe categorie: multimedia instructies • enkele eenvoudige instructies maken vaak een heel groot deel uit van de gebruikte instructies • bv intel : 10 instructies worden 96% van de tijd gebruikt (zie fig. 2.11) • instructies voor control flow • voorwaardelijke sprongen • sprongen • procedure-oproepen • procedure-terugkomst • fig 2.12 toont hun relatief gebruik
operaties (vervolg) • adres specifiëren • relatief aan de programma teller (PC) is meest gebruikte • gebruikt weinig bits • is onafhankelijk van plaats van code • moet gekend zijn op moment van compilatie • maakt de code adres-onafhankelijk • sprongafstand beïnvloedt weer instructielengte (fig. 2.13) • dynamisch adres: meestal register indirect jump • terugkeer van procedure • case bevelen • dynamisch gedeelde bibliotheken • virtuele functies in OO-talen
operaties (vervolg) • 3 belangrijke technieken voor het specifiëren van spronginstructie (fig. 2.14) • met behulp van conditiecode • met behulp van een conditieregister • compare and branch instructie • fig 2.15 toont de frequentie van het gebruik van verschillende soorten testen bij voorwaardelijke sprongen • twee belangrijke methoden voor het saven van registers • caller saving • callee saving • soms gebruikt de compiler een combinatie van de twee
type en grootte van de operanden • twee alternatieven om types te specifiëren • in de opcode van de instructie • als een veld bij de operand (bv symbolics machine), zie museums • floating point: IEEE standard 754 • heel soms nog 4-bit-binary coded decimal • voorlopig is een woord nog typisch 32 bit • in de toekomst zal dat 64 bit worden
codering van instructie set • codering bepaalt • grootte van het gecompileerde programma • implementatie van de CPU • elementen met invloed op grootte van instructie • aantal registers • aantal adresseringsmodes • fig 2.17: drie klassieke keuzen voor encodering • handige lengtes • zeker een veelvoud van bytes • liefst een veelvoud van woorden • vaste lengte: geeft eenvoudigere implementatie maar grotere programma’s
de rol van compilers • vroeger: architectuurbeslissingen moesten het programmeren in assembler gemakkelijk maken • nu: architectuurbeslissingen moeten het werk van de compiler vergemakkelijken • de structuur van een moderne compiler (fig. 2.18) • bestaat uit meerdere passen • vermindert de complexiteit van compilers • geeft soms problemen: sommige hoog-niveau optimisaties moeten gebeuren voordat bepaalde details gekend zijn • bevat taal-onafhankelijke delen die gedeeld kunnen worden door meerdere talen
de rol van compilers (vervolg) • doelstellingen van compilers • correcte code • snelheid van gecompileerde code • snelle compilatie • ondersteuning voor debugging • code van meerdere talen samen gebruiken
de rol van compilers (vervolg) • classificatie van optimisaties (zie fig. 2.19) • hoog-niveau optimisaties: op source code niveau • lokale optimisaties: in stukken code zonder sprongen (basic block) • globale optimisaties: in stukken code over sprongen heen • toekenning van registers: gebruikt een algoritme van grafen kleuren dat goed werkt vanaf 16 registers • machine-afhankelijke optimisaties: maken gebruik van kennis van de architectuur • fig 2.20: vb van effect van optimisaties
de rol van compilers (vervolg) • allocatie van variabelen en hun impact (1) • stapel: • gebruikt voor lokale variabelen • deze worden relatief van stapelwijzer geadresseerd • deze zijn meestal enkelvoudig: geschikt voor register behalve indien een pointer er naar kan wijzen • stapel wordt niet gebruikt om uitdrukkingen te evalueren • globale gegevens-ruimte: • vaak complexere gegevensstructuren en bereikbaar via pointers • niet geschikt voor registers
de rol van compilers (vervolg) • allocatie van variabelen en hun impact (2) • heap: • vaak complexere gegevensstructuren en bereikbaar via pointers • niet geschikt voor registers
de rol van compilers (vervolg) • basisprincipe van compilerconstructie • maak het veelvoorkomend geval snel • maak het zeldzame geval correct • goede architectuur voor een compiler • is regelmatig • weinig uitzonderingen, voorziet alle gevallen • orthogonaal (bv operaties en adresseringsmodes) • biedt primitieven, geen zogenaamde oplossingen (RISC vs CISC) • laat geen moeilijke keuzen tussen alternatieven • wat gekend is bij compilatie moet als constante kunnen opgenomen worden
fouten en valstrikken • fout: er bestaat zoiets als een typisch programma • fig. 2.31: vb van de grootte van gegevens gebruikt in4 programma’s van SPEC92 • fout: een architectuur met fouten kan niet succesvol zijn • vb: de Intel 80x86 • ondersteunt segmentatie en niet paginatie, heeft een accumulator en niet algemene registers, gebruikt een stapel voor FP-data, ... • fout: je kunt een foutloze architectuur ontwerpen • wat een goede architecturale beslissing lijkt vandaag zal binnen een paar jaar als een architecturale fout aanzien worden
fouten en valstrikken (vervolg) • valstrik: CISC aanpak (Complex Instruction Set Computer) • doel: verkleinen van de semantic gap (= afstand tussen semantische waarde van assembler-instr. en hogere programmeertaal-instructies) • grote stijging van kost software in jaren 70 (software crisis) • meer gebruik van hogere programmeertaal • hoe: ontwerp van complexe instructies om hogere programmeertalen te ondersteunen • complexe instructies werden uitgevoerd door microprogrammatie
fouten en valstrikken (vervolg) • CISC aanpak mislukte omdat • moeilijk om instructies te ontwerpen goed voor alle HLL • instructies doen vaak meer dan nodig • instructies slechts gebruikt in beperkte context (semantic clash) • CISC compilers gebruiken uiteindelijk vaak vooral de meer eenvoudige instructies (dus het zogenaamde voordeel van de complexe instructies wordt niet gebruikt) • complexe instructies compliceren de controle eenheid op de CPU, en dit resulteert in tragere simpele instructies
karakteristieken van RISC architecturen 1 klein aantal instructies (nog steeds waar ???) • kleinere opcodes • gemakkelijker te decoderen 2 klein aantal adresseringsmodes • doe complexe adressering in software • dit vergemakkelijkt de instructie set, het decoderen en de controle-eenheid 3 klein aantal instructie-formaten • vaste lengte, veelvoud van woordlengte, vaste lay-out • instructies mogen niet over pagina’s heengaan • tegelijk decoderen en registers ophalen • eenvoudigere controle-eenheid
karakteristieken van RISC architecturen (vervolg) 4 één machine-instructie per klokcyclus • RISC instructies zijn niet ingewikkelder dan de microinstructies in een CISC-architectuur • vereenvoudigt de pipeline 5 geheugen-adressering enkel via LOAD/STORE instructies • eenvoudigere instructie set
karakteristieken van RISC architecturen (vervolg) 6 CPU heeft een relatief groot aantal registers • meeste operaties zijn register-register • vereenvoudigt de instructie set en de controle-eenheid (vgl: VAX: 25 ADD instructies; RISC I en RISC II: 1 of 2 ADD's) • registers zijn bij RISC het algemeen geval, bij CISC waren ze de uitzondering 7 controle-eenheid volledig in hardware (geen microprogrammatie) 8 gerichte inspanning om HLL te ondersteunen • procedures • lokale variabelen • arrays
voordelen van RISC-filosofie • RISC en VLSI realisatie • relatief weinig instructies, weinig adresseringsmodes, weinig instructie formaten • eenvoudig decoderings- en uitvoerings-subsysteem in hardw (= controle eenheid is kleiner) • RISC I 6% • RISC II 10% • MC68020 68% • CISC >50% (in het algemeen) • meer plaats op de chip vrij voor andere doeleinden (registers, cache, I/O poorten, delen van het hoofdgeheugen) • minder verschillende soorten elementen op de chip maakt de chip gemakkelijker te ontwerpen • attractief om op 1 chip te implementeren
voordelen van RISC-filosofie (vervolg) • RISC en snelheid • eenvoudigere en kleinere controle-eenheid is sneller • kleinere instructie set, weinig adresseringsmodes en instructie-formaten betekent een snellere decodering • een groot aantal registers betekent minder geheugentoegangen • register-register operaties zijn sneller dan operaties met geheugentoegang • veel registers maken het mogelijk om parameters via registers door te geven • gestroomlijnde instructieafhandeling is heel geschikt voor een implementatie met pipeline (zie H3 en H4)
voordelen van RISC-filosofie (vervolg) • RISC en ontwerpkost, betrouwbaarheid • eenvoudige controle-eenheid • algemene ontwerpkosten verlagen • minder kans op ontwerpfouten • gemakkelijk om de fouten te vinden en te verbeteren • kortere tijd om een ontwerp te maken • goedkoper • minder kans dat het product verouderd is als het klaar is • eenvoudiger ontwerp van Virtual Memory Management Unit omdat instructies pagina-grenzen niet overschrijden
voordelen van RISC-filosofie (vervolg) • RISC en ondersteuning voor hogere programmeertalen • compilers zijn gemakkelijker te schrijven • omdat er minder instructies zijn om tussen te kiezen • compilers kunnen af zijn als de machine af is • je kunt beter optimiseren in compilers omdat er meer mogelijkheden zijn om code te herorganiseren • groter aantal registers: mogelijk om hun gebruik te optimiseren
overzicht van RISC architecturen • Appendix C: • Hewlett Packard PA-RISC • IBM en Motorola PowerPC • SGI MIPS • Sun SPARC • DLX: voorbeeld-machine van Patterson en Hennessy • figuur C.1: • overzicht van de belangrijkste kenmerken van de eerste versies van deze architecturen • merk de grote gelijkenis op • figuur C.12 • overzicht van dezelfde kenmerken bij enkele CISC-architecturen
overzicht van RISC architecturen (vervolg) • figuur C.14: toegevoegde kenmerken aan de verschillende architecturen • stamboom van de bestaande RISC-architecturen (fig. C.13) • Patterson (auteur van het boek) is de vader van de Berkeley RISC • Hennessy (auteur van het boek) is de vader van de Stanford MIPS