Les 10: Geheugenhiërarchie Het geheugen is de achillespees van de von Neumanncomputer: zowel instructies als data worden er opgeslagen. Terwijl zowel de grootte van geheugens, als de snelheid van processors, in de laatste decennia zijn verviervoudigd per 3 jaar (een gevolg van de Wet van Moore), neemt de snelheid van geheugens maar met 10% toe per jaar. De afstand tussen processorsnelheid en geheugensnelheid neemt dus sterk toe. De snelheid van het geheugen bepaalt de snelheid van de hele machine. In dit hoofdstuk analyseren wij hoe men de tegenstrijdige eisen die gesteld worden aan het geheugen van een von Neumanncomputer kan verzoenen door gebruik te maken van heel diverse soorten geheugentechnologieën, en door in te spelen op de dynamische eigenschappen van programma-uitvoeringen. Het geheel van technieken wordt de geheugenhiërarchie genoemd Parkinson's laws: "Work expands so as to fill the time available for its completion“ "Expenditure rises to meet income“ “Programs expand to fill all available memory”
Doelstelling Aanbieden van de illusie van een zeer groot, parallel toegankelijk, goedkoop en snel geheugen, opgebouwd uit Kleine snelle geheugens (duur) Grote trage geheugens (goedkoop) Het geheugen dat we nodig hebben in een von Neumanncomputer moet aan vele eisen voldoen: het moet snel zijn, groot, goedkoop en parallel toegankelijk voor meerdere operaties. Geheugens die gelijktijdig aan al deze voorwaarden voldoen op een economisch en technisch realiseerbare wijze, bestaan niet. Men moet diverse types van geheugens samen gebruiken om een gezamenlijke indruk van een groot, snel, en parallel toegankelijk geheugen te creëren. Snelle geheugens zijn typisch zeer duur, en kunnen om economische, maar vaak ook om technische redenen, niet erg groot gemaakt worden. Grote geheugens kunnen wel relatief goedkoop gemaakt worden, als we de snelheidseis laten varen.
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Ingebedde systemen Eindbeschouwingen
Geheugenhiërarchie elektronisch mechanisch Kleiner Sneller duurder registers elektronisch Kleiner Sneller duurder on-chip L1 cache (SRAM) On/off-chip L2/L3 cache (SRAM) hoofdgeheugen (DRAM, ROM) Storage class memory (SCM) Flash, SSD mechanisch Groter Trager goedkoper lokaal secundair geheugen (mechanische schijven) De verschillende types van geheugens kunnen ingedeeld worden in klassen. Bovenaan staan de snelste geheugen (registers) die gegevens kunnen uitwisselen met de ALU aan het tempo van de processorklok. Daaronder bevinden zich één tot drie lagen van snelle cache-geheugens. Daaronder komt het hoofdgeheugen van het computersysteem en de lokale schijven die ook over een netwerk toegankelijk kunnen zijn. Helemaal onderaan bevindt zich de traagste vorm van geheugen, het off- line geheugen of archief. De toegangstijd naar dit geheugen moet ook rekening houden met de tijd nodig om het medium te gaan opzoeken en beschikbaar te stellen. gedistribueerd secundair geheugen (netwerkbestanden, Web servers) Off-line geheugen (tapes,CD,DVD)
Prijsevolutie $/MiB RAM HD De prijs van het geheugen daalt exponentieel. Dit betekent echter niet dat we nu minder uitgeven aan geheugen. De prijsvermindering wordt immers omgezet in een exponentiële toename van de capaciteit voor dezelfde prijs. Dit wordt de wet van Machrone genoemd. Wet van Machrone: prijs geheugen/hard disk voor meest krachtige systemen blijft gelijk
Evolutie in de toegangstijd ns 100000000 10000000 1000000 100000 SCHIJF ‘access time gap’ 10000 DRAM 1000 SRAM SCM 100 De toegangstijd van de schijf en van het hoofdgeheugen is over een periode van 20 jaar met ongeveer een factor 6-10 verbeterd. De processor is in diezelfde periode echter aanzienlijk sneller geworden. Hierdoor lijkt het alsof het geheugen als maar trager wordt (uitgedrukt in aantal klokcycli). Dit noemt men de geheugenbarrière (memory wall). De geheugenbarrière zullen we proberen slopen door het invoegen van verschillende niveaus van cachegeheugens. Verder zien we dat er een grote discrepantie is tussen de toegangstijd naar het secundaire geheugen en naar het hoofdgeheugen. Dit wordt de ‘acccess time gap’ genoemd. We zouden een efficiëntere geheugenhiërarchie kunnen bouwen mochten er in dit gebied ook betaalbare geheugens voorhanden zijn (SCM, Storage Class Memory). De solid state disks (SSD) kunnen hier in de toekomst een belangrijke rol spelen. geheugenbarrière 10 1 1980 1985 1990 1995 2000
Registers Aantal 8 256 Grootte: 2-8 bytes Parallel toegankelijk. Tegelijk lezen en schrijven mogelijk (meerdere lees- en schrijfpoorten). Extreem snel, parallel toegankelijk, zeer duur Tijdens uitvoering moeten alle gegevens in registers zitten (IR, data- en adresregisters) Registers vind je terug in de CVE, in de kern van de processor. Elk register heeft een grootte tussen typisch 2 en 8 bytes, afhankelijk van de woordgrootte van de architectuur. Algemene processors hebben doorgaans tussen 8 en 256 registers. Vaak zijn er afzonderlijke registers voor bepaalde datatypes, zoals integer en vlottende- kommaregisters. Een dergelijke opsplitsing heeft twee voordelen: een register heeft minder adresbits nodig in de instructies, en een kleiner registerbestand kan sneller gemaakt worden. De registers zijn parallel toegankelijk, naargelang de noodzaak. Alle moderne processors kunnen registers gelijktijdig lezen en schrijven. De meeste moderne architecturen werken met een R-R-architectuur, wat betekent dat alle gegevens waarop berekeningen worden gedaan in de processor, eerst naar de registers worden gekopieerd, waarna de berekening volgt, en het resultaat terug in een register geschreven wordt. De karakteristieken van registergeheugens zijn: zeer snel, zeer duur, parallel toegankelijk.
Hoofdgeheugen of RAM: Random Access Memory Twee technologieën: statisch geheugen: gebaseerd op latches. dynamisch geheugen: gebaseerd op een lading in een condensator Het hoofdgeheugen noemt men ook “random access memory” (RAM): elke “bau-cel” (adresseerbare eenheid) is rechtstreeks toegankelijk, en elke cel kan in theorie even snel opgevraagd worden. Er bestaan 2 technologievormen: statisch geheugen opgebouwd uit latches, en dynamische geheugen die de bit opslaan als een lading in een condensator. Doorgaans zijn geheugens niet parallel toegankelijk: men kan slechts 1 leesoperatie of schrijfoperatie per keer uitvoeren in het geheugen. Niet parallel toegankelijk: ofwel lezen ofwel schrijven.
Statische geheugencel: principe D Q CLK Write enable (puls) Chip select Statische geheugens zijn opgebouwd uit latches, bv. zoals in de dia getoond. Ze zijn snel en eenvoudig te gebruiken. Men heeft een selectie- input, een signaal om te schrijven, en een signaal om te lezen. Tenslotte is er ook nog een datalijn die zowel als ingang als als uitgang kan gebruikt worden. De werkelijke fysieke opbouw van de cel kan ook op andere manieren, maar een minimale implementatie vereist 4-6 transistors. Dit maakt de statische geheugens per bit groter dan dynamische geheugens. Men noemt ze “statisch” omdat de inhoud wordt bewaard zolang de schakeling gevoed wordt. Valt de stroom weg, dan zal ook de toestand van de latch vernietigd worden. Werking: de geheugencel zal pas reageren indien het chip select signaal actief is. Bij een actief output enable signaal zal de output van de latch via de tri-state buffer naar buiten gebracht worden. Bij een actief write enable signaal (een puls omdat men met latches werkt) wordt de waarde van de datalijn opgenomen. Uiteraard mogen write enable en output enable nooit simultaan actief zijn (kortsluiting op de datalijn). Output enable Data in/uit
Geheugenarray w s d o decoder bitlijn output enable woordlijn adres Deze dia toont een vier-bit geheugen. Het signalen write enable en output enable worden verdeeld over alle geheugencellen. Enkel die cellen waarvan het chip select signaal actief is, zullen op deze signalen reageren. De chip select signalen worden verdeeld via de zgn. woordlijnen die aangestuurd worden door de adresdecoder die een binair adres omzet naar een groot aantal woordlijnen. Alle geheugencellen die met dezelfde woordlijnen verbonden zijn zullen reageren en hun opdracht vervullen met behulp van de bitlijn (input of output). Bij het lezen kunnen de bitlijnen gemeenschappelijk zijn omdat de geheugencel haar gegevens via een tri-state buffer op de output zet. Indien de adresdecoder ervoor zorgt dat er ten hoogste 1 woordlijn hoog staat, dan zal er per bitlijn ten hoogste 1 geheugencel zijn die een waarde produceert. In dit voorbeeld worden er per adres 2 bits geproduceerd (het zgn geheugenwoord). Vandaar dat men de chip select lijn ook de woordlijn noemt. 2 D[1] D[0] write enable output enable
6T SRAM cell 6 transistors woordllijn bitlijn bitlijn Een traditionele SRAM cell wordt gerealiseerd met de bovenstaande schakeling. Indien elke invertor uit twee transistors bestaat, dan heeft men in totaal 6 transistors nodig. De twee gekopelde invertors hebben twee stabiele toestanden en die kunnen gebruikt worden om één 0 en één 1 op te slaan. De overblijvende transistors worden gebruikt als schakelaars om de informatie al dan niet door te koppelen met de bitlijnen. Indien de bitlijnen aangestuurd worden, dan wordt de cel geschreven, indien ernaar geluisterd wordt, wordt er gelezen. Om te kunnen lezen of schrijven moet de woordlijn actief zijn. Bij het schrijven dringt de bitlijn een waarde op aan de ingang van één invertor, maar dit is tegelijk ook de uitgang van een andere; we hebben hier met andere woorden te maken met een kortsluiting waarbij twee aangedreven signalen rechtstreeks met elkaar in verbinding staan. Dit wordt hier opgelost door de transistor die de bitlijn aanstuurt veel krachtiger te maken dan de transistor die de uitgang van de invertor aanstuurt. De bitlijn heeft met andere woorden altijd het laatste woord, en de invertor zal binnen 1 poortvertraging zijn toestand aanpassen om een eventueel spanningverschil ongedaan te maken. 6 transistors
Transistorschakeling T6 Dit is de voorstelling van de vorige poortschakeling met transistors. Men herkent duidelijk de teruggekoppelde invertors.
Transistorschakeling T4 Door een goede dimensionering van de weerstand R in deze schakeling kan men ervoor zorgen dat de weerstand van M2 kleiner is dan R in geleidende toestand, en groter in niet-geleidende toestand. Op die manier kan men de spanning aan de ingang van de twee transistors laten variëren tussen (voldoende) hoog en (voldoende) laag zodat er een 0 of een 1 gedetecteerd wordt bij het lezen. Het voordeel van deze schakeling is dat ze kleiner is (slechts 4 transistors), het nadeel is dat ze meer stroom verbruikt omdat de weerstanden in alle omstandigheden stroom zullen voeren, zelfs al is de geheugencel in rust.
SRAM Matrix
Geheugenconfiguraties 16 ki x 1 bit 8 ki x 2 bit 4 ki x 4 bit … … … 14 inputs 1 output 13 inputs 2 outputs 12 inputs 4 outputs Geheugens kunnen op verschillende manieren geconfigureerd worden. Het aantal adresseerbare locaties in het geheugen wordt de hoogte van het geheugen genoemd. Het aantal bits dat per geheugenlocatie opgeslagen wordt, wordt de breedte van het geheugen genoemd. Men kan geheugens van een gewenste breedte maken door voldoende chips met een smallere breedte parallel te schakelen (b.v. 8 keer 1 Mi x 1 bit chips om een module van 1 MiB te krijgen, of 2 keer 1 Mi x 4 bit). hoogte x breedte
Dynamische geheugencel woordlijn Schrijven Lezen Een dynamische geheugencel maakt gebruik van een condensator, die een minieme lading kan opslaan. De lading van de condensator bepaalt de bewaarde bitwaarde. De geheugencel wordt “dynamisch” genoemd omdat de lading op de condensator verloren gaat bij het lezen van de cel, maar ook gewoon na een tijdje weglekt uit de condensator. De waarde moet dus herschreven worden na elke leesoperatie, en tevens ook periodiek (refresh). Een condensator is te vergelijken met een lekkende emmer. Men moet de emmer tijdig controleren om te weten of de emmer al dan niet oorspronkelijk vol was en hem bijvullen. Hedendaagse geheugencellen vereisten vele tienduizenden elektronen om op betrouwbare manier de waarde van een bit te kunnen bijhouden. In de toekomst verwacht men geheugencellen die niet meer dan 10 elektronen zullen nodig hebben om een bitwaarde te kunnen bijhouden. Een dynamische geheugencel kan kleiner gemaakt worden dan een statische geheugencel. Condensator verliest lading bij het lezen na 8-64 ms Bitlijn
Dynamisch geheugen byte op adres 010 011 rijdecoder a5 kolomdecoder a0 1 a5 kolomdecoder Bij dynamische RAM’s moet men het adres in twee tijden aanleggen: de helft van de adresbits als rijadres, de andere helft nadien, als kolomadres. Het tijdsverloop tussen deze signalen moet nauwgezet gecontroleerd worden. Na het aanleggen van het adres verloopt het scenario ruwweg als bij statische geheugens. De animatie in de dia toont een mogelijk tijdsverloop: na het doorgeven van het rijadres (010H), wordt de volledige rij uitgelezen en opgeslagen in de rijbuffer. Het lezen van een rij zorgt er ook voor dat de inhoud ervan vernietigd wordt (destructief lezen). Vervolgens zal via het kolomadres (011H) de gewenste byte uit de rijbuffer uitgelezen worden. Tevens wordt de volledige rij teruggeschreven naar de oorspronkelijke locatie om de oorspronkelijke inhoud te herstellen. Het schrijven gebeurt op dezelfde manier: eerst wordt de rij aangepast, en daarna wordt ze teruggeschreven. Dit volledige proces is aanzienlijk complexer dan bij statische geheugens. De toegangstijd naar dynamisch geheugen is dan ook aanzienlijk langer. 1 a0 Nu: 4 Gi x 1 bit
Refresh Geheugen 32 Mib = 225 Rij-adres = 12 bit Kolomadres = 13 bit Eerst rij-adres aanleggen, en dan kolomadres Per 64 ms moeten 4096 rijen gerefresht worden (lezen + schrijven), d.i. 1 rij per 15 s (64 kHz). Een refresh-cyclus duurt 100 ns per rij en tijdens een refresh is de geheugenmodule inactief. De overhead is dus <1% Een geheugenchip van 32 Mib heeft 25 adresbits, die kunnen opgesplitst worden in 12 rijadresbits en 13 kolomadresbits. Het aantal vereiste adresbits wordt dus ongeveer gehalveerd. Voorts moet een DRAM op tijd gerefresht worden - om te vermijden dat de inhoud van het geheugen zou verdwijnen door het weglekken van de lading uit de condensatoren (deze zijn zeer klein 30~40 femtoFarad). Voor een 32MiB geheugen met 4096 rijen, dat om de 64ms moet ververst worden, betekent dit dat per 15,6μs er een rij ververst moet worden. Een refreshcyclus kan enkel gebeuren op een ogenblik dat het geheugen niet aan het werk is en duurt ongeveer 100 ns. De overhead die veroorzaakt wordt door het refreshen is beperkt tot slechts een paar procent. Ondanks deze nadelen is DRAM de meest gebruikte technologie voor hoofdgeheugens. Dit komt door zijn lage prijs en zijn hoge integratiedichtheid.
Kenparameters Latentie: tijd die verstrijkt tussen het aanleggen van een adres en het verschijnen van het eerste byte. Bandbreedte: aantal byte/s dat maximaal kan getransfereerd worden (van opeenvolgende locaties). Effectieve snelheid van het geheugen wordt door deze twee parameters bepaald. Hoe lager in de hiërarchie, des te groter de discrepantie tussen latentie en bandbreedte Latentie of toegangstijd van het geheugen: De tijd die verloopt tussen het aanleggen van een adres samen met een leesopdracht, en het verschijnen van de inhoud van dit woord op de datalijnen. De cyclustijd van een geheugen is de totale tijd van een lees- of schrijfcyclus. Deze kan langer zijn dan de toegangstijd. De bandbreedte van een geheugen is de snelheid (in woorden per seconde) waartegen men informatie kan lezen uit dit geheugen. Voor eenvoudige (statische) geheugens is dit meestal het omgekeerde van de cyclustijd. Sommige geheugens echter halen hogere bandbreedten wanneer men een sequentie van opeenvolgende woorden leest (burst- mode of page mode). Dit betekent dat men slechts éénmaal het adres aanlegt, en men dan achtereenvolgens verschillende gegevens uit het geheugen kan lezen. Zeker bij dynamische geheugens waarbij het aanleggen van het rij- en kolomadres een zekere tijd in beslag neemt, kan men de bandbreedte op die manier aanzienlijk verhogen. Naamate men lager gaat in de geheugenhiërarchie (naar de tragere geheugens toe), wordt het verschil tussen latentie en bandbreedte steeds groter, of anders uitgedrukt wordt de latentie steeds maar groter in vergelijking met wat men uitgaande van de bandbreedte zou mogen verwachten. Bij een schijf met een bandbreedte van 20 MB/s zou men een latentie van 50 ns kunnen verwachten terwijl het in feite in de orde van ms is!
SDRAM klok adres ras cas data rij kol kol Voor synchrone DRAM (SDRAM, dit is het meest voorkomende geheugen van het ogenblik) ziet het timing diagramma er als volgt uit. De signalen worden aangelegd op het tempo van de busklok (bv. 200 MHz). In de bovenstaande figuur worden de signalen gelezen op de stijgende klokflank. In de eerste klokperiode legt men het rijadres aan op de adreslijnen, en signaleert dit aan het geheugen via het RAS signaal (row address strobe). Na bv 2 buscycli staat de gelesecteerde rij klaar in de kolomdecoder en kan het kolomadres aangelegd worden, samen met het CAS signaal (column address strobe). Na nog eens 2 cycli verschijnt dan het eerste woord aan de uitgang van de geheugenmodule (bv 8 bytes of 64 bit). Aangezien meestal aan volledige cachelijn (bv. 32 bytes, zie verder) gelezen wordt, worden de overige 3 woorden automatisch nagestuurd, één per cyclus. In een volgende fase kan er een tweede blok gelezen worden door het aanleggen van een nieuw kolomadres, waarna de cyclus opnieuw start. Als het volgende blok uit een andere rij komt, moet de uitgelezen rij eerst teruggeschreven worden in het geheugen, waarna de ras-cyclus opnieuw kan starten. Ook hiervoor moet gerekend worden op 2-3 buscycli. SDRAM geheugens worden gekarakteriseerd met 3 latenties: bv 2-2-3. Het eerste cijfer is de cas-latentie (hier 2), het tweede cijfer is RAS-to- CAS delay (hier ook 2), en het derde cijfer is de zgn RAS precharge time – dit is de tijd om een uitgelezen rij terug te schrijven en het geheugen klaar te maken voor een nieuwe RAS-cyclus. De geheugentoegangstijd nodig om een willekeurige byte uit het geheugen te lezen zal dus bestaan uit RAS precharge time + RAS-to- CAS delay + CAS latentie. In het voorbeeld van hierboven komt dit overeen met 7 buscycli. Een buscyclus duurt 5 ns (200 MHz). De latentie is dus 35 ns op voorwaarde dat de uit te lezen byte in het eerste woord zit. Het transfereren van een volledig blok neemt 10 cycli in beslag, of 50 ns. De processorklok wordt van deze busklok afgeleid door ze te vermenigvuldigen met een bepaalde factor (bv 8 voor een processorfrequentie van 1,6 GHz). Uitgedrukt in processorcycli moeten alle cycli met 8 vermenigvuldigd worden, d.i. 56 tot 80 processorcycli. data
Geheugentypes Statisch Dynamisch Snelheid 0,2-25 ns 30-120 ns Omvang 6 transistors Transistor + condensator Verbruik Groot Laag Prijs Duur (caches) Goedkoop (hoofgeheugen) Deze dia geeft een vergelijking van statische en dynamische geheugens volgens hun snelheid, oppervlakte, vermogenverbruik en kost. Uit deze karakteristieken volgt dat het snelle statische geheugen zeer geschikt is voor caches, terwijl het in oppervlakte kleinere dynamisch geheugen meer geschikt is als hoofdgeheugen.
Permanente geheugentypes ROM: Read Only Memory, eigenlijk geen geheugen, maar een combinatorisch circuit. PROM: Programmable ROM (1 x) Permanente geheugentypes zijn geheugentypes die hun inhoud niet verliezen als de stroom wordt afgezet. Een gewone ROM hoeft niet opgezet te zijn als geheugen, maar kan geïmplementeerd worden als een combinatorisch circuit, dat voor elke ingang (“adres”) de gewenste waarde geeft (“geheugenwaarde”). Een PROM werkt als een ROM, maar kan één enkele maal geschreven worden in een PROM burner - dit is vooral voor lage volumes een goedkoper alternatief voor de ROM. Een lege PROM bevat enkel maar enen. Door een (te grote) spanning aan te leggen kunnen bepaalde verbindingen doorgebrand worden waardoor ze onherroepelijk vernietigd zijn, en er voortaan een 0 zal uitgelezen worden.
Permanente geheugentypes EPROM: Erasable PROM (n x), wissen met UV licht EEPROM: Electrically Erasable PROM, elektrisch te wissen via speciale pin FLASH: snelle versie van EEPROM Compactflash USB sticks Solid State Disks Bij EPROM’s is het maken en verbreken van een contact niet het gevolg van het doorbranden van een verbinding, maar wel van een effect dat men Fowler-Nordheim tunneling noemt. Het komt erop neer dat door het aanleggen van een hogere spanning sommige elektronen door een oxidelaag geschoten worden en daar als negatieve lading jarenlang gevangen blijven zitten. Doordat deze lading gedetecteerd kan worden kunnen EPROM’s als geheugens gebruikt worden. De gevangen elektronen kunnen verlost worden door ze bloot te stellen aan UV licht. Nadien kan de EPROM opnieuw beschreven worden. Dit gebeurt voor de volledige chip die daarvoor naar een EPROM-wisser moet gebracht worden. Een EEPROM is gelijkaardig aan een EPROM, maar kan elektrisch gewist en herschreven worden. Dit laat toe om de EEPROM tijdens het wissen te laten zitten. Bovendien worden individuele bytes gewist worden hetgeen meer flexibiliteit met zich meebrengt. Anderzijds is het wissen van 1 byte per keer wel zeer traag. Flash geheugens zijn EEPROM’s die niet byte per byte gewist en geschreven worden, maar wel blok per blok. Hierdoor krijgen ze een veel grote bandbreedte en worden ze bruikbaar om grote hoeveelheid gegevens op te slaan. Men vindt ze bijvoorbeeld terug in digitale camera’s, usb-sleutels, …
Flash geheugencel woordlijn Bitlijn Control gate Floating gate Een fash geheugencel bestaat uit één transistor met twee gates: een control gate, die zich gedraagt zoals een gewone ingang van een transistor, en een floating gate die een lading kan bevatten. Als er geen ingangssignaal voor de geheugencel is, dan zal de lading in de floating gate bepalen hoe sterk de transistor geleidt. Door een spanning aan te brengen tussen de control gate en de andere aansluitingen van de transistor kan de floating gate geladen worden of ontladen worden. Door de lading te variëren kan er meer dan 1 bit tegelijk opgeslagen worden. Als men bij het lezen het onderscheid kan maken tussen vier verschillende ladingen, dan kunnen er in principe twee bits in de flashcel opgeslagen worden (MLC of zgn Multi Level Cell). Indien er slechts 2 toestanden zijn (1 bit), dan spreekt men van een SLC (single level cell). Flash geheugen vereist minder plaats op een chip dan SRAM (6 transistors) of DRAM (transistor + condensator). Door 2 bits per cel op te slaan verhoogt de densiteit nog meer, en bovendien is het geheugen permanent. Het enige nadeel is dat het lezen en schrijven van flash trager is dan SRAM of DRAM. Multi Level Cell Bitlijn Single Level Cell
Secundair geheugen Hard disk >100 GB CD-ROM, CD-RW 650 MB DVD-ROM, DVD-RAM 4,7-17 GB Zip-Drive 100-250-750 MB = 95,7-238-714MiB Floppy disk 1,44 MB = 1,38 MiB Jaz drive 2 GB HD-DVD (20 GB) Blu-Ray (27 GB) – in meerdere lagen reeds to 200 GB (één highres film is ongeveer 12 GB) Solid State Drive (SSD) Dit zijn enkele van de meest frequent voorkomende soorten van secundair geheugen, met hun opslagcapaciteit. Vooral de hard disk/ssd is een standaard in zowat elke computer/tablet, maar ook DVD- lezers en -schrijvers komen frequent voor.
Magnetische opslag 8.5 nm partikels 100 nm Dit is een overzicht van de evolutie van opslagdensiteiten voor hard disks, SSDs en tape. 100 nm
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Ingebedde systemen Eindbeschouwingen
Instructiegedrag Buitenlus Frequentie 5.41% Veel programma’s spenderen 90% van hun uitvoeringstijd in 10% van de code 11.26% 23.24% Binnenlus 60.09% Deze grafiek toont het instructiegedrag van een programma. Rechts staat een histogram met daarin het aantal keren dat een instructie uitgevoerd wordt. Het programma bevat een aantal lussen die meerdere keren worden uitgevoerd. Andere delen van de code worden slechts éénmaal uitgevoerd. Een groot deel van de uitvoeringstijd wordt dus besteed in een relatief klein deel van de code. Hetzelfde gedrag geldt voor de gegevens van een programma. Binnenlus adres
Lokaliteit Temporele lokaliteit: sommige geheugenlocaties komen vaak terug in in de adresstroom Spatiale lokaliteit: geheugenlocaties in een adresstroom liggen niet ver uit elkaar (b.v. volgen elkaar op). Wat we constateerden in de vorige dia, over het geheugengedrag, kan men uitdrukken in enkele wetten: de lokaliteit. Temporele lokaliteit: geheugenlocaties komen vaak herhaaldelijk terug in de adresstroom, in een korte tijd. Of anders gezegd: een geheugenlocatie die voorkomt in de adresstroom, komt er wellicht vrij snel opnieuw in voor. Spatiale lokaliteit: geheugenlocaties in een adresstroom liggen niet ver uit elkaar. Of anders gezegd: indien een bepaalde geheugenlocatie voorkomt in de adresstroom, dan komen zijn buren er (niet veel later) wellicht ook in voor. Beide lokaliteitswetten gelden zowel voor de instructie- als de data- adresstroom. Lokaliteit: temporeel Lokaliteit: spatiaal
Adresstroom Instructieadres Tijd Deze grafiek geeft een andere, gedetailleerde voorstelling van de adresstroom van instructieadressen. Op de X-as is de tijd weergegeven, op de Y-as staat het geheugenadres. Er zijn vele voorbeelden van spatiale en temporele lokaliteit te vinden. Enkele voorbeelden zijn aangegeven (blauw of vertikaal: spatiaal; rood of horizontaal: temporeel).
Werkverzameling (working set) Verzameling van alle geheugenlocaties die een programma tijdens een interval t gebruikt. aantal De werkverzameling is de verzameling van geheugenlocaties die een programma tijdens een interval met tijdsduur Δt gebruikt. Op elk tijdstip t tijdens de uitvoering, kunnen we de werkverzameling berekenen als de verzameling van geheugenlocaties die het programma tijdens de periode ]t- Δt, t] heeft gebruikt. In de grafiek is de grootte van deze verzameling uitgezet in de tijd. Als gevolg van de temporele lokaliteit is het zo dat deze verzameling vrij klein blijft. Door vaak dezelfde locaties te hergebruiken, groeit de werkverzameling dus niet tot de volledige omvang van het programma. t
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Werking Indexering Vervangingsstrategie Lees/schrijf strategie Prestatieverbetering Impact op prestatie Ingebedde systemen Eindbeschouwingen Cache keeps intruders away from backcountry supplies
Geheugenbarrière Terwijl zowel de grootte van geheugens, als de snelheid van processors, in de laatste decennia zijn verdubbeld om de 18 maand (een gevolg van de wet van Moore), neemt de snelheid van geheugens maar met 10% toe per jaar (antiwet van Moore). De afstand tussen processorsnelheid en geheugensnelheid neemt dus sterk toe. We spreken hierbij van de geheugenbarrière (memory wall). Men kan de geheugenbarrière minder hoog maken door tussen het hoofdgeheugen en de processor tussengeheugens of caches te plaatsen (tussenliggende lijnen). Deze caches zijn sneller dan het hoofdgeheugen, maar bevatten slechts een gedeelte van de instructies en de gegevens die nodig zijn voor de uitvoering van het programma. Indien de caches voldoende groot zijn om de werkverzameling van een gegeven uitvoering bij te houden, dan zal het programma uitvoeren aan de snelheid van de cache, i.p.v. de snelheid van het hoofdgeheugen. Indien de cache te klein is voor het bijhouden van de werkverzameling, dan zal de snelheid ergens tussen de snelheid van de cache en die van het hoofdgeheugen liggen.
Cachegeheugen Snel geheugen om een deelverzameling van de locaties uit de working set bij te houden. geheugen CVE Cache Om de CVE toe te laten om optimaal gebruik te maken van de snelheid van de cache, wordt de cache vaak geïntegreerd op de processorchip. Op die manier vermijdt men de vertraging die zou ontstaan door de signalen van één chip naar een andere chip te moeten sturen. Verder zal men proberen om de cache zo efficiënt mogelijk te vullen met gegevens uit het hoofdgeheugen door niet byte per byte te transfereren, maar een heel blok van bytes in één keer (b.v. 8 bytes). Een dergelijk blok noemt men vaak een cache-blok. Wanneer de CVE een gegeven uit het geheugen nodig heeft, wordt de vraag eerst doorgegeven aan de cache. Enkel als de waarde daar niet aanwezig is, wordt het geheugen aangesproken, en wordt het benodigde deel van het geheugen naar de cache gekopieerd. 10.6 GB/s
Werking cache hoofdgeheugen cache 00 08 10 18 20 28 30 38 40 48 50 58 60 De animatie in deze dia demonstreert de (gemiddelde) werking van de cache. In het begin is de cache leeg. Een geheugentoegang van de CVE leidt ertoe dat het hoofdgeheugen wordt aangesproken, en een heel blok (in dit geval 8 bytes) wordt gekopieerd naar de cache. Indien later nog geheugenlocaties worden opgevraagd uit hetzelfde blok, dan worden deze waarden uit de cache aangeleverd. Wanneer op zeker moment een waarde wordt opgevraagd die niet in de cache zit, wordt een nieuw blok van het hoofdgeheugen naar de cache getransfereerd. CVE
Indexering Direct-mapped caches Set-associatieve caches Volledig associatieve caches Er bestaan verschillende soorten caches. Elke soort gebruikt een andere strategie om te bepalen waar een bepaald blok uit het hoofdgeheugen kan terechtkomen in de cache. De drie types van caches worden nu geïntroduceerd.
Direct-mapped cache data eerder beschikbaar dan hit/miss-informatie valid dirty tag index offset adres Cache: direct mapped = Bij een direct-mapped cache heeft elk blok uit het geheugen een vaste plaats in de cache, bepaald door de index. Doordat de cache veel kleiner is dan het geheugen (b.v. 8 kiB of plaats om 1024 blokken van 8 bytes in op te slaan), is er bij een geheugen van 80 MiB dus maar plaats voor ongeveer 0,01% van alle geheugenlocaties. Het is slechts dankzij een goede lokaliteit dat een cache met dergelijke kleine afmetingen iets kan uithalen. Doordat er duizenden geheugenblokken op dezelfde plaats in de cache kunnen afgebeeld worden, is het noodzakelijk om bij te houden welk blok er opgeslagen ligt in de cache. Dit gebeurt aan de hand van de tag, dit is het gedeelte van het blokadres dat niet gebruikt werd als index. Naast de tag wordt ook nog de valid bit (de cachelocatie bevat een geldig geheugenblok), en de dirty bit (de huidige inhoud werd veranderd, en is niet dezelfde als de inhoud van het geheugen) bijgehouden. Bij het consulteren van de cache moet dus eerst nagegaan worden of de tag overeenstemt met het gewenste woord, en indien de valid-bit aanstaat, en het woord stemt overeen, dan spreekt men van een treffer (hit) en kan de data gebruikt worden. In het andere geval spreekt men van een misser (miss). data eerder beschikbaar dan hit/miss-informatie treffer data
Direct-mapped cache Bij een direct-mapped cache, wordt elk blok in het hoofdgeheugen (rechts) rechtstreeks afgebeeld op 1 specifieke plaats in de cache (links); typisch worden de laatste (minst beduidende) bits van het blokadres gekozen als index in de cache. Hierdoor worden opeenvolgende blokken uit het geheugen ook op opeenvolgende plaatsen in de cache afgebeeld.
Direct-mapped cache Anders bekeken kan elke plaats in een direct-mapped cache slechts overeenkomen met een bepaald aantal blokken uit het hoofdgeheugen. Per cacheplaats zal met een aantal bits moeten bijgehouden worden over welke blok uit het geheugen het gaat (tag). Hoe meer sets (plaatsen) er in de cache zijn, des te minder tagbits er moeten bijgehouden worden. Voor een cache van N bytes zullen de geheugenlocaties a, a+N, a+2N, a+3N allemaal op dezelfde plaats afgebeeld worden (als gevolg van de gebruikte indexeringsmethode). Een dergelijke regelmaat kan zeer veel cacheconflicten veroorzaken indien er in de programma-uitvoering ook dergelijke regelmatige patronen voorkomen.
4-wegs set-associatief adres = = = = Om te vermijden dat twee gegevens die precies N bytes (cachegrootte) uit elkaar liggen telkens conflicten zouden veroorzaken kan men ervoor zorgen dat er per plaats in de cache niet 1 maar verschillende blokken kunnen opgeslagen worden (2, 3, 4 of meer). Men spreekt dan van een N-wegs set-associatieve cache. De cache bestaat in dit geval uit een aantal sets (of plaatsen) waarin telkens een klein aantal blokken kunnen opgeslagen worden. Deze dia toont een vierwegs set-asssociatieve cache. Deze bestaat in essentie uit vier direct-mapped caches die parallel bevraagd worden. Indien in één van de wegen de gevraagde tag voorkomt, dan wordt de bijhorende data via de multiplexer naar buiten gebracht. Doordat er nu vier blokken op dezelfde plaats in de cache kunnen opgeslagen worden, verkleint de kans op conflicten aanzienlijk. De prijs die ervoor betaald wordt is wel de vertraging die door de extra multiplexer veroorzaakt wordt. In tegenstelling met een direct-mapped cache zal de data hier pas na de hit/miss informatie beschikbaar komen. Het betreft hier een afweging tussen een lagere miss rate en een iets hogere toegangstijd. Merk op dat bij gelijkblijvende grootte van de cache, een verhoging van de associativiteit ook een verlaging van het aantal sets met zich meebrengt. multiplexer Cache: set-associatief
Set-associatieve cache Elke blok in het hoofdgeheugen (rechts) wordt rechtstreeks afgebeeld op 1 specifieke set van plaatsen in de cache (links) – het blok kan vrij geplaatst worden binnen deze set. In het geval dat de volledige set volzet is, zal de vervangingsstrategie bepalen welke plaats binnen de set vrijgemaakt moet worden. Typisch worden de laatste (minst beduidende) bits van het blokadres gekozen als groepsindex in de cache. .
Set-associatieve cache Elke rij (groep van rijen) in de set-associatieve cache (links) kan slechts overeenkomen met een beperkt aantal blokken uit het hoofdgeheugen (rechts). Voor een cache van N bytes zullen de adressen a, a+N/2, a+2N/2, a+3N/2, allemaal in dezelfde set afgebeeld worden.
Volledig associatieve cache Een volledig associatieve cache laat toe dat een blok (rechts) uit het hoofdgeheugen terecht kan op elke willekeurige plaats in de cache (links) - de uiteindelijke positie wordt bepaald door de vervangingsstrategie. Cache: volledig associatief
Volledig associatieve cache Anders bekeken kan elk plaats in een volledig associatieve cache overeenkomen met elke willekeurig blok in het hoofdgeheugen. Per plaats in de cache moet dan ook bijgehouden worden van welk blok uit het geheugen deze afkomstig is. Dit vereist het bijhouden van het blokadres.
Cachetypes #sets associativiteit cachetype N 1 Direct mapped M A A-wegs set-associatief Volledig associatief Grootte = #sets x associativiteit x blokgrootte Direct mapped = tag 2-wegs SA, 4 sets = data De drie basistypes van caches kunnen allemaal gespecificeerd worden door middel van hun aantal sets en de associativiteit binnen de set. Gegeven een bepaalde grootte van een cache zijn er verschillende configuraties mogelijk, elk met hun voordelen en nadelen. De prestatie van een bepaalde configuratie hangt ook sterk af van de uit te voeren toepassing. Zo kan een applicatie met een zeer sterke spatiale lokaliteit prima gediend zijn met een direct-mapped cache terwijl men voor een andere applicatie minstens een associativiteit van 2 of 4 nodig heeft om een aanvaardbare prestatie te krijgen. 4-wegs SA, 2 sets Volledig associatief
Tags tag index offset Direct mapped Set-associatief Volledig Assoc Afhankelijk van de organisatie van de cache zal de grootte van de tag die moet opgenomen worden in de cache variëren. De tag is het grootst voor een volledig associatieve cache en is het kleinst voor een direct-mapped cache. Cache: tags
Vervangingsstrategie Als de set volzet is, dan moet er een blok uit de set verwijderd worden. Keuze LRU: least recently used (langst niet gebruikt geweest) FIFO: first-in first-out (oudste blok) Random: willekeurig blok Opt: blok dat het langst niet gebruikt zal worden Indien een set vol zit, en de CVE doet een oproep voor een geheugenlocatie die niet in de set zit, dan zal het transfereren van een blok uit het hoofdgeheugen naar de set ook betekenen dat een reeds in de set aanwezig blok moet verwijderd worden. De wijze waarop men het te verwijderen blok kiest, wordt bepaald door de vervangingsstrategie. LRU (least recently used): het blok in de set dat het langst ongebruikt is, gaat eruit. Een exacte implementatie is vaak ietwat complex, dus bestaan er ook benaderende methoden. FIFO (first in, first out): het blok in de set dat er het langst geleden werd ingestopt, gaat eruit. Random: een willekeurig gekozen blok wordt verwijderd. De prestatie hiervan is vaak niet veel slechter dan meer geavanceerde technieken. Opt: deze techniek kijkt in de toekomst en verwijdert dat blok dat het langst niet zal gebruikt worden. Uiteraard is dit niet praktisch realiseerbaar (de optimale vervanging kan pas na de programma-uitvoering worden bepaald), maar tijdens onderzoek is het wel nuttig een bepaalde vervangingsstrategie te kunnen vergelijken met de optimale - bij een gegeven cachegrootte en -type. Cache: vervangingsstrategie
Miss rates ifv vervangingsstrategie Associativiteit 2-wegs SA 4-wegs SA grootte LRU RND FIFO 16 kiB 11.41 11.73 11.55 11.17 11.51 11.33 64 kiB 10.34 10.43 10.39 10.24 10.23 10.31 256 kiB 9.22 9.21 9.25 [Data cache, Spec 2000, 64 byte blokken (alpha)] Associativiteit 2-wegs SA 4-wegs SA 8-wegs SA grootte LRU RND 16 KiB 5.18% 5.69% 4.67% 5.29% 4.39% 4.96% 64 KiB 1.88% 2.01% 1.54% 1.66% 1.39% 1.53% 256 KiB 1.15% 1.17% 1.13% 1.12% Deze tabel bevat de miss rates voor een aantal verschillende vervangingsstrategieën. Hieruit blijkt dat de verschillen eigenlijk niet zo heel groot zijn, en dat deze verschillen kleiner worden naarmate de caches groter worden. [instructiecache]
Cache leesstrategie lees 90%-98% data in cache cachetreffer data niet in cache cachemisser stuur door naar CVE Wanneer de CVE een waarde uit het geheugen wil lezen, wordt die dus eerst in de cache gezocht. In moderne computers is de kans op een “cachetreffer” rond de 90%-98%. Wanneer de data niet in de cache gevonden wordt (cache misser), zijn er 2 mogelijke strategieën: Load & forward: het gewenste geheugenblok wordt eerst volledig in de cache geladen, en daarna wordt het gewenste woord naar de CVE gestuurd. Load through: het gewenste woord wordt naar de CVE gestuurd zodra het in de cache is geladen (early restart), en eventueel nog voor het volledige blok is ingeladen. Bovendien kan men de volgorde waarin het blok wordt geladen eventueel manipuleren, zodat het gewenste woord eerst (of sneller) wordt geladen (critical word first). load through load & forward Cache: leesstrategie
Cache schrijfstrategie data in cache cachetreffer data niet in cache cachemisser write through write back write allocate write no allocate Wanneer de CVE een waarde in het geheugen wil overschrijven, kunnen verschillende strategieën gebruikt worden. In geval van een cachetreffer, kan men kiezen tussen write through: de schrijfoperatie wordt parallel uitgevoerd in de cache én in het hoofdgeheugen. Voordeel van deze strategie is dat de inhoud van de caches en van het geheugen steeds consistent zijn. write back: de schrijfoperatie wordt enkel uitgevoerd in de cache. Wanneer het blok uit de cache verwijderd (vervangen) wordt, zal het teruggeschreven worden naar het hoofdgeheugen. Er is dus een tijdelijke inconsistentie tussen het blok in de cache en dat in het hoofdgeheugen. De processor hoeft in dit geval wel niet te wachten op het geheugen. Ingeval van een cache misser, is er keuze tussen: write allocate: leest eerst het blok in in de cache, en past het dan aan. write no-allocate: laat het blok enkel in het hoofdgeheugen zitten, en schrijft rechtstreeks in het hoofdgeheugen. Welke lees- en schrijfstrategie het beste is, alsook welke cache-soort en grootte, is geen eenvoudige vraag. Het antwoord hangt af van de volledige processorarchitectuur en -organisatie, en van de uit te voeren programmamix. cache + geheugen cache geheugen cache (+ geheugen)
Gemiddelde toegangstijd Gemiddelde toegangstijd (AMAT) = Hit Time + (Miss Rate x Miss Penalty) = (Hit Rate x Hit Time) + (Miss Rate x Miss Time) [AMAT: Average Memory Access Time] 3 + 0.02 x 100 = 5 0.98 x 3 + 0.02 x 103 = 5 De gemiddelde toegangstijd naar het geheugen bestaat uit 2 stukken: de tijd nodig om een woord uit de cache te halen (de hit time) vermeerderd met de penalty om dieper in de geheugenhiërarchie te gaan in het geval van een misser. Dit kan op verschillende manieren uitgedrukt worden. Om de gemiddelde toegangstijd naar het geheugen te verbeteren kunnen we inwerken op de drie elementen ervan. Miss rate ↓ Miss penalty ↓ Hit time ↓ AMAT ↓
AMAT = Hit Time + (Miss Rate x Miss Penalty) Cacheparameters Hit Time Miss rate Miss Penalty Grootte ↑ ↑ ↓ - Associativiteit ↑ - ↑ Blokgrootte ↑ ↑ ↓ Splitsing ↑ Niveaus ↑ De relatie tussen de verschillende cacheparameters en de AMAT is complex, en is bovendien afhankelijk van het gedrag van de programma’s die uitgevoerd worden. In de komende dia’s zullen een aantal van de relaties meer in detail besproken worden. We beginnen echter eerst met een bespreking van een classificatie van de missers. AMAT = Hit Time + (Miss Rate x Miss Penalty)
Misserclassificatie: 3C model Compulsory (cold) of koude missers: nodig om een blok de eerste keer in de cache te brengen. INF = oneindig grote cache koude missers = missers(INF) Capaciteitsmissers: cache is te klein om de werkverzameling te bevatten. VA = volledig associatieve cache, LRU vervanging capaciteitsmissers = missers(VA) - missers(INF) Bij onderzoek naar verschillende caches, worden de cachemissers onderverdeeld in 3 categorieën. Koude missers: cachemisser wanneer een locatie voor de allereerste keer tijdens een programma-uitvoering wordt gebruikt. Capaciteitsmissers: de locatie is niet meer in de cache aanwezig omdat deze niet groot genoeg is om de werkverzameling te bevatten. Capaciteitsmissers komen voor in associatieve caches, waar elke vrije plaats kan dienen om om het even welk blok uit het hoofdgeheugen onder te brengen. Cache: koude misser Cache: capaciteitsmisser
Misserclassificatie: 3C model Conflict (collision) missers: het blok had in de cache kunnen zitten maar werd verdrongen door een ander blok. C = te onderzoeken cache met bepaald vervangingsalgoritme Conflictmissers = missers(C) - missers(VA) Conflictmissers: treden op wanneer een blok wordt opgevraagd dat in de cache heeft gezeten, maar er uit verdrongen werd door een ander geheugenblok dat op dezelfde plaats in de cache wordt afgebeeld. Er is dus een conflict om een fysieke plaats in de cache, zonder dat de cache noodzakelijk vol zit. Zulke conflicten komen enkel voor bij direct-mapped en set-associatieve caches. Cache: conflictmisser
Cache grootte ↑ Miss rate ↓ Associativiteit ↑ Miss rate ↓ 0.14 1-wegs 0.12 [Spec 92 Benchmarks] 2-wegs 2:1 regel 0.1 4-wegs 0.08 8-wegs 0.06 capaciteitsmissers Miss Rate 0.04 koude missers 0.02 Het vergroten van de cache heeft zonder meer een sterk positief effect op de miss rate. Ook hier is er echter een limiet aan de nuttige grootte. Vanaf een bepaald ogenblik zal de vertraging van cache (zie verder) het voordeel van een lagere miss rate teniet doen. Verder is het ook duidelijk dat het opvoeren van de associativiteit zorgt voor een lagere miss rate. Als vuistregel mag men stellen dat de miss rate van een direct-mapped cache even hoog is als deze van een tweewegs set-associatieve cache van halve grootte. Deze laatste kan echter wel trager zijn. Men noemt dit de 2:1 regel. Aangezien het vervangen van een blok bij een hoogassociatieve cache meer rekenwerk vraag (het kiezen van een slachtofferblok om te vervangen en het aanpassen van de informatie voor de vervangingstrategie) kan hierdoor de miss penalty licht toenemen. 1 2 4 8 16 32 64 128 [bron: Patterson&Hennessy] Cache size (KiB)
! 3C Relative Miss Rate 100% 1-way Conflictmissers 80% 2-way 4-way 60% Miss Rate per type 40% Capaciteitsmissers 20% ! Koude missers De relatieve miss rates geven een totaal ander beeld. Aangezien de koude missers natuurlijk gelijk blijven, ongeacht de grootte van de cache, zal hun belang uiteraard relatief toenemen naarmate het totale aantal missers daalt. Voor een oneindig grote cache vormen ze 100% van alle missers. 0% 1 2 4 8 16 32 64 128 Cache Size (KiB)
Uitbuiten spatiale lokaliteit = Spatiale lokaliteit kan verder uitgebuit worden door per cacheplaats niet één woord op te slaan, maar een reeks van woorden. Dit heeft voordelen: De kans dat we een opvolgerwoord nodig hebben is groot (spatiale lokaliteit) De cache kan nu meer databits bevatten omdat er in verhouding minder tagbits moeten opgeslagen worden. multiplexer
Blokgrootte ↑ Miss rate ↓↑ Cachegrootte Blok- grootte Miss Pen 4KiB 16KiB 64KiB 256KiB 16 82 8.027 4.231 2.673 1.894 32 84 7.082 3.411 2.134 1.588 64 88 7.160 3.323 1.933 1.449 128 96 8.469 3.659 1.979 1.470 256 112 11.651 4.685 2.288 1.549 Door de blokgrootte te laten toenemen, zakt de miss rate om nadien terug te beginnen stijgen. De reden is eenvoudig: het vergroten van de blokgrootte, zonder de cache te vergroten verkleint het aantal sets in de cache. Hierdoor gaat de miss rate op termijn terug stijgen. Elke cache heeft met andere woorden zijn optimale blokgrootte (voor een gegeven verzameling van programma’s). Bovendien dient hier opgemerkt te worden dat de miss rate niet de gewenste prestatiemaat is. De uiteindelijke prestatiemaat is uitvoeringssnelheid van het programma. Het vergroten van de blokgrootte (maar ook van de cache) kan zeer gunstig zijn voor de miss rate, maar zal de cache wel trager maken. De combinatie van een kleinere miss rate met een tragere cache resulteert niet steeds in een sneller programma.
Cachegrootte ↑ hit time ↑ Associativiteit ↑ hit time ↑ ns 14 12 assoc 1 10 2 8 Hit time 4 6 FA 4 Kleinere caches hebben kortere toegangstijden. De verhouding tussen een direct-mapped cache van 16 kiB (4 cycli) en een 4-wegs set- associatieve cache van 256 kiB is niet minder dan een factor 3! 2 4 8 16 32 64 128 256 KiB
Gesplitste vs. geünificeerde caches Grootte Instructiecache Data cache Geünificeerde cache 1 KiB 3.06% 24.61% 13.34% 2 KiB 2.26% 20.57% 9.78% 4 KiB 1.78% 15.94% 7.24% 8 KiB 1.10% 10.19% 4.57% 16 KiB 0.64% 6.47% 2.87% 32 KiB 0.39% 4.82% 1.99% 64 KiB 0.15% 3.77% 1.35% 128 KiB 0.02% 2.88% 0.95% Deze tabel bevat de miss rates voor de verschillende cachegroottes. Een gesplitste cache van 2 x 16 KiB moet eigenlijk vergeleken worden met een geünificeerde cache van 32 KiB. Zoals uit de tabel volgt zal de missrate voor de geünificeerde cache tussen de missrates voor de gesplitste caches liggen. Doordat de gesplitste caches kleiner zijn dan de geünificeerde cache zal de hit time voor de splitste cache kleiner zijn. De miss rate kan zowel kleiner (instructies) of groter zijn (data) zijn. Een bijkomende voordeel van gesplitste caches is dat de cacheorganisatie (en grootte) voor de instructies en voor de data verschillend kan zijn. Zo hoeft de instructiecache geen voorzieningen te hebben om blokken terug naar het geheugen te schrijven. Moderne processors hebben vaak een gesplitste cache op niveau 1. Dit wordt een Harvard architectuur genoemd verwijzend naar computerarchitecturen die instructies en data op twee verschillende opslagmedia opslaan zoals dit voor de Harvard Mark I het geval was. Daar werden de instructies opgeslagen op papertape en de data zaten in relay geheugens. Harvard architectuur
Voorbeeld Gesplitste cache AMAT = 80% x (1 + 0.64% x 50) + Maak het vaak voorkomende geval snel! [20% data cache; 80% instructiecache; 16 KiB miss penalty = 50 cycli; hit time = 1 cyclus] Gesplitste cache AMAT = 80% x (1 + 0.64% x 50) + 20% x (1 + 6.47% x 50) = 1.903 Geünificeerde cache AMAT = 80% x (1 + 1.99% x 50) + 20% x (2 + 1.99% x 50) = 2.195 Uit de bovenstaande berekening volgt dat de gemiddelde toegangstijd bij een geünificeerde cache toch iets hoger ligt dan bij een gesplitste cache. De reden is dat er heel wat meer toegangen naar de instructiecache zijn dan naar de datacache, en dat de toegangstijd naar de geünificeerde cache minder gunstig is dan de toegangstijd naar de instructiecache. Aangezien er per cyclus één instructie uit de cache gehaald wordt, en aangezien we er hier van uitgaan dat de cache maar 1 poort heeft en dus ook maar 1 gegeven per cyclus kan teruggeven, is er eigenlijk geen ruimte meer voor de datatoegang. We modelleren dit hier door de datatoegang 1 cyclus te vertragen (2 ipv 1). Zelfs indien de cache 2 antwoorden simultaan zou kunnen teruggeven, is de AMAT = 1.995 wat nog steeds trager is dan de gesplitste cache. Extra cyclus: Cache met 1 toegangspoort
Meerniveaucaches processor Cycli: 4 L1 I (32KiB) L1 D (32KiB) Cache: hiërarchie processor Cycli: 4 L1 I (32KiB) L1 D (32KiB) Cycli: 10 L2 cache (256 KiB) Intel Core I7 Moderne processors hebben een aantal cacheniveaus. Indien men beslist om niet alle geheugencellen te gebruiken om één grote cache te bouwen, maar een gedeelte van de geheugencellen aan te wenden om één of twee kleinere caches vóór de grote cache te plaatsen, krijgt men een meerniveaucache. Het effect zal zijn dat de laagste cache (bij een vast aantal geheugencellen) kleiner wordt, waardoor de miss rate van de complete cachehiërarchie toeneemt (ook doordat blokken uit L1 doorgaans ook in L2 zitten, en de blokken uit L2 doorgaans ook in L3). Doordat de L1 caches nu wel aanzienlijk sneller zijn zal de hit time van de gehele cachehiërarchie wel dalen. De miss penalty stijgt omdat er veel meer werk moet gebeuren om een nieuw blok van het geheugen in de verschillende lagen van de cachehiërarchie op te nemen. Cycli: 35 L3 cache (2 MiB/core) Geheugen
L3 Cachehiërarchie L2 CVE L1I L1D De bandbreedte en latentie variëren sterk over de geheugenhiërarchie. Tussen de CVE en L1 caches heeft men brede kanalen met een korte latentie. De verbinding tussen L1 en L2 is trager en minder breed dan de kanalen tussen L1 en de CVE. Tussen L2 en L3 wordt het kanaal opnieuw smaller dan de som van de kanalen tussen L1 en L2, en dit kanaal zal misschien moeten gedeeld worden door meerdere cores. Het kanaal tussen L3 en het hoofdgeheugen is het traagst van al. De latentie uitgedrukt in klokcycli neemt toe naarmate men zich verder van de CVE begeeft. Indien een applicatie een zeer slechte spatiale en temporele lokaliteit heeft, en de meeste geheugentoegangen naar L3 of naar het hoofdgeheugen moeten gaan, dan is het duidelijk dat dit een zeer zware impact zal hebben op de prestatie van die applicatie.
Voorbeeld Processor Pentium 4 Ultrasparc III Clock (2001) 2000 Mhz 900 Mhz L1 I cache 96 KiB TC 32 KiB, 4WSA Latency 4 2 L1 D cache 8 KiB 4WSA 64 KiB, 4WSA Latency 2 2 TLB 128 128 L2 cache 256 KiB 8WSA 8 MiB DM (off chip) Latency 6 15 Block size 64 bytes 32 bytes Bus width 64 bits 128 bits Bus clock 400 Mhz 150 Mhz Een voorbeeld van twee processors. De afkorting TC staat voor trace cache, dit is een cache waarin de instructies opgenomen worden in de volgorde waarin ze uitgevoerd worden (inclusief de controletransfers). Instructies uit een trace cache kunnen sneller ingeladen worden omdat er niet vanaf verschillende plaatsen in de cache moet geladen worden telkens wanneer er een controletransfer plaatsvindt.
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Ingebedde systemen Eindbeschouwingen
Superscalar out-of-order processor Branch predictor Instruction window ALU to L1 I-cache front-end pipeline L2 cache ALU L1 I-cache L1 D-cache ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b out-of-order execution in-order commit c This slide shows a basic superscalar out-of-order processor. It contains a front-end of 4 pipeline stages – preparing instructions for the instruction window. The issue logic will select instructions ready to executed, and will send them to the ALUs or load/store unit. Instruction leave the instruction window in the order in program order. The fetch unit has a branch predictor which predicts the next instruction to be fetched – based on historical information about the branch behavior of the program. For the time being we assume that it predicts with 100% accuracy. This processor will execute a small program consisting of a small loop that is executed 4 times. The instructions are labeled a, b, c etc. d e f decoding, register renaming, etc. g [Lieven Eeckhout]
Cycle 1 a b a b c d e f g Branch predictor Instruction window ALU to L1 I-cache L2 cache ALU L1 I-cache a L1 D-cache b ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c Per clock cycle, B instructions are fetched, With B = processor width Instructions enter the processor front-end two at the time. d e f g
Cycle 2 c1 a d1 b a b c d e f g Branch predictor Instruction window ALU to L1 I-cache L2 cache ALU L1 I-cache c1 a L1 D-cache d1 b ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The first execution of instruction c in the loop is called c1, etc. d e f g
Branch predicted taken Cycle 4 Branch predictor Instruction window ALU to L1 I-cache L2 cache ALU L1 I-cache c2 e1 c1 a L1 D-cache d2 f1 d1 b ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c We assume that the branch predictor predicts a taken branch back to c2. Branch predicted taken d e f g
Cycle 5 e2 c2 e1 c1 f2 d2 f1 d1 a b a b c d e f g Branch predictor ALU to L1 I-cache L2 cache ALU L1 I-cache e2 c2 e1 c1 L1 D-cache f2 d2 f1 d1 a b ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c During cycle 5, the first instructions arrive in the instruction window. d e f g
Cycle 6 a d1 c3 e2 c2 e1 c1 b d3 f2 d2 f1 a b a b c d e f g Branch predictor ALU to L1 I-cache a d1 L2 cache ALU L1 I-cache c3 e2 c2 e1 c1 b L1 D-cache d3 f2 d2 f1 a b ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c In cycle 6, two instructions are selected and sent to the ALU. d e f g
Cycle 7 d1 f1 e3 c3 e2 c2 c1 e1 f3 d3 f2 d2 a b c1 a b c d e f g Branch predictor ALU to L1 I-cache L2 cache d1 f1 ALU L1 I-cache e3 c3 e2 c2 c1 e1 L1 D-cache f3 d3 f2 d2 ld/st a b c1 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c Operands are available In cycle 7, only one instruction is ready to be executed (load instruction which will take 2 cycles to finish). The instruction a and b are finished and can leave the processor in that order. d operands not yet available e f g
out-of-order execution Cycle 8 Branch predictor ALU to L1 I-cache d2 e1 L2 cache c2 ALU L1 I-cache c4 e3 c3 e2 f1 d1 L1 D-cache d4 f3 d3 f2 ld/st e1 c1 c1 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The instruction e1 is already executed while d1 is still waiting for the result of c1. This is out-of-order execution. d e out-of-order execution f g
Instruction-level parallelism (ILP) Cycle 9 Branch predictor ALU to L1 I-cache d2 f1 L2 cache f2 c2 ALU L1 I-cache e4 c4 e3 c3 d1 e2 f1 d1 L1 D-cache f4 d4 f3 d3 ld/st e1 c1 c2 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d Instruction-level parallelism (ILP) e f g
Cycle 10 d3 e2 c3 f2 d2 c5 e4 c4 e3 e2 f1 c2 d5 f4 d4 f3 e1 d1 c2 a b Branch predictor ALU d3 to L1 I-cache e2 c3 L2 cache f2 d2 ALU L1 I-cache c5 e4 c4 e3 e2 f1 c2 L1 D-cache d5 f4 d4 f3 ld/st e1 d1 c2 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e in-order commit f g
Cycle 11 d3 f2 f3 c3 e5 c5 e4 c4 d2 e3 f2 d2 f5 d5 f4 d4 e2 c2 c3 a b Branch predictor ALU to L1 I-cache d3 f2 L2 cache f3 c3 ALU L1 I-cache e5 c5 e4 c4 d2 e3 f2 d2 L1 D-cache f5 d5 f4 d4 ld/st e2 c2 c3 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Instruction Level Parallelism 200 180 160 140 120 100 80 60 40 The amount of parallelism in programs is huge. For an infinite instruction window and a perfect branch predictor it can be as high as 180 for gcc (a compiler). On average it is 40 or more. Hence, on a processor which is wide enough, a theoretical IPC of 40 is possible, however… 20 bzip2 crafty eon gcc gzip parser perlbmk twolf vortex vpr [Starting from full trace, SpecInt 2000]
Performance IPC (8 execution units) IPC t 6 5 4 3 2 1 The number of execution units will of course always limit the IPC. For 8 functional units, the IPC is limited to 4 – on average and for an infiinite instruction window. This is far away from the average instruction level parallelism of 40. The reason why it is not higher than 4 is that initially, all functional units will find instructions ready to execute (in the initial instruction window there will be thousands of instructions for which all inputs are ready). After a while, the number will drop below 8 per cycle, and then the CPU will start executing long chains of dependent instructions, probably ending with the longest chain where only one or a couple instructions will be ready per cycle. On average this leads to 4 instructions per cycle. bzip2 crafty eon gcc gzip parser perlbmk twolf vortex vpr
Size instruction window W IPC = W 32 16 IPC 8 4 There is a empirical law stating that the number of instructions ready is roughly proportional to the square root of the number of instructions in the instruction window. Hence, for an instruction window of 64 instructions, we can expect 8 instruction to be ready, for an instruction window of 16 about 4. 2 4 8 16 32 64 Size instruction window W
? Branch prediction Retire (commit) Fetch & Decode Fetch width Commit width Issue width M E Memory Instruction Window In practice, branch predictors are not perfect, but only correct in 90-95% of the cases…
speculative fetch and execution Cycle 11 Branch predictor ALU to L1 I-cache d3 f2 L2 cache f3 c3 ALU L1 I-cache e5 c5 e4 c4 d2 e3 f2 d2 L1 D-cache f5 d5 f4 d4 ld/st e2 c2 c3 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c In cycle 9, the branch predictor predicts a taken branch, while the loop should exit, and the branch not taken. Let’s see what happens with the wrongly fetched instructions. Mispredicted branch d e f speculative fetch and execution g
Cycle 13 d4 f3 f4 c4 e6 c6 e5 c5 d3 e4 f3 d3 f6 d6 f5 d5 e3 c3 c4 a b Branch predictor ALU to L1 I-cache d4 f3 L2 cache f4 c4 ALU L1 I-cache e6 c6 e5 c5 d3 e4 f3 d3 L1 D-cache f6 d6 f5 d5 ld/st e3 c3 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The instructions enter the instruction window as all other instructions. d e f g
Cycle 15 d5 f4 f5 c5 e7 c7 e6 c6 d4 e5 f4 d4 f7 d7 f6 d6 e4 c4 c5 a b Branch predictor ALU to L1 I-cache d5 f4 L2 cache f5 c5 ALU L1 I-cache e7 c7 e6 c6 d4 e5 f4 d4 L1 D-cache f7 d7 f6 d6 ld/st e4 c4 c5 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c In cycle 14 all argument of the conditional branch are ready, and the instruction is sent to the ALU. Then is discovered that its branch direction does not match the prediction by the branch predictor. d e f g
Instructions on mispredicted path Cycle 16 Branch predictor ALU to L1 I-cache d5 L2 cache f5 c5 ALU L1 I-cache e7 c7 e6 c6 e5 f4 d4 L1 D-cache f7 d7 f6 d6 ld/st e4 c5 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The consequence is that all instructions that are fetched after the conditional branch have to be removed from the processor. This is a costly operation, and the deeper the pipeline, the most costly it is and the greater the loss of opportunity to execute instructions. Notice that some of the removed instructions have already been executed (e.g. c5), but thanks to the in-order commit, the instruction has not yet left the processor, so it can still be undone. Instructions on mispredicted path must be nullified d e f g
Instructions on correct path are fetched Cycle 17 Branch predictor Instruction window ALU to L1 I-cache L2 cache ALU L1 I-cache g L1 D-cache h ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c Instructions on correct path are fetched The misprediction in cycle 9 can only be corrected in cycle 17. The deeper the deadline, the longer the time to correct a misprediction. d e f g
Interval analysis Intervalanalyse Mispredicted branch enters instruction window Performance recovers Mispredicted branch is fetched IPC IPCmax Instructions along the speculative path are executed This graph shows the impact of a misprediction. After the mispredicted branch enters the instruction window, the number of correctly fetched instructions starts to decrease, and hence also the number of instructions ready to execute. After the mispredicted branch is resolved, it takes a number of cycles equal to the number of front-end pipeline stages to get new instructions in the instruction window. Only then the execution can continue. t Mispredicted branch gets executed; instructions from the correct path are fetched Correct instructions enter the instruction window Intervalanalyse
Branch predictor Memory Fetch & Decode Instruction Window Retire (commit) Branch Predictor 90-95% correct Memory The branch predictor learns from its mispredictions. However, this update arrives many cycles after the prediction. Hence the branch predictor can make several mispredictions before it can be corrected. This is due to the delayed update of the predictor. M E E E
Branch prediction IPC everything perfect real branch predictor 6 5 4 3 2 1 The cost of a misprediction is huge, and even though mispredictions are rare events (only one out of 10 or 20 branches is mispredicted), its impact on the performance is considerable. The average IPC drops from 4 to 2. bzip2 crafty eon gcc gzip parser perlbmk twolf vortex vpr Sprongvoorspeller
Cycle 10 Cache: misser d3 e2 c3 f2 d2 e4 c4 e3 e2 f1 c2 f4 d4 f3 e1 d1 Branch predictor ALU d3 to L1 I-cache e2 c3 L2 cache f2 d2 ALU L1 I-cache e4 c4 e3 e2 f1 c2 L1 D-cache f4 d4 f3 ld/st e1 d1 c2 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b Suppose f4 is correctly predicted, g causes an I cache miss c There are other events that can cause performance loss. E.g. if the fetch unit cannot fetch an instruction from the level 1 instruction cache, but needs to wait 10 cycles for the instruction to arrive from the level 2 cache, the front-end of the processor will stop fetching instructions, and the instruction window will empty. d e f I-cache miss latency is 10 cycles g Cache: misser
Cycle 13 d4 f3 f4 c4 d3 e4 f3 d3 e3 c3 c4 a b c d e f g Branch predictor ALU to L1 I-cache d4 f3 L2 cache f4 c4 ALU L1 I-cache d3 e4 f3 d3 L1 D-cache ld/st e3 c3 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c An I-cache miss in cycle 10 leads to an empty front-end in cycle 13, and an empty instruction window in cycle 17. d e f g
Cycle 14 d4 e4 f4 c4 e4 f3 d3 e3 c4 a b c d e f g Branch predictor ALU to L1 I-cache d4 e4 L2 cache f4 c4 ALU L1 I-cache e4 f3 d3 L1 D-cache ld/st e3 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Cycle 15 d4 f4 f4 d4 e4 c4 a b c d e f g Branch predictor ALU to L1 I-cache d4 L2 cache ALU L1 I-cache f4 f4 d4 L1 D-cache ld/st e4 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Cycle 16 f4 d4 e4 a b c d e f g Branch predictor ALU to L1 I-cache L2 cache ALU L1 I-cache f4 d4 L1 D-cache ld/st e4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Cycle 17 - 19 a b c d e f g Branch predictor ALU to L1 I-cache L2 cache ALU L1 I-cache L1 D-cache ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Cycle 20 g h a b c d e f g Branch predictor ALU to L1 I-cache L2 cache L1 D-cache h ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c Only in cycle 20, the next instruction will enter the processor. d e f g
Interval analysis I-cache miss Instructions from front-end pipe line arrive in instruction window IPC Performance recovers IPCmax I-cache misses have a similar effect as a misprediction. I-cache miss latency t front-end pipe line refills Instruction window empties
Cycle 10 Cache: misser d3 e2 c3 f2 d2 c5 e4 c4 e3 e2 f1 c2 d5 f4 d4 f3 Branch predictor ALU d3 to L1 I-cache e2 c3 L2 cache f2 d2 ALU L1 I-cache c5 e4 c4 e3 e2 f1 c2 L1 D-cache d5 f4 d4 f3 ld/st e1 d1 c2 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The last event is a data cache miss. Assume that c2 causes a data cache miss in the level 1 cache, and has to wait for 10 cycles before the data arrives from the level 2 cache. d Assume a L1 D-cache miss e f g Cache: misser
Access time to L2 cache is 10 cycles Branch predictor ALU to L1 I-cache f2 f3 d3 L2 cache ALU c3 L1 I-cache e3 e5 c5 e4 c4 c2 f2 d2 L1 D-cache f5 d5 f4 d4 ld/st e2 c2 c3 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b Access time to L2 cache is 10 cycles c The processor continues fetching instructions and continues to do so until the instruction window is full (and if it is large enough, this can take several cycles). d e f g
Cycle 12 d4 c4 e3 f3 d3 c3 e3 c6 e5 c5 e4 c2 f2 d2 d6 f5 d5 f4 e2 c2 Branch predictor ALU d4 to L1 I-cache c4 e3 f3 d3 L2 cache ALU c3 L1 I-cache e3 c6 e5 c5 e4 c2 f2 d2 L1 D-cache d6 f5 d5 f4 ld/st e2 c2 c3 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c The processor will also fetch mispredicted instructions. d e f g
Cycle 13 f4 d4 e4 c4 f3 f3 d3 c3 e3 e6 c6 e5 c5 c2 f2 d2 f6 d6 f5 d5 Branch predictor ALU d4 e4 to L1 I-cache c4 f3 f3 d3 L2 cache ALU c3 L1 I-cache e3 e6 c6 e5 c5 c2 f2 d2 L1 D-cache f6 d6 f5 d5 ld/st c3 e2 c2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c They will eventually end up in the instruction window. d e f g
Cycle 14 d5 f4 c5 d4 e4 c4 e4 f3 d3 c3 e3 c7 e6 c6 e5 c2 f2 d2 d7 f6 to main memory d5 f4 c5 Branch predictor ALU d4 e4 to L1 I-cache c4 e4 f3 d3 L2 cache ALU c3 L1 I-cache e3 c7 e6 c6 e5 c2 f2 d2 L1 D-cache d7 f6 d6 f5 ld/st c3 e2 c2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c And wait for their operands to become available. d e Instruction window fills up instruction c2 prohibits commit f g
Cycle 15 f5 e5 d5 f4 c5 f4 d4 e4 c4 f3 d3 e7 c7 e6 c6 c2 c3 f7 d7 f6 to main memory f5 e5 Branch predictor d5 ALU to L1 I-cache f4 c5 f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 e7 c7 e6 c6 c2 L1 D-cache c3 f7 d7 f6 d6 e3 ld/st c3 f2 d2 c4 c5 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c2 c From where they will eventually be selected for execution. d e f g
Cycle 16 f5 d6 e5 c6 d5 f4 c5 e5 d4 e4 c4 f3 d3 c8 e7 c7 e6 c2 c3 d8 to main memory f5 d6 e5 c6 Branch predictor d5 ALU to L1 I-cache f4 c5 e5 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 c8 e7 c7 e6 c2 L1 D-cache c3 d8 f7 d7 f6 e3 ld/st c3 f2 d2 c4 c5 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c2 c While still waiting for the outcome of c2, the processor continues and detects that f4 was mispredicted. Consequently, the dependent instructions are removed, and the processor continues fetching the correct instructions. d e f g
Cycle 17 f4 d4 e4 c4 f3 d3 g c2 c3 h e3 c3 f2 d2 c4 a b e2 c2 c d e f to main memory Branch predictor ALU to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 g c2 L1 D-cache c3 h e3 ld/st c3 f2 d2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c2 c d e f g
Cycle 20 f4 d4 e4 c4 f3 d3 g c2 c3 h e3 c3 f2 d2 c4 a b e2 c2 c d e f to main memory Branch predictor ALU to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 g c2 L1 D-cache c3 h e3 ld/st c3 f2 d2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c2 c d e f g
Cycle 21 h g f4 d4 e4 c4 f3 d3 c3 e3 c3 f2 d2 c4 a b e2 c2 c d e f g to main memory h g Branch predictor ALU to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 L1 D-cache c3 e3 ld/st c3 f2 d2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c2 c When c2 finishes, there are already many pre-computed instructions, which will now leave the processor at a fast rate. d e f g
Cycle 22 h g f4 d2 d4 e4 c4 f3 d3 c3 e3 c3 f2 d2 c4 a b e2 c d e f g to main memory h g Branch predictor ALU to L1 I-cache f4 d2 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 L1 D-cache c3 e3 ld/st c3 f2 d2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c d e f g
Cycle 23 h g f4 d4 e4 c4 f3 d3 c3 e3 f2 d2 c4 a b e2 c d e f g to main memory h g Branch predictor ALU to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 L1 D-cache c3 e3 ld/st f2 d2 c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b e2 c d e f g
Cycle 24 h g d3 f4 d4 e4 c4 f3 d3 e3 c4 a b c d e f g to main memory Branch predictor ALU d3 to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 L1 D-cache e3 ld/st c4 mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Cycle 25 h g f4 d4 e4 c4 f3 d3 e3 a b c d e f g to main memory Branch predictor ALU to L1 I-cache f4 d4 e4 L2 cache c4 ALU L1 I-cache f3 d3 L1 D-cache e3 ld/st mov 0 → r1 mov 0x0fe0 → r3 L: ld MEM[r3] → r2 add r2,r1 → r1 add r3,48 → r3 brl r3,0x10a0 → L st r1 → MEM[A] a b c d e f g
Interval analysis L2 D-cache miss Instruction window fills up Instruction window full IPC Performance recovers IPCmax A data cache miss has a similar effect as the previous events. The processor will slow down until the data cache miss is resolved. L2 D-cache miss latency t Instructions that do not depend on the cache miss are executed
Prestatie-impact van niet-ideale geheugens Alles perfect Realistische sprongvoorspeller Realistische sprongvoorspeller; realistische geheugenhiërarchie IPC 6 5 4 3 2 From these IPC-numbers follows that the quality of the memory hierarchy has a huge impact on the performance. Even a perfectly tuned memory hierarchy will have a dramatic impact on the performance which will drop with about 50% compared to a memory hierarchy with an access time of 1 cycle. It is disappointing to see that a processor which can execute 8 instructions in parallel, will not be able to execute more than one instruction per cycle on average. 1 bzip2 crafty eon gcc gzip parser perlbmk twolf vortex vpr
Itanium 2 210 miljoen transistors Layout van de dia van de Itanium. Let op de relatieve grootte van de verschillende processoronderdelen, in het bijzonder van de on-chip caches.
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Ingebedde systemen Eindbeschouwingen
Vergist U zicht niet… alle leven op aarde bestaat uit insecten 1000000 2000000 3000000 4000000 5000000 6000000 7000000 8000000 9000000 insecten schimmels bacteriën algen wormen virussen planten andere weekdieren eencelligen schaaldieren vissen vogels reptielen zoogdieren amfibieën [bron: Scientific American] verschillende soorten
Merk ook het enorme verschil tussen het aantal verkochte ingebouwde processors en het aantal verkochte PC’s! Dit geeft het enorme belang aan van deze markt. Embedded market, 1996 versus 2010. *CPU licensing data used for 2010. (Source: The Linley Group)
Enkele recente cijfers # verkochte PC’s in 2008: 300 miljoen # ingebedde processors in 2008 Automotive: 1,2 miljard (90 miljoen 32 bit) GSM’s: 1 miljard … ARM verkocht in 2012: 8 miljard processors
(R)evolutie 1-veel Functionaliteit Prijs Grootte Autonomie 1-1 veel-1 ’60-’70 prestatie ’80-’90 Prestatie prijs In de jaren 60 waren er maar een zeer beperkt aantal computers. Hun voornaamste kenmerk was hun prestatie. De prijzen waren hoog want er waren slechts een paar spelers op de markt. IBM is in deze periode groot geworden met de verkoop van mainframes. In de jaren 80 kwam daar verandering is door het ontstaan van de PC en de talrijke computerbouwers. Plots ontstonden er computerwinkeltjes in het straatbeeld. De consumenten konden de systemen nu vergelijken en er die met de beste prijs/prestatieverhouding uitkiezen. De prijs werd een belangrijk extra criterium bij de aanschaf. Sinds het einde van de jaren 90 worden computers niet louter meer gebouwd door computerbouwers, maar ook telefoonmaatschappijen, fabrikanten van fototoestellen, platenmaatschappijen brengen nu toestellen op de markt met ingebouwde processors. De prestatie van deze toestellen wordt niet langer uitgedrukt in rekenkracht, maar in autonomie, grootte/gewicht en functionaliteit (zeg maar features). Dit legt bijkomende eisen op aan de software die op dergelijke systemen loopt (moet zo compact mogelijk zijn, zo weinig mogelijk energie verbruiken, enz.). 2000-
“The computer revolution hasn't happened yet” De alomtegenwoordige computer (ubiquitous computing, pervasive computing) Intelligente omgeving (Ambient Intelligence) Sommigen zeggen dat dit pas het begin is, en spreken van ubiquitous of pervasive computing waarbij de mens omgeven zal zijn door processors allerhande. Als deze toestellen ook met elkaar beginnen communiceren en ons op die manier helpen bij onze dagdagelijkse bezigheden dan spreekt men over ambient intelligence. Wist je dat in een auto in de duurdere prijscategorie er meer dan 50 ingebouwde microprocessors en microcontrollers zijn? Alan Kay, HP
Modern ingebed systeem BMW serie-7 Een steeds groter deel van de innovatie in een eigentijdse automobiel zit in de intelligente aansturing en controle van de auto. De processors worden gebruikt om de motor aan te sturen, de airbag te controleren, de raampjes te bedienen, het ABS- systeem, de buitentemperatuur bijhouden, enz. 63 processors
Ingebedde systemen “Embedded system” of “Dedicated system” Processorchip ingebouwd in een apparaat Voert steeds hetzelfde programma uit (uit ROM of Flash) Vaak met beperkte hardware: geen cache, geen virtueel geheugen,… Vaak in ware tijd (real-time) Ingebedde systemen (embedded systems) zijn relatief kleine, vaak eenvoudige processorchips die zijn ingebouwd in allerlei apparaten, van keukengerij tot wagens, en van kleine elektronische gadgets tot telefooncentrales. Ze voeren een bepaald programma uit, dat is beschreven in een permanent geheugen op de chip. Ze zijn doorgaans qua architectuur veel minder geavanceerd dan de processors in PC’s en werkstations, maar werken vaak wel onder “real-time” vereisten, wat betekent dat de chip steeds moet garanderen binnen een bepaalde, beperkte tijd te reageren op bepaalde gebeurtenissen.
Typische configuratie Analoog/ Digitaal Conversie Proc Digitaal/ Analoog Conversie Een typische configuratie voor een ingebed systeem is hier getoond. De chip krijgt een aantal externe signalen binnen van sensors, die informatie gegeven over de werking van het toestel waarin het is ingebouwd, en over de omgeving van dit toestel. De microprocessor in de chip volgt deze input op, en reageert volgens het ingebouwde programma. Dit resulteert dan in een uitgangsignaal, dat de sturing van het apparaat beïnvloedt. Sensors Actuators “input” “output”
Voorbeelden Digitale camera Alarmsystemen CD-spelers Digitale tuners Domoticasystemen Afstandsbediening Microgolfoven Digitale uurwerken Telefooncentrale Netwerkapparatuur, modem Displaysystemen Printers DVD-spelers Elektronische agenda’s Synthesizers Scanners GSM Satellieten Auto’s Treinen Vliegtuigen Raketten Wapensystemen
Kenmerken Klein en licht (draagbare toepassingen) Vermogenverbruik minimaal: autonomie > 8 uur, warmteproductie aanvaardbaar. Robuust tegen vocht, hitte, vorst, schokken, straling, enz. Interactie is met de buitenwereld: “tijdigheid” is onderdeel van “correctheid”. Betrouwbaar: vliegtuigen, auto’s Zeer kostgevoelig: 1 cent x 1 miljoen = … Ingebedde systemen worden gebruikt in een zeer breed gamma van toestellen. Toch zijn er een aantal typische kenmerken voor al deze systemen. Ze zijn veelal klein en licht, met beperkt energieverbruik. Vooral voor draagbare toepassingen is dit van belang. Het energieverbruik bepaalt immers de autonomie (batterijverbruik) en de warmteproductie, die draaglijk moet blijven. Doordat ze zijn ingebouwd, en vaak in draagbare toestellen zitten, moeten ze robuust zijn, en dus vocht, hitte, vriestemperaturen, schokken, straling, e.d. kunnen verdragen. Het goed functioneren van het apparaat hangt immers af van de robuustheid van het ingebedde systeem – dat ingeval van faling vaak moeilijk te vervangen is. Zeker wanneer het gaat om kritieke toepassingen, waarin mensenlevens op het spel staan – en dat is regelmatig het geval – kan men op de betrouwbaarheid niets inleveren. Ingebedde systemen worden vaak in zeer grote volumes gemaakt en gebruikt. Daardoor zijn ze ook zeer kostgevoelig. Elke cent die kan bespaard worden per geproduceerde chip, vertaalt zich in al gauw in miljoenen.
Ingebedde processors Vaak microcontrollers van 4,8 of 16 bit (computersysteem op 1 chip: geheugen, input/ouput, enz.) Vaak ook gewone processors Vermogenverbruik is cruciaal voor mobiele toepassingen De processor in embedded systems zijn vaak microcontrollers (computersysteem op 1 chip, met ingebouwd geheugen, I/O, etc) met een 4-, 8- of 16- bit architectuur. De woordbreedte van deze processors loopt dus achterop bij de standaardprocessors, maar zoals eerder reeds gezegd, gaat het immers zelden om pure prestatie, maar om goedkope en betrouwbare chips. Ook processors voor algemeen gebruik uit vroegere generaties komen wel eens in aanmerking om gebruikt te worden. Omwille van de courante mobiele toepassingen (op batterijen), is het vermogenverbruik een belangrijke factor, véél meer dan bij standaardprocessors.
Digitale-signaalprocessors DSP: Digital Signal Processor Gespecialiseerde processor om digitale signalen (b.v. audiosignalen) te verwerken. CD-spelers, telefooncentrales, elektronische muziekinstrumenten, enz. Vaak zeer complex en gespecialiseerd voor het uitvoeren van signaalverwerkingsalgoritmen: b.v. fast Fourier transformatie (som van producten) Digitale-signaalprocessors (digital signal processor, DSP) zijn een speciale vorm van ingebedde processors, die gespecialiseerd zijn om digitale signalen te verwerken. Dat uit zich in alle aspecten van de processor, zoals de woordbreedtes, de functionele eenheden en instructies, bussen en geheugenarchitecturen, enz. DSP’s zijn aanwezig in zowat alle audio- en video-toestellen, zoals CD- spelers, telefooncentrales, GSM’s, etc. De signaalverwerkingsalgoritmes zijn immers vaak zeer complex en gespecialiseerd, en door de grote markt van toepassingen, is het zowel technisch als economisch nuttig om gespecialiseerde processors te ontwikkelen.
Inhoud Soorten geheugens Lokaliteit Caches Impact op prestatie Ingebedde systemen Eindbeschouwingen
Vervolg Parallelle computersystemen Digitale elektronica Superscalaire architecturen, out-of-order architecturen, interconnecties en vermogen, prestatieanalyse, meerdradige uitvoering, systeemarchitectuur Parallelle computersystemen Digitale elektronica Boole-algebra en functies, combinatorische poortnetwerken, teruggekoppelde circuits, synchrone sequentiële circuits, systeemrepresentaties, bestaande bouwblokken, Decompositie en compositie op logisch niveau, Extensies naar R/T-niveau Besturingssystemen Procesbeheer, Synchronisatie, hoofdgeheugen, Bestanden- en schijfbeheer, Beveiliging, Systeembeheer Op dit vak volgen er nog 3 bijkomende vakken. Digitale elektronica vormt een uitbreiding naar beneden (lager abstractieniveau) Besturingssystemen vormt een uitbreiding naar boven (hoger abstractieniveau) Geavanceerde computerarchitectuur bestudeert in detail de microarchitectuur van hedendaagse processors. Computerarchitectuur
Pauze
http://www. eetimes. com/document. asp http://www.eetimes.com/document.asp?doc_id=1326377&_mc=NL_EET_EDT_EET_review_20150418&cid=NL_EET_EDT_EET_review_20150418&elq=ffa1b73023664da4bccb7e28d21b2003&elqCampaignId=22619&elqaid=25441&elqat=1&elqTrackId=dae6c67ea56d4963ba0fedcae4bdaaf6