Geheugenhiërarchie en caches

Leer waarom een computer kleine, snelle geheugens combineert met grote, langzame geheugens en hoe caches de gegevens die een programma nodig heeft dicht bij de processor houden. Vergelijk SRAM, DRAM en flashgeheugen, zoek blokken in direct afgebeelde en set-associatieve caches, deel cachemissers in en vergelijk schrijfstrategieën. Bereken trefferfracties, de gemiddelde geheugentoegangstijd en de kosten van geheugenwachtcycli, ontdek hoe virtueel geheugen en de TLB adressen vertalen en schrijf lussen en gegevensstructuren die de cache goed benutten.

GemiddeldLes 5 van 6 in Cursus Computerarchitectuur: processors, geheugen en prestaties

Wat je leert

  1. Beschrijf hoe programma's gegevens en code opnieuw gebruiken, vergelijk de geheugentechnologieën die deze opslaan en leg uit hoe snelle kleine niveaus en langzame grote niveaus samenwerken.
    • Herken temporele en ruimtelijke lokaliteit in programma's
      Herken de twee soorten lokaliteit bij toegang tot code en gegevens en leg uit waarom een klein, snel geheugen daardoor de meeste toegangen kan afhandelen.
    • Vergelijk SRAM, DRAM en flashgeheugen
      Beschrijf hoe SRAM, DRAM en flash bits opslaan en vergelijk hun snelheid, dichtheid, kosten per bit, vluchtigheid en gebruikelijke plaats in de hiërarchie.
    • Beschrijf hoe de niveaus van de geheugenhiërarchie samenwerken
      Benoem de niveaus van registers tot opslag, gebruik de termen voor treffers en missers en leg uit hoe de hiërarchie de illusie van een groot, snel geheugen geeft.
  2. Gebruik de velden voor adrestag, index en offset van een adres om een blok te vinden, volg reeksen toegangen en vergelijk cacheorganisaties van direct afgebeeld tot volledig associatief.
    • Splits een adres op in adrestag, index en offset
      Bereken de veldgroottes van een direct afgebeelde cache uit de capaciteit en blokgrootte, verdeel een adres in zijn velden en bereken hoeveel opslagruimte de cache nodig heeft.
    • Volg geheugentoegangen door een direct afgebeelde cache
      Volg een reeks adressen door een kleine direct afgebeelde cache, noteer elke treffer of misser en de inhoud van de cache en herken blokken die elkaar verdringen.
    • Gebruik set-associatieve en volledig associatieve caches
      Zoek blokken in n-weg set-associatieve en volledig associatieve caches, kies met een vervangingsstrategie een te vervangen blok en weeg lagere misserfracties af tegen hardwarekosten en cachetoegangstijd.
  3. Beschrijf wat er bij een misser gebeurt, deel missers in naar oorzaak, leg het verband tussen cachegrootte, blokgrootte, associativiteit en misserfractie en vergelijk hoe caches schrijfbewerkingen afhandelen.
    • Handel cachemissers af en deel ze in naar oorzaak
      Beschrijf de stappen bij een cachemisser, deel missers in als eerste-toegangs-, capaciteits- of conflictmissers en leg uit hoe cachegrootte, blokgrootte en associativiteit elk type beïnvloeden.
    • Vergelijk schrijfstrategieën voor caches
      Leg uit hoe caches met direct doorschrijven en terugschrijven het geheugen actueel houden, wat schrijfbuffers en wijzigingsbits doen en hoe cachetoewijzing en geen cachetoewijzing bij een schrijfmisser werken.
  4. Bereken trefferfracties, de gemiddelde geheugentoegangstijd en geheugenwachtcycli, verwerk die in de CPI en uitvoeringstijd en analyseer systemen met meerdere cacheniveaus.
    • Bereken de trefferfractie en de gemiddelde geheugentoegangstijd
      Bereken treffer- en misserfracties en de gemiddelde geheugentoegangstijd van een cache, ook bij een combinatie van instructie- en gegevenstoegangen, en gebruik die om ontwerpen te vergelijken.
    • Verwerk geheugenwachtcycli in de CPI en de uitvoeringstijd
      Voeg geheugenwachtcycli toe aan de CPU-prestatieformule, bepaal hoeveel een cache een programma kost en leg uit waarom snellere processors meer last hebben van langzaam geheugen.
    • Analyseer caches met meerdere niveaus
      Leg uit waarom processors meerdere cacheniveaus gebruiken, onderscheid lokale en globale misserfracties en bereken de gemiddelde geheugentoegangstijd en CPI voor hiërarchieën met twee en drie niveaus.
  5. Beschrijf hoe virtuele adressen met een paginatabel naar fysieke adressen worden vertaald, waarom een paginafout een door het besturingssysteem afgehandelde misser is en hoe de TLB de vertaling versnelt.
    • Vertaal een virtueel adres met een paginatabel
      Leg uit wat virtueel geheugen biedt, splits een virtueel adres in paginanummer en offset, vertaal het via een paginatabelitem en beschrijf wat er bij een paginafout gebeurt.
    • Versnel adresvertaling met een TLB
      Leg uit hoe de TLB vertalingen in een cache bewaart, volg een toegang door de TLB, paginatabel en cache en bekijk hoe cachetoegang en vertaling overlappen.
  6. Organiseer lussen en gegevensstructuren zodat programma's de geheugenhiërarchie goed gebruiken en pas blokgewijze verwerking en vooraf ophalen toe om gegevens opnieuw te gebruiken terwijl ze in de cache staan.
    • Orden lussen en gegevens voor een goede lokaliteit
      Orden lussen volgens de opslagvolgorde van arrays, voorkom nadelige stapgroottes en kies gegevensindelingen die alleen bruikbare gegevens in de cache brengen.
    • Verdeel berekeningen in blokken en haal gegevens vooraf op
      Deel lussen opnieuw in blokken die tijdens hergebruik in de cache blijven, kies een blokgrootte en leg uit hoe hardware en software geheugenlatentie verbergen door gegevens vooraf op te halen.

Geheugenhiërarchie en caches: uitleg

6 hoofdstukken

1

Leg uit waarom computers een geheugenhiërarchie gebruiken

Programma's gebruiken een klein deel van hun code en gegevens herhaaldelijk. Dat hergebruik verklaart waarom een kleine cache de meeste toegangen kan afhandelen, ook als het hele programma veel groter is. Bekijk het verschil tussen hergebruik in de tijd en nabijgelegen adressen, vergelijk de cellen achter SRAM, DRAM en flash en verbind deze technologieën met treffers, missers en overdrachten door de hiërarchie. Hetzelfde toegangspatroon bepaalt later of een cacheontwerp of een aanpassing van een lus helpt.

1.1 Hoe programma's gegevens in elkaars nabijheid opnieuw gebruiken

Een cache werkt omdat de volgende geheugentoegang vaak verband houdt met een recente toegang. Gedurende een korte periode gebruiken de meeste programma's slechts een klein deel van hun adresruimte. Dit patroon heet lokaliteit. Een cache houdt dat actieve deel dicht bij de processor, waar toegangen snel kunnen worden afgehandeld.

Hergebruik in tijd en ruimte

Temporele lokaliteit betekent dat een gegeven kort na een toegang opnieuw wordt gebruikt. Een lus haalt herhaaldelijk de instructies van zijn lichaam op. Een lopend totaal wordt vaak gelezen en bijgewerkt. Door die gegevens beschikbaar te houden, hoeven ze niet opnieuw uit een langzamer niveau te worden opgehaald.

Ruimtelijke lokaliteit betekent dat gegevens op nabijgelegen adressen worden aangesproken. Bij het doorlopen van een array worden aangrenzende elementen gelezen en bij code zonder sprongen worden opeenvolgende instructies opgehaald. Een cache benut dit door bij een misser een heel blok, ook cachelijn genoemd, op te halen. Nabijgelegen bytes komen aan voordat het programma erom vraagt.

Deze patronen kunnen samengaan. De instructies van een lus liggen naast elkaar en worden herhaaldelijk uitgevoerd, dus heeft de instructiestroom zowel ruimtelijke als temporele lokaliteit. Een array-element dat precies één keer wordt gelezen, wordt niet temporeel hergebruikt, ook al heeft de doorloop van de omringende array ruimtelijke lokaliteit.

Tel blokken bij het doorlopen van een array

Bekijk deze C-lus met gehele getallen van 4 bytes en cacheblokken van 64 bytes:

for (int i = 0; i < 1000; i++) {
    sum += a[i];
}

Een blok bevat 64/4=16 gehele getallen. De array neemt 1000×4=4000 bytes in. Als het eerste element op een blokgrens ligt, raakt de doorloop ⌈4000/64⌉=63 blokken: 62 volledige blokken en één gedeeltelijk blok.

In een aanvankelijk lege cache zonder vooraf ophalen of verstoring levert de eerste toegang tot elk blok een misser op. De overige elementen in dat blok leveren treffers op. De array veroorzaakt dus 63 missers bij 1000 toegangen, of ongeveer 6,3%. Als je één misser per element telt, zie je alle bruikbare naburige gegevens over het hoofd die met elke misser worden opgehaald.

De bronvariabelen sum en i worden vaak opnieuw gebruikt. Een compiler houdt ze echter meestal in registers, zodat hun hergebruik op bronniveau niet per se toegangen tot de gegevenscache oplevert. Analyseer bij het schatten van cacheverkeer de geheugentoegangen die het gecompileerde programma uitvoert.

De werkverzameling moet passen en samen bewaard kunnen worden

De werkverzameling is de verzameling blokken die tijdens een gekozen tijdvenster wordt gebruikt. Als ze in de cache passen en de plaatsingsregels toestaan dat ze samen worden bewaard, leveren herhaalde toegangen na het eerste laden meestal treffers op. Het tijdvenster is van belang: een heel programma kan enorm zijn terwijl één actieve lus slechts enkele blokken gebruikt.

Capaciteit alleen is niet genoeg. Twee veelgebruikte blokken kunnen op één direct afgebeelde positie worden afgebeeld en elkaar verdringen terwijl andere posities leeg blijven. Een werkverzameling kan dus qua aantal bytes passen en toch niet in de cache blijven.

Verspreide knooppunten van een gekoppelde lijst en willekeurige opvragingen in een grote hashtabel hebben vaak weinig ruimtelijke lokaliteit. Ook een kolomdoorloop van een rijgewijs opgeslagen array slaat veel naburige elementen over. Deze patronen halen bytes binnen die mogelijk ongebruikt blijven voordat ze worden verdrongen. Hardware benut de lokaliteit van het toegangspatroon; door de indeling of doorloop van het programma te veranderen, kun je een groter deel van elk opgehaald blok bruikbaar maken.

Belangrijkste punten

  • Temporele lokaliteit gebruikt een gegeven opnieuw; ruimtelijke lokaliteit spreekt nabijgelegen adressen aan.
  • Door een heel blok op te halen leveren latere toegangen tot nabijgelegen bytes treffers op.
  • Een werkverzameling moet binnen de capaciteit passen en volgens de plaatsingsregels van de cache samen kunnen worden bewaard.
  • Bronvariabelen die in registers worden bewaard veroorzaken geen toegangen tot de gegevenscache.

1.2 Geheugencellen, overdrachten en afwegingen

Bij geheugentechnologieën worden snelheid, dichtheid, kosten en behoud van gegevens tegen elkaar afgewogen. De processor heeft snelle toegang tot een kleine hoeveelheid gegevens nodig en betaalbare ruimte voor veel meer. SRAM, DRAM en flash voorzien elk in een ander deel van die behoefte.

Vergelijk de cellen
TechnologieHoe een bit wordt opgeslagenVerversing en stroomBelangrijkste rol
SRAMEen stabiele schakeling, doorgaans zes transistorsGeen verversing; verliest gegevens zonder stroomCaches op de chip
DRAMLading op een condensator, bereikbaar via een transistorPeriodieke verversing; verliest gegevens zonder stroomHoofdgeheugen
NAND-flashgeheugenEen niet-vluchtige cel waarvan de toestand elektrisch wordt geprogrammeerdBewaart gegevens zonder stroom; beperkt aantal schrijfbewerkingenOpslag

Een SRAM-cel is snel maar neemt aanzienlijk oppervlak in, waardoor SRAM relatief duur per bit is. DRAM-cellen zijn kleiner, zodat DRAM meer capaciteit biedt tegen lagere kosten per bit. Hun lading lekt weg. Bij verversing worden rijen binnen een vast tijdvenster gelezen en hersteld; DDR4 gebruikt bij normale temperatuur een venster van 64 ms. “Statisch” in SRAM betekent geen verversing, niet dat gegevens na stroomuitval bewaard blijven.

Waarom de DRAM-toegangstijd varieert

DRAM is ingedeeld in banken, met rijen en kolommen in elke bank. Bij het activeren van een rij wordt die naar een rijbuffer gekopieerd. Lees- en schrijfbewerkingen selecteren vervolgens kolommen uit die open rij. Om een andere rij in dezelfde bank te openen, moet de bank eerst worden voorgeladen. Bij toegang tot een al open rij is dat wisselen van rij niet nodig.

Opeenvolgende kolommen kunnen in een burst worden overgedragen, wat geschikt is voor het ophalen van een cacheblok. Door verzoeken over banken en kanalen te verdelen kunnen overdrachten overlappen. DDR-geheugen draagt gegevens over op beide klokflanken. Deze eigenschappen verhogen de snelheid waarmee gegevens worden geleverd zonder de wachttijd op de eerste gegevens weg te nemen.

Onderscheid latentie en bandbreedte

Latentie is de vertraging totdat de eerste gegevens aankomen. Bandbreedte is de hoeveelheid die per tijdseenheid wordt overgedragen. Een interface met hoge bandbreedte kan nog steeds een lange initiële vertraging hebben.

Een DDR5-4800-kanaal met een gezamenlijk datapad van 64 bits draagt bijvoorbeeld 8 bytes per overdracht over. De pieksnelheid is 4800×106×8=38,4×109 bytes/s, of 38,4 GB/s. De aanhoudende bandbreedte voor een applicatie kan lager zijn doordat opdrachten, rijwisselingen en ander werk tijd kosten.

Als een verzoek 60 ns wacht en daarna een blok van 64 bytes ontvangt met 16 GB/s, is de overdrachtssnelheid 16 bytes/ns. De overdracht duurt 64/16=4 ns, wat in totaal ongeveer 64 ns geeft. Alleen de bandbreedte verbeteren verkort het deel van 4 ns, niet de eerste 60 ns.

Flash bewaart gegevens maar schrijft anders

NAND-flashgeheugen leest en programmeert pagina's van enkele KiB. Om een geprogrammeerde pagina opnieuw te gebruiken, moet het grotere wisblok met vele pagina's worden gewist. Pagina's lezen duurt doorgaans tientallen microseconden, programmeren honderden microseconden tot enkele milliseconden en wissen milliseconden.

Programmeer- en wiscycli laten cellen slijten. Compact flashgeheugen met meerdere bits per cel ondersteunt vaak enkele duizenden cycli, terwijl cellen met één bit er ongeveer 100.000 kunnen ondersteunen. Controllers gebruiken slijtageverdeling om schrijfbewerkingen over blokken te spreiden.

Ter vergelijking: een SRAM-toegang duurt ongeveer 1 ns, DRAM ongeveer 50–100 ns, NAND lezen ongeveer 25–100 µs en een schijftoegang ongeveer 5–10 ms. Werkelijke apparaten verschillen. De hiërarchie combineert deze technologieën omdat één technologie hun voordelen in snelheid, capaciteit en prijs niet tegelijk kan bieden.

Belangrijkste punten

  • SRAM en DRAM zijn vluchtig; flash bewaart gegevens zonder stroom.
  • DRAM-verversing herstelt weglekkende lading, terwijl rijbuffers en bursts de toegang efficiënter maken.
  • Latentie meet de initiële wachttijd; bandbreedte meet de overdrachtssnelheid.
  • Flash programmeert pagina's en wist grotere blokken.
  • Slijtageverdeling spreidt de slijtage door programmeren en wissen over flashblokken.

1.3 Volg een toegang door de hiërarchie

De geheugenhiërarchie plaatst kleine, snelle opslag dicht bij de processor en steeds grotere opslag verder weg. Dankzij lokaliteit kunnen de kleine niveaus een groot deel van de verzoeken afhandelen, terwijl de lagere niveaus capaciteit bieden.

Niveaus en overdrachtseenheden

Een typisch pad loopt via registers, L1, L2, L3, hoofdgeheugen en opslag. L1 heeft meestal afzonderlijke instructie- en gegevenscaches van elk ongeveer 32–64 KiB per kern. L2 is vaak honderden KiB tot enkele MiB per kern, terwijl L3 vaak wordt gedeeld en enkele tot tientallen MiB bevat. Het hoofdgeheugen bevat vele GiB en de opslag honderden GB of meer. Ontwerpen verschillen in grootte en verdeling.

Op een processor van ongeveer 3 GHz zijn representatieve latentietijden voor laden ongeveer 4–5 cycli voor L1, 12–15 voor L2, 30–50 voor L3 en 200–300 voor DRAM. Een L1-cache kan elke cyclus een nieuw verzoek accepteren, ook als één verzoek meerdere cycli nodig heeft om te worden voltooid: doorvoer en latentie beschrijven verschillende eigenschappen.

Gegevens reizen door caches in blokken, meestal van 64 bytes. Virtueel geheugen gebruikt pagina's, meestal van 4 KiB, bij het verplaatsen van pagina-inhoud tussen geheugen en opslag. Een cachelijn en een pagina dienen een vergelijkbaar doel voor groepering op verschillende schaal; het zijn niet dezelfde overdrachtseenheden.

Treffers, missers en tijd

Een treffer betekent dat een niveau de gevraagde gegevens bevat. Een misser betekent dat het niveau de gegevens van onderaf moet ophalen. Beide woorden hebben betrekking op het niveau dat wordt gecontroleerd: een L1-misser kan nog steeds een L2-treffer zijn.

De trefferfractie is het aantal treffers gedeeld door het aantal toegangen en de misserfractie is één min de trefferfractie. De cachetoegangstijd omvat het controleren van het niveau en het vaststellen of het verzoek een treffer oplevert. De extra vertraging bij een cachemisser is de extra tijd die bij een misser nodig is om het blok op te halen en te leveren.

Stel dat een vereenvoudigde cache een toegangstijd van 1 cyclus, een trefferfractie van 97% en een extra vertraging van 100 cycli bij een misser heeft. Elke toegang kost 1 cyclus, terwijl 3% nog eens 100 cycli kost:

1+0,03×100=4 cycli.

Een misser duurt in dit voorbeeld 101 cycli. Als je 100 als de volledige tijd voor een misser gebruikt, reken je de tijd voor het opzoeken in de cache niet consequent mee. Zelfs bij een hoge trefferfractie blijven dure missers zichtbaar in het gemiddelde.

Wie beheert elk niveau?

De compiler wijst geschikte waarden toe aan registers. Cachehardware verplaatst blokken automatisch tijdens laad- en opslagbewerkingen en het ophalen van instructies. Programma's gebruiken adressen; ze selecteren geen cacheposities. Het besturingssysteem beheert met hardwareondersteuning de afbeeldingen van virtueel geheugen en handelt pagina's af die naar het hoofdgeheugen moeten worden gehaald.

Door L1 op te splitsen voor instructies en gegevens kan een pipeline tegelijk een instructie ophalen en gegevens benaderen zonder om één cachepoort te concurreren. Lagere caches zijn meestal gecombineerd en slaan zowel instructie- als gegevensblokken op.

Sommige hiërarchieën zijn inclusief: een blok dat boven aanwezig is, heeft ook een kopie eronder. Andere zijn exclusief of niet-inclusief, zodat een kopie in elke lagere cache niet gegarandeerd is. Teken een hiërarchie als een zoek- en overdrachtspad, niet als een belofte dat alle niveaus identieke deelverzamelingen bevatten.

Een grotere L1-cache kan missers verminderen, maar de toegangsvertraging en het energieverbruik verhogen. Door grotere lagere caches toe te voegen kan het ontwerp L1 snel houden en veel van de L1-missers opvangen voordat ze DRAM bereiken. Beoordeel die afweging op basis van toegangstijd, niet alleen capaciteit.

Belangrijkste punten

  • Een treffer of misser heeft betrekking op het niveau dat wordt gecontroleerd.
  • De cachetoegangstijd geldt voor elke opzoeking; de extra vertraging geldt bij missers.
  • Caches dragen blokken over, terwijl virtueel geheugen pagina's gebruikt.
  • Afzonderlijke L1-instructie- en gegevenscaches ondersteunen gelijktijdige toegangen vanuit de pipeline.
  • Cache-inclusie is een ontwerpkeuze.
  • Grotere capaciteit moet worden afgewogen tegen cachetoegangstijd en energieverbruik.
2

Zoek gegevens in direct afgebeelde en set-associatieve caches

Een geheugenadres moet een cache vertellen waar die moet zoeken en welke bytes die moet teruggeven. Verdeel adressen in velden, volg hoe verzoeken blokken vervangen en geef elk blok vervolgens meer plaatsingsmogelijkheden met sets en posities. Kleine registraties maken de hardwareregels zichtbaar: een andere byte kan een treffer opleveren in een geladen blok, terwijl een herhaaldelijk gebruikt blok na een conflict kan missen. Deze opzoekregels bepalen ook hoeveel adrestags en besturingsbits de cache moet opslaan.

2.1 Bepaal adrestag, index en offset

Een byteadres geeft één byte in het geheugen aan. Een cache haalt een heel blok op, dus bepaalt de cache bij het opzoeken eerst dat blok en selecteert daarna de gevraagde bytes daarin. In een direct afgebeelde cache heeft elk blok precies één mogelijke positie.

Verdeel het adres naar functie

Bij een blokgrootte van 2b bytes vormen de laagste b adresbits de offset. Door het byteadres door de blokgrootte te delen en de rest weg te laten, krijg je het blokadres. De rest is de offset.

Als de cache E posities heeft, is de positie-index

index=blokadres mod E.

Als het aantal posities een macht van twee is, bestaat de index uit de groep adresbits direct boven de offset. De resterende hoge bits vormen de adrestag, die de cache vertelt welk van de vele blokken die een index delen aanwezig is.

De veldvolgorde van hoge naar lage bits is adrestag | index | offset. Voor een adresbreedte van A bits geldt:

b=log⁡2(blokgrootte in bytes),s=log⁡2E,t=A−s−b.

Gebruik het aantal posities voor de indexberekening. Als je de logaritme van de capaciteit in bytes neemt, tel je de offsetbits een tweede keer.

Werk een voorbeeld met 16 KiB uit

Een direct afgebeelde cache van 16 KiB met blokken van 64 bytes heeft 16384/64=256 posities. De offset neemt 6 bits in, de index 8 bits en de adrestag 32−8−6=18 bits bij adressen van 32 bits.

Voor byteadres 0x1234ABCD geven de laagste 6 bits offset 13, of 0x0D. Als je die bits verwijdert, krijg je blokadres 0x48D2AF. De laagste 8 bits daarvan zijn 0xAF, dus is de index 175. De resterende bits geven adrestag 0x48D2.

Het byteadres kan uit deze velden worden gereconstrueerd: voeg de adrestag, de 8-bitsindex en de 6-bitsoffset samen. De veldbreedtes zijn van belang omdat een hexadecimaal cijfer 4 bits voorstelt; de grenzen hoeven niet tussen hexadecimale cijfers te vallen.

Een overeenkomende adrestag vereist een geldige positie

Elke positie bevat gegevens, een adrestag en een geldigheidsbit. De index selecteert de positie. Een treffer vereist zowel een gezette geldigheidsbit als een overeenkomst tussen de opgeslagen en de gevraagde adrestag. Bij het opstarten kan een positie willekeurige bits bevatten; de geldigheidsbit voorkomt dat die bits voor een geladen blok worden aangezien.

Zodra het blok aanwezig is, leveren toegangen tot andere bytes in dat blok ook treffers op. Een treffer vereist niet hetzelfde byteadres als waarmee het blok is opgehaald.

Tel metadata afzonderlijk

De opgegeven cachecapaciteit telt gewoonlijk alleen gegevens. Hier bevat elke positie 512 gegevensbits, 18 tagbits en 1 geldigheidsbit, samen 531 bits. De totale opslag is

256×531=135936 bits.

De gegevens alleen gebruiken 131.072 bits. Adrestags en geldigheidsbits voegen 4.864 bits toe, ongeveer 3,7% van de gegevensopslag. Een ontwerp met terugschrijven heeft ook wijzigingsbits nodig; complexere ontwerpen hebben meer besturingsinformatie nodig.

De index gebruikt lage blokadresbits zodat opeenvolgende blokken over opeenvolgende posities worden verspreid. Bij een breder adres blijven de breedtes van offset en index gelijk als capaciteit en blokgrootte vast blijven; de extra bits verlengen de adrestag.

Belangrijkste punten

  • Bereken het aantal posities door de gegevenscapaciteit te delen door de blokgrootte.
  • De lage adresbits selecteren de byteoffset; de volgende bits selecteren de positie.
  • Een treffer vereist een geldige positie en een overeenkomende adrestag.
  • De opgegeven gegevenscapaciteit is exclusief adrestags en besturingsbits.

2.2 Volg een direct afgebeelde cache

Een cachetoegangsregistratie legt vast hoe elke toegang de opgeslagen blokken verandert. Houd voor elke positie een afzonderlijke toestand bij en werk die direct na elke misser bij. Het volgende verzoek gebruikt de bijgewerkte cache, niet de cache zoals die er aan het begin uitzag.

Stel de registratie op

Neem een direct afgebeelde cache van 64 bytes met vier posities van 16 bytes. Die is aanvankelijk leeg. Deel voor elk byteadres door 16 om het blok te vinden en bereken daarna blok modulo 4 voor de index. De adrestag is het bloknummer gedeeld door 4, waarbij het gebroken deel wordt weggelaten. Er zijn 4 offsetbits en 2 indexbits.

Bekijk bij een leesbewerking de geselecteerde positie. Als die geldig is en de adrestag overeenkomt, noteer je een treffer. Noteer anders een misser, vervang het blok en de adrestag van die positie en zet de geldigheidsbit. In een direct afgebeelde cache is geen vervangingskeuze mogelijk.

Volg alle acht toegangen
ByteadresBlokIndexAdrestagResultaatBlok dat op de gekozen positie blijft
0x00000Misser0
0x04000Treffer0
0x40401Misser4
0x00000Misser0
0x14110Misser1
0x44401Misser4
0x08000Misser0
0x84802Misser8

De eerste toegang vult positie 0 met blok 0. Het volgende adres, 0x04, ligt nog steeds binnen dat blok van 16 bytes en levert dus een treffer op, hoewel het een andere byte aanwijst. 0x40 hoort bij blok 4. Het heeft dezelfde index als blok 0 maar een andere adrestag, dus vervangt het blok 0.

De tweede 0x00 mist daardoor. Eerder gebruik alleen garandeert geen treffer: het blok moet nog steeds aanwezig zijn. Het verzoek om 0x14 laadt blok 1 op positie 1 en laat positie 0 ongewijzigd.

Daarna laadt 0x44 blok 4 opnieuw op positie 0. 0x08 heeft blok 0 nodig en verdringt blok 4. Ten slotte laadt 0x84 blok 8 op diezelfde positie. Aan het einde bevat positie 0 blok 8 en positie 1 blok 1; posities 2 en 3 blijven ongeldig.

Interpreteer het gedrag

Er is één treffer en er zijn zeven missers, dus is de trefferfractie 1/8=12,5%. Blokken 0, 4 en 8 concurreren om positie 0. De cache heeft vier posities, maar dit toegangspatroon gebruikt er slechts twee. De herhaalde verdringingen worden veroorzaakt door afbeeldingsconflicten, niet door een tekort aan totale opslagruimte voor de vier verschillende blokken.

Door een blok te vullen komen alle bytes van dat blok beschikbaar. Bij een opeenvolgende doorloop kan één misser daardoor veel volgende elementen bedienen. Hier nemen de conflicterende toegangen dat voordeel steeds weg voordat de volgende nabijgelegen byte wordt opgevraagd.

Benoem voor een betrouwbare registratie byteadressen en bloknummers expliciet. Als je modulo 4 rechtstreeks op het byteadres toepast, sla je de deling door de blokgrootte over en stuur je verzoeken naar de verkeerde posities. Noteer de vervanging ook wanneer het nieuwe blok eerder is geladen: elke misser plaatst het gevraagde blok en de bijbehorende adrestag op de gekozen positie.

Belangrijkste punten

  • Werk de cache-inhoud na elke misser bij.
  • Verschillende byteadressen in één aanwezig blok leveren treffers op.
  • Een eerder aangesproken blok kan na verdringing een misser opleveren.
  • Afbeeldingsconflicten kunnen missers veroorzaken terwijl andere posities leeg blijven.
  • Het voorbeeld heeft één treffer bij acht toegangen, een trefferfractie van 12,5%.

2.3 Geef blokken meer plaatsingsmogelijkheden

Een set-associatieve cache geeft een blok meerdere mogelijke posities zonder de hele cache te doorzoeken. De index selecteert een set en het blok kan elke positie in die set innemen. Dit vermindert conflicten tussen blokken die een index delen.

Bereken sets en velden

Voor gegevenscapaciteit C, blokgrootte B en associativiteit n geldt:

blokken=C/B,sets=C/(Bn).

De setindex is het blokadres modulo het aantal sets. De offset hangt nog steeds alleen af van de blokgrootte. De adrestag bevat de resterende hoge bits.

Een 8-weg cache van 32 KiB met blokken van 64 bytes heeft 512 blokken en 64 sets. Bij 32-bitsadressen zijn de breedtes van offset, index en adrestag 6, 6 en 20 bits. Adres 0x1234ABCD heeft offset 13, set 47 en adrestag 0x1234A.

Bij vaste capaciteit en blokgrootte halveert een verdubbeling van de associativiteit het aantal sets. Eén indexbit wordt een tagbit; er komt geen gegevenscapaciteit bij.

OrganisatieToegestane plaatsingIndex
Direct afgebeeldEén positieSelecteert die positie
n-wegElke positie van de n posities in één setSelecteert die set
Volledig associatiefElke positie in de cacheGeen indexveld

Bij het opzoeken wordt de adrestag parallel vergeleken met alle geldige adrestags in de gekozen set. Een overeenkomende positie levert de gegevens via een selector. Meer posities per set vereisen meer vergelijkingen en selectiehardware, wat de cachetoegangstijd en het energieverbruik kan verhogen.

Vervang pas een blok als de set vol is

Gebruik eerst een ongeldige positie. Als alle posities bezet zijn, verdringt LRU het blok waarvan de laatste toegang het langst geleden is. Werk de informatie over recent gebruik bij treffers én bij het vullen bij. Een 2-weg set heeft maar één bit nodig om de LRU-positie bij te houden; grotere sets gebruiken vaak pseudo-LRU-benaderingen.

FIFO verdringt het blok dat het eerst is geladen, ook als het onlangs is aangesproken. Willekeurige vervanging kiest een te vervangen blok zonder volledige informatie over recent gebruik bij te houden. Die methode is eenvoudig en kan in grote caches bijna even goed presteren als LRU.

Bekijk de kleine registratie opnieuw met twee posities per set

De cache van 64 bytes met blokken van 16 bytes heeft nu twee sets van twee posities. Blokken 0, 4 en 8 worden op set 0 afgebeeld, terwijl blok 1 op set 1 wordt afgebeeld. Voor 0x00, 0x04, 0x40, 0x00, 0x14, 0x44, 0x08, 0x84 zijn de resultaten misser, treffer, misser, treffer, misser, treffer, treffer, misser.

Blokken 0 en 4 kunnen naast elkaar bestaan, dus leveren herhaalde toegangen ertoe treffers op. Vlak voor de laatste toegang is blok 0 recenter gebruikt dan blok 4. Bij het laden van blok 8 verdringt LRU blok 4. Vier van de acht toegangen leveren een treffer op, tegenover één in de direct afgebeelde versie.

Associativiteit kan eerste-toegangsmissers niet wegnemen en een werkverzameling die groter is dan de capaciteit niet passend maken. Ook kan associativiteit geen conflicten voorkomen wanneer meer dan n veelgebruikte blokken om één n-weg set concurreren. Een herhaalde cyclus van n+1 van zulke blokken kan LRU elke keer laten missen. Door arrays op te vullen kun je veranderen op welke sets ze worden afgebeeld; meer posities per set kiezen is maar één mogelijke reactie op een conflictprobleem.

Belangrijkste punten

  • Het aantal sets is de gegevenscapaciteit gedeeld door de blokgrootte en het aantal posities per set.
  • Meer associativiteit verandert de plaatsingsvrijheid, niet de gegevenscapaciteit.
  • LRU houdt toegangen bij; FIFO houdt de volgorde van plaatsen bij.
  • Vul ongeldige posities voordat je geldige blokken vervangt.
  • Volledig associatieve caches hebben geen indexveld, maar hebben nog steeds eerste-toegangs- en capaciteitsmissers.
  • Meer posities per set kunnen conflictmissers verminderen, maar kosten hardware en tijd.
3

Leg cachemissers en schrijfstrategieën uit

Een misser kan ontstaan door eerste gebruik, beperkte capaciteit of blokken die om dezelfde plaatsen concurreren. Door de oorzaak te herkennen begrijp je welke ontwerpwijzigingen die kunnen verminderen. Opslaginstructies voegen een tweede vraagstuk toe: de hiërarchie moet bepalen wanneer gewijzigde gegevens het volgende niveau bereiken en wat er gebeurt als het blok ontbreekt. Volg de afhandeling van leesmissers, schrijfstrategieën, buffers en de verdringing van gewijzigde blokken om de cachetoestand te verbinden met het verkeer en de vertragingen die daaruit ontstaan.

3.1 Leg uit waardoor een misser ontstond

Een cachemisser is een gebeurtenis met zowel een mechanisme als een oorzaak. Het mechanisme beschrijft hoe het verzoek wordt afgehandeld. De oorzaak verklaart waarom het benodigde blok ontbrak en welke ontwerpwijziging kan helpen.

Handel een leesmisser af

In een eenvoudige pipeline die instructies op volgorde uitvoert, detecteert de cache een ongeldige positie of een niet-overeenkomende adrestag en wacht de processor. De cache vraagt het blok op bij het volgende niveau. Als het gekozen te vervangen blok gewijzigd is, moeten de gewijzigde gegevens door terugschrijven worden bewaard. Het binnenkomende blok wordt met zijn adrestag en geldigheidsbit geplaatst en de wachtende toegang wordt voltooid. Bij een misser in de instructiecache wordt op dezelfde manier op het blok van de instructie gewacht en daarna de instructie opnieuw opgehaald.

Bij het gevraagde woord eerst wordt het benodigde woord als eerste in het terugkerende blok opgevraagd. Bij vroegtijdig hervatten kan de uitvoering doorgaan zodra dat woord aankomt. Een niet-blokkerende cache kan andere treffers afhandelen en openstaande missers bijhouden terwijl een processor die instructies buiten de programmavolgorde uitvoert onafhankelijk werk doet. Deze mechanismen verminderen de wachttijd; ze laten de oorspronkelijke gegevensafhankelijkheid niet verdwijnen.

Gebruik de drie C's
MisserklasseWaarom het blok ontbreektTest
Eerste-toegangsmisserDit is de eerste toegang ertoeDie zou zelfs bij onbeperkte capaciteit missen
CapaciteitsmisserDe actieve blokken overschrijden de beschikbare ruimteEen volledig associatieve LRU-cache van dezelfde grootte mist ook
ConflictmisserPlaatsingsbeperkingen hebben het blok verdrongenEen volledig associatieve LRU-cache van dezelfde grootte treft

Pas eerst de test voor eerste toegang toe. De eerste toegang tot een blok is een eerste-toegangsmisser, ook als de bestemmingspositie al bezet is. Vergelijk bij latere missers de werkelijke cache met een volledig associatieve LRU-cache met dezelfde gegevenscapaciteit en blokgrootte, waarbij beide dezelfde toegangsgeschiedenis ontvangen.

In de eerdere registratie met vier posities veroorzaken blokken 0, 4, 1 en 8 elk één eerste-toegangsmisser. De direct afgebeelde cache mist ook bij de herhaalde toegangen tot blokken 0 en 4. Een volledig associatieve cache met vier posities kan alle vier verschillende blokken bewaren, dus zijn die drie herhaalde missers conflictmissers. Er zijn geen capaciteitsmissers.

Kies een wijziging die de oorzaak aanpakt

Meer capaciteit kan een grotere werkverzameling vasthouden. Meer associativiteit kan ervoor zorgen dat conflicterende blokken naast elkaar passen. Een grotere blokgrootte kan ruimtelijke lokaliteit benutten door bij elke vulling meer bruikbare naburige gegevens binnen te halen.

Blokgrootte heeft tegengestelde effecten. Bij een vaste gegevenscapaciteit betekenen grotere blokken dat minder blokken tegelijk aanwezig zijn. Ongebruikte bytes nemen cacheruimte in, niet-gerelateerde bruikbare blokken kunnen worden verdrongen en elke overdracht kan langer duren. De misserfractie daalt vaak eerst als de blokgrootte groeit en stijgt daarna wanneer deze kosten zwaarder wegen dan de bruikbare ruimtelijke lokaliteit.

Een grotere cache kan ook een langere opzoektijd hebben en extra posities per set vereisen meer vergelijkingshardware. Beoordeel wijzigingen aan de hand van de gemiddelde toegangstijd, inclusief cachetoegangstijd en extra vertraging bij een misser, in plaats van aan te nemen dat een lagere misserfractie een sneller ontwerp garandeert.

In multicore-systemen kan het ongeldig maken na een schrijfbewerking van een andere kern coherentiemissers veroorzaken. Door vooraf ophalen kan een blok vóór de eerste gevraagde toegang binnenkomen, zodat een misser bij die toegang wordt verborgen die extra capaciteit alleen niet kan voorkomen.

Belangrijkste punten

  • Deel eerste toegangen in als eerste-toegangsmissers voordat je andere oorzaken controleert.
  • Gebruik een volledig associatieve LRU-cache van dezelfde grootte om capaciteits- en conflictmissers te onderscheiden.
  • Grotere blokken wegen bruikbare ruimtelijke lokaliteit af tegen minder aanwezige blokken en langere overdrachten.
  • Vroegtijdig hervatten, het gevraagde woord eerst en niet-blokkerende caches verminderen de wachttijd op verschillende manieren.
  • Vergelijk de volledige toegangstijd bij het beoordelen van een verbetering van de misserfractie.

3.2 Bepaal wanneer opslaginstructies het volgende niveau bereiken

Een opslaginstructie verandert een waarde, dus heeft de hiërarchie een regel nodig om die verandering naar beneden door te geven. Daarbij zijn twee afzonderlijke keuzes betrokken: wat gebeurt er als een opslaginstructie een treffer oplevert en wat als die mist?

Direct doorschrijven en terugschrijven
StrategieActie bij een schrijftrefferGevolg voor het volgende niveau
Direct doorschrijvenWerk de cache bij en stuur de opslaginstructie naar benedenElke opslaginstructie werkt het lagere niveau bij
TerugschrijvenWerk de cache bij en markeer het blok als gewijzigdEen gewijzigd blok wordt bij verdringing naar beneden gestuurd

Een wijzigingsbit legt vast dat een blok in een cache met terugschrijven wijzigingen bevat die nog niet naar het volgende niveau zijn geschreven. Een ongewijzigd te vervangen blok hoeft niet te worden teruggeschreven. De gewijzigde gegevens van een te vervangen blok moeten worden bewaard voordat de positie opnieuw kan worden gebruikt. De laadbewerkingen van de processor halen de nieuwe waarde uit de cache, ook terwijl de lagere kopie ouder is.

Bij 100 opslaginstructies naar één variabele van 4 bytes in de cache stuurt direct doorschrijven zonder samenvoeging 100 schrijfbewerkingen, of 400 bytes aan gegevens. Terugschrijven kan die wijzigingen combineren in één schrijfbewerking van een blok van 64 bytes bij verdringing. Deze vergelijking telt de gegevens van de bijwerkingen, zonder de eerste vulling en protocoloverhead.

Het voordeel hangt af van hergebruik. Herhaaldelijk naar één blok schrijven geeft terugschrijven de kans om bijwerkingen te combineren; schrijfbewerkingen verspreid over veel blokken kunnen leiden tot veel verdringingen van gewijzigde blokken. Lagere caches gebruiken vaak terugschrijven om het verkeer naar DRAM te beperken. L1-gegevenscaches kunnen beide strategieën gebruiken.

Een schrijfbuffer verbergt wachttijd, geen verkeer

Een schrijfbuffer zet schrijfbewerkingen die nog naar een lager niveau moeten in een wachtrij. Bij direct doorschrijven kan de processor doorgaan zodra een opslaginstructie in de buffer staat, in plaats van te wachten tot het lagere geheugen klaar is. Het lagere niveau loopt bij naarmate de gebufferde schrijfbewerkingen worden verwerkt; het kan tijdelijk achterlopen op de waarde in de cache.

De buffer heeft een eindige capaciteit. Als opslaginstructies lang genoeg sneller binnenkomen dan het lagere niveau ze accepteert, raakt de buffer vol en wacht de processor. Een buffer verandert wanneer de processor wacht, niet de blijvend haalbare bandbreedte van de bestemming.

Zonder buffering of overlap wordt een basis-CPI van 1 gelijk aan 1+0,1×100=11 als 10% van de instructies opslaginstructies zijn en elke opslaginstructie 100 wachtcycli toevoegt. Buffering kan veel van deze vertraging verbergen als de bestemming het gemiddeld bijhoudt.

Behandel een schrijfmisser afzonderlijk

Bij cachetoewijzing bij een schrijfmisser wordt het ontbrekende blok eerst in de cache opgehaald en daarna wordt de opslaginstructie erop toegepast. Dit gaat goed samen met terugschrijven, omdat latere toegangen en schrijfbewerkingen dat blok opnieuw kunnen gebruiken. Bij geen cachetoewijzing bij een schrijfmisser wordt de opslaginstructie naar beneden gestuurd zonder deze cache te vullen. Dit gaat goed samen met direct doorschrijven en kan voorkomen dat bruikbare blokken worden verdrongen tijdens een eenmalige uitvoerstroom.

Dit zijn onafhankelijke strategiekeuzes. Als je weet dat een cache direct doorschrijft, weet je daarmee nog niet of bij een schrijfmisser een lijn wordt toegewezen; een registratie moet beide strategieën specificeren.

Een misser in een cache met terugschrijven die een gewijzigd blok voor vervanging kiest, omvat zowel uitgaande gegevens als de binnenkomende vulling. Dit verhoogt de extra vertraging, tenzij buffers of overlap een deel van het werk verbergen. Andere kernen en I/O-apparaten hebben ook een consistent beeld nodig wanneer het lagere geheugen verouderde gegevens bevat. Coherentie en systeemmechanismen coördineren die zichtbaarheid; een wijzigingsbit alleen legt slechts openstaande wijzigingen vast.

Belangrijkste punten

  • Direct doorschrijven stuurt elke opslaginstructie naar beneden; terugschrijven stelt wijzigingen uit tot het gewijzigde blok wordt teruggeschreven.
  • Een wijzigingsbit onderscheidt gewijzigde blokken van ongewijzigde.
  • Schrijfbuffers verbergen latentie totdat ze vol raken; ze creëren geen bandbreedte.
  • Cachetoewijzing of geen cachetoewijzing bij een schrijfmisser bepaalt het gedrag bij een schrijfmisser, onafhankelijk van de strategie bij een treffer.
  • De verdringing van een gewijzigd blok voegt uitgaand verkeer toe aan de afhandeling van de misser.
  • Bij gebufferd direct doorschrijven kan het lagere niveau tijdelijk achterlopen.
4

Bereken cacheprestaties

Een cacheontwerp is alleen nuttig als de treffers en missers tot een betere uitvoeringstijd leiden. Combineer opzoektijd, misserfrequentie en extra vertraging bij missers en verbind daarna toegangskosten met wachtcycli per instructie. Houd instructie- en gegevensverkeer gescheiden, gebruik cycli en kloktijd consequent en nest de kosten van lagere caches met de fractie verzoeken die elk niveau bereikt. Deze berekeningen laten zien waarom een lagere misserfractie of hogere klokfrequentie minder voordeel kan geven dan verwacht.

4.1 Bereken de gemiddelde geheugentoegangstijd

Een hoge trefferfractie is nuttig, maar geen volledige prestatiemaat. Een klein aantal dure missers kan het gemiddelde domineren en een ontwerp dat meer missers voorkomt kan toch verliezen als het opzoeken te langzaam wordt.

Begin met fracties en tijdsdefinities
trefferfractie=trefferstoegangen,misserfractie=misserstoegangen.

De twee fracties tellen op tot één. Zet percentages vóór het vermenigvuldigen om in fracties: 5% is 0,05.

De gemiddelde geheugentoegangstijd, of AMAT, is

AMAT=cachetoegangstijd+misserfractie×extra vertraging bij een cachemisser.

Elk verzoek controleert de cache, ook verzoeken die missen. De extra vertraging komt na die opzoeking. Je kunt ook de cachetoegangstijd wegen met de trefferfractie en de totale tijd voor een misser met de misserfractie; uitwerken geeft dezelfde formule.

Bij een cachetoegangstijd van 1 cyclus, 5% missers en een extra vertraging van 100 cycli is de AMAT 1+0,05×100=6 cycli. Bij 2 GHz duurt elke cyclus 0,5 ns, dus is dit 3 ns. Reken alles uit in cycli of alles in tijd en zet zo nodig het eindresultaat om.

Vergelijk volledige ontwerpen

Cache A heeft een opzoektijd van 1,0 ns en 5% missers. Cache B heeft een opzoektijd van 1,2 ns en 3,5% missers. Bij een extra vertraging van 50 ns geldt:

A=1+0,05×50=3,5 ns, B=1,2+0,035×50=2,95 ns.

B wint omdat het voorkomen van dure missers de langzamere opzoeking ruimschoots goedmaakt. Als de extra vertraging daalt naar 10 ns, duurt A 1,5 ns en B 1,55 ns. Nu wint A. De waarde van een verbetering van de misserfractie staat in verhouding tot de extra vertraging die ermee wordt vermeden.

Weeg instructie- en gegevenstoegangen correct

Stel dat elke instructie gemiddeld één instructieophaling en 0,3 gegevenstoegangen oplevert. De misserfractie voor instructies is 2% en die voor gegevens 4%. Bij 100 instructies zijn er 100 ophalingen en 30 gegevenstoegangen. Het verwachte aantal missers is 100×0,02+30×0,04=3,2 op 130 toegangen.

De gecombineerde misserfractie is daarom 0,02+0,3×0,041,3. Bij gelijke cachetoegangstijden van 1 cyclus en extra vertragingen van 100 cycli is de AMAT ongeveer 3,46 cycli per geheugentoegang. Rechtstreeks het gemiddelde van 2% en 4% nemen zou de twee soorten toegang ten onrechte even zwaar laten meetellen.

Schat de extra vertraging door overdracht

Een blokverzoek kan een initiële latentie omvatten, gevolgd door overdrachtstijd. Bij 60 ns latentie, een lijn van 64 bytes en 16 GB/s bandbreedte duurt de overdracht 4 ns, zodat de extra vertraging ongeveer 64 ns is. Bij 3 GHz zijn er 3 cycli/ns, dus is dat 192 cycli.

Controleer wat de opgegeven tijden in een opgave omvatten. Als de volledige toegangstijd bij een misser wordt gegeven, trek dan de tijd voor het opzoeken in de cache af voordat je dat getal als extra vertraging bij een misser gebruikt. Als je de opzoektijd tweemaal meetelt, wordt de AMAT overschat.

Belangrijkste punten

  • AMAT telt de cachetoegangstijd op bij de verwachte extra kosten van missers.
  • Gebruik decimale misserfracties en één consistente tijdseenheid.
  • Weeg de fracties voor instructies en gegevens naar hun aantallen toegangen.
  • Een lagere misserfractie kan verliezen van een voldoende langere cachetoegangstijd.

4.2 Reken missers om naar uitvoeringstijd

AMAT meet de tijd per geheugentoegang. CPI meet het aantal cycli per uitgevoerde instructie. Om ze te verbinden tel je hoeveel instructie- en gegevensverzoeken elke instructie oplevert en hoeveel wachtcycli die verzoeken toevoegen.

Tel de wachttermen op

Voor een eenvoudige processor die instructies op volgorde uitvoert en waarvan de cachetreffers in de basis-CPI zijn opgenomen, voegt een misser waarvan de vertraging niet overlapt de extra vertraging toe. Met instructiemisserfractie mI, gegevenstoegangen per instructie fD, gegevensmisserfractie mD en extra vertraging P in cycli geldt:

extra CPI door wachtcycli=mIP+fDmDP, CPU-tijd=aantal uitgevoerde instructies×(basis-CPI+extra CPI door wachtcycli)×klokcyclustijd.

Elke instructie heeft in dit model één verzoek om de instructie op te halen. Alleen laad- en opslaginstructies doen gegevensverzoeken, dus vermenigvuldig je hun misserfractie met hun frequentie. Als hun extra vertragingen verschillen, gebruik je in elke term een afzonderlijke vertraging.

Van verzoeken naar wachtcycli

Neem een basis-CPI van 1,0, een instructiemisserfractie van 2%, een laad- en opslagfrequentie van 30%, een gegevensmisserfractie van 4% en een extra vertraging van 100 cycli bij een misser. Instructiewachtcycli zijn 0,02×100=2,0 cycli per instructie. Gegevenswachtcycli zijn 0,3×0,04×100=1,2. De totale CPI is 4,2.

Met een perfecte cache zou de CPI terugkeren naar 1,0. Bij dezelfde klokfrequentie en hetzelfde aantal uitgevoerde instructies zou dat een versnellingsfactor van 4,2 opleveren. De gegevensmisserfractie is tweemaal zo groot als de instructiemisserfractie, maar instructiemissers kosten in totaal meer tijd omdat elke instructie wordt opgehaald en slechts 30% gegevens aanspreekt.

Vul AMAT niet rechtstreeks in als CPI. AMAT is per toegang en omvat de tijd voor een treffer. De CPI-berekening hier telt alleen wachtcycli op boven op de basisuitvoering die al is meegeteld.

Een hogere klokfrequentie laat elke geheugenwachttijd meer cycli kosten

De DRAM-latentie in nanoseconden wordt niet korter wanneer de klokfrequentie van de processor stijgt. Een verdubbeling van de klokfrequentie zet dezelfde geheugenwachttijd van 100 cycli om in 200 cycli bij de nieuwe frequentie. De CPI van het voorbeeld wordt

1+0,02×200+0,3×0,04×200=7,4.

Elke nieuwe cyclus duurt half zo lang, dus verandert de relatieve uitvoeringstijd van 4,2 oude cycli per instructie naar het equivalent van 3,7 oude cycli. De versnellingsfactor is 4,2/3,7≈1,14, ruim onder twee.

Verbeteringen verplaatsen de bottleneck

Als de basis-CPI daalt van 1,0 naar 0,5 terwijl de geheugenwachtcycli op 3,2 blijven, wordt de totale CPI 3,7. Wachtcycli nemen nu 3,2/3,7≈86% van de cycli in beslag. Een betere kern maakt de ongewijzigde geheugenvertraging tot een groter deel van de uitvoeringstijd, een voorbeeld van de wet van Amdahl.

Het eenvoudige model telt alle vertragingen door missers als wachtcycli. Uitvoering buiten de programmavolgorde en niet-blokkerende caches kunnen missers laten overlappen met nuttig werk of andere missers. Prestatietellers in de hardware en metingen van de uitvoeringstijd zijn nodig om die overlap op een echte machine te beoordelen. Houd bij het vergelijken van ontwerpen met dit model dezelfde instructiestroom aan en vermeld welke vertragingen al in de basis-CPI zijn opgenomen.

Belangrijkste punten

  • Tel instructiemissers voor elke instructie en gegevensmissers alleen voor gegevenstoegangen.
  • Tel extra wachtcycli door missers op bij een basis-CPI waarin treffers al zijn opgenomen.
  • Reken de geheugentijd opnieuw om naar cycli als de klokfrequentie verandert.
  • Vergelijk uitvoeringstijd via CPI maal klokcyclustijd, niet alleen via CPI.
  • Overlap kan de werkelijke wachtcycli kleiner maken dan de eenvoudige som van de extra vertragingen bij missers.

4.3 Nest de kosten van meerdere cacheniveaus

Een lagere cache vermindert de extra vertraging die bij een L1-misser wordt betaald. Die cache heeft een eigen opzoektijd en misserfractie, dus moeten de verwachte kosten van de hiërarchie rekening houden met de fractie verzoeken die elk niveau bereikt.

Houd de noemer bij de fractie

De lokale misserfractie van een niveau is het aantal missers gedeeld door de verzoeken aan dat niveau. De globale misserfractie is het aantal missers gedeeld door alle geheugenverzoeken van de processor.

Als L1 in 4% van de gevallen mist en L2 bij 25% van die verzoeken mist, bereikt slechts 0,04×0,25=0,01, of 1% van de oorspronkelijke verzoeken, het geheugen. Een lokale L2-misserfractie van 25% zegt op zichzelf niets over de fractie van alle verzoeken die het geheugen bereikt: L1 heeft de stroom eerst gefilterd.

Voor twee achtereenvolgens gecontroleerde niveaus geldt:

AMAT=H1+m1(H2+m2P).

Hier zijn H1 en H2 opzoektijden, m1 en m2 lokale misserfracties en is P de extra vertraging van het geheugen. Alleen L1-missers betalen de L2-opzoektijd. Alleen missers in beide niveaus betalen de extra vertraging van het geheugen.

Reken van binnen naar buiten

Gebruik een L1-toegangstijd van 1 cyclus, een L1-misserfractie van 4%, een L2-toegangstijd van 12 cycli, een lokale L2-misserfractie van 25% en een extra vertraging van het geheugen van 200 cycli. Een verzoek dat L2 bereikt, kost gemiddeld 12+0,25×200=62 extra cycli. Dus geldt

AMAT=1+0,04×62=3,48 cycli.

Zonder L2 zou AMAT 1+0,04×200=9 cycli zijn. Het opzoeken in L2 voegt werk toe aan elke L1-misser, maar voorkomt dat de meeste van die verzoeken de veel grotere geheugenvertraging betalen.

Vervang m2 binnen de haakjes niet door de globale L2-misserfractie van 1%. Dan zou je tweemaal met de L1-misserfractie vermenigvuldigen. Een equivalente uitgeschreven vorm gebruikt de globale fractie rechtstreeks:

AMAT=H1+m1H2+(m1m2)P.
Voeg L3 toe volgens dezelfde logica

Bij een L3-toegangstijd van 40 cycli en een lokale misserfractie van 40% is de L3-afhandelingsterm 40+0,4×200=120 cycli. De L2-term wordt 12+0,25×120=42 cycli. De totale AMAT is 1+0,04×42=2,68 cycli.

De volledige uitdrukking is H1+m1(H2+m2(H3+m3P)). L3 wordt alleen meegerekend voor verzoeken die in beide hogere niveaus missen. Een niveau met een zeer langzame opzoektijd of zeer weinig treffers kan meer vertraging toevoegen dan het bespaart.

Gebruik aantallen per instructie voor de CPI

Stel dat de basis-CPI 1 is, L1 0,032 missers per instructie oplevert en het geheugen 100 cycli toevoegt. Zonder L2 is de CPI 1+0,032×100=4,2. Voeg een L2-cache van 10 cycli toe met een lokale misserfractie van 25%:

CPI=1+0,032×10+0,032×0,25×100=2,12.

Bij dezelfde klokfrequentie is de versnellingsfactor 4,2/2,12≈1,98. De waarde 0,032 is al het aantal missers per instructie, dus zou een extra vermenigvuldiging met de toegangsfrequentie die frequentie tweemaal meetellen.

Belangrijkste punten

  • Lokale en globale misserfracties hebben verschillende noemers.
  • Vermenigvuldig lokale misserfracties om de fractie te vinden die een lager niveau bereikt.
  • Bereken geneste afhandelingstijden vanaf het laagste niveau omhoog.
  • Reken de opzoektijd van een lager niveau alleen toe aan verzoeken die dat niveau bereiken.
  • Gebruik missers per instructie rechtstreeks bij het berekenen van de extra CPI door wachtcycli.
  • Een extra cache helpt alleen als de vermeden vertraging groter is dan het toegevoegde opzoekwerk.
5

Leg uit hoe virtueel geheugen en TLB's in de geheugenhiërarchie passen

Programma's geven virtuele adressen uit, terwijl caches uiteindelijk fysieke gegevens identificeren. Paginatabellen leveren de afbeelding en toegangsrechten en een TLB houdt recent gebruikte vertalingen dicht bij de processor. Doorloop een adresvertaling, onderscheid een ontbrekende vertaling van een paginafout en bekijk hoe cache-indexering kan overlappen met vertaling. Dezelfde ideeën over hiërarchie gelden hier, maar vertaalitems, gegevensblokken en pagina's hebben verschillende taken.

5.1 Vertaal pagina's en controleer toegangsrechten

Virtueel geheugen scheidt de adressen die een programma gebruikt van de plaatsen waar de gegevens in het hoofdgeheugen staan. Elk proces krijgt een eigen virtuele adresruimte. Hardware vertaalt adressen met behulp van afbeeldingen van het besturingssysteem en controleert of elke gevraagde toegang is toegestaan.

Vervang het paginanummer en behoud de offset

Een pagina is een gebied met virtuele adressen van vaste grootte. Een paginakader is een plaats ter grootte van een pagina in het fysieke geheugen. Bij pagina's van 4 KiB bevat elke pagina 4096 bytes, dus heeft de paginaoffset 12 bits nodig. De resterende hoge bits van het virtuele adres vormen het virtuele paginanummer, of VPN.

Een paginatabelitem, of PTE, beeldt een VPN af op een fysiek paginanummer, of PPN. De vertaling vervangt het paginanummer maar behoudt de offset: binnen het fysieke paginakader wordt dezelfde bytepositie geselecteerd.

Voor virtueel adres 0x00403A7C geven de laagste 12 bits offset 0xA7C en is het VPN 0x00403. Als dat VPN op PPN 0x02F1C wordt afgebeeld, is het fysieke adres 0x02F1CA7C. Een 12-bitsoffset toevoegen komt overeen met het PPN met 4096 vermenigvuldigen en de offset optellen; het onverschoven PPN optellen zou het verkeerde adres geven.

Een afbeelding omvat toegangsrechten

Een PTE legt geldigheid, een fysiek paginanummer en rechten zoals lezen, schrijven, uitvoeren en gebruikerstoegang vast. Toegangs- en wijzigingsbits registreren gebruik en wijzigingen. Een bevoorrecht processorregister geeft de paginatabel aan; RISC-V gebruikt satp. Gebruikersprogramma's kunnen deze afbeeldingen niet vrij herschrijven.

Afzonderlijke paginatabellen laten hetzelfde virtuele adres in verschillende processen naar verschillende fysieke gegevens verwijzen. Ze maken ook gericht delen mogelijk: twee processen kunnen virtuele pagina's op hetzelfde fysieke paginakader afbeelden, bijvoorbeeld om alleen-lezen bibliotheekcode te delen. Isolatie en delen zijn beide gevolgen van gecontroleerde afbeeldingen.

Een paginafout vereist aandacht van het besturingssysteem

Een paginafout is een uitzondering die optreedt wanneer de vertaling of de controle van de toegangsrechten niet normaal kan worden voltooid. Een opslaginstructie naar een alleen-lezen afbeelding kan een paginafout veroorzaken, ook als de pagina al in het geheugen staat.

Als een benodigde pagina in het hoofdgeheugen ontbreekt, verkrijgt het besturingssysteem een fysiek paginakader, leest het de pagina uit de opslag, werkt het de afbeelding bij en start het de instructie opnieuw. Een gewijzigde pagina die wordt vervangen moet mogelijk eerst worden teruggeschreven. Sommige fouten worden zonder opslag afgehandeld, zoals het instellen van een afbeelding naar een bestaande pagina of het afhandelen van kopiëren bij schrijven. Een toegang die het systeem niet kan toestaan kan daarentegen eindigen in een procesfout.

Paginafouten waarvoor opslag nodig is, zijn duur. Bij 3 GHz kost een vertraging van 50 µs 150.000 cycli en kost 1 ms 3.000.000 cycli. Grote pagina's spreiden de overdrachtskosten over veel bytes. Een virtuele pagina kan elk geschikt paginakader innemen en gewijzigde pagina's worden teruggeschreven omdat elke opslaginstructie doorsturen naar de opslag te langzaam zou zijn.

Paginatabellen gebruiken ook geheugen

Een vlakke tabel voor virtuele adressen van 32 bits en pagina's van 4 KiB heeft 232−12=220 items nodig. Bij 4 bytes per item is dat 4 MiB per proces. Echte ontwerpen gebruiken tabellen met meerdere niveaus om te voorkomen dat één enorme vlakke tabel voor ijl gevulde adresruimtes moet worden toegewezen; RISC-V Sv39 gebruikt drie niveaus.

Virtueel geheugen omvat adresvertaling, beveiliging en delen, ook wanneer elke gebruikte pagina in DRAM past. Paging met opslag is één toepassing van dat mechanisme, niet het hele doel.

Belangrijkste punten

  • Vertaling verandert het paginanummer en behoudt de paginaoffset.
  • PTE-toegangsrechten regelen lezen, schrijven, uitvoeren en gebruikerstoegang.
  • Een paginafout kan een ontbrekende pagina of een probleem met toegangsrechten betekenen.
  • Sommige paginafouten worden afgehandeld zonder uit de opslag te lezen.
  • Paginatabellen ondersteunen procesisolatie en bewust delen.
  • Een vlakke tabel heeft één item per virtuele pagina en kan dus veel opslagruimte kosten.

5.2 Bewaar vertalingen in een TLB

Adresvertaling kan meerdere leesbewerkingen van de paginatabel vereisen voordat een gegevenstoegang doorgaat. Paginatabelitems kunnen treffers opleveren in gewone caches, maar die leesbewerkingen voegen nog steeds werk toe. De vertaalbuffer, of TLB, bewaart recent gebruikte vertalingen, zodat de meeste toegangen het doorlopen van de paginatabel kunnen vermijden.

Volg een toegestane toegang

Het virtuele paginanummer wordt opgezocht in de TLB. Een overeenkomend item levert het fysieke paginanummer en informatie over de toegangsrechten. Na controle van de rechten identificeert het fysieke adres de gegevens in de cachehiërarchie.

Bij een TLB-misser wordt de vertaling verkregen door de paginatabel te doorlopen. Als de afbeelding geldig is en het verzoek toestaat, wordt de vertaling in de TLB geplaatst en gaat de toegang verder. RISC-V en x86-64 gebruiken hiervoor gewoonlijk hardware; sommige architecturen gebruiken softwareafhandelaars. Als de afbeelding het verzoek niet kan afhandelen, veroorzaakt de processor een paginafout voor het besturingssysteem.

Een TLB-misser kan dus samengaan met een treffer of een misser in de gegevenscache. De misser zegt dat de vertaling in de TLB ontbrak, niet dat de pagina in DRAM ontbrak. Omgekeerd kan een TLB-treffer samengaan met een cachemisser of een fout in de toegangsrechten bij een verboden toegang. Vertaling en aanwezigheid van gegevens beantwoorden verschillende vragen.

Tel het geheugen dat door vertalingen wordt gedekt

Het TLB-bereik is het aantal items maal de paginagrootte. Een TLB met 64 items en pagina's van 4 KiB dekt tegelijk 256 KiB. Met pagina's van 2 MiB dekken 64 items 128 MiB. Toegang tot veel verschillende pagina's kan de vertaalcapaciteit uitputten, ook als van elke pagina slechts enkele bytes worden gebruikt.

TLB's op het eerste niveau bevatten vaak tientallen items; lagere TLB-niveaus kunnen honderden of duizenden items bevatten. Hun items omvatten paginanummertags, fysieke afbeeldingen, toegangsrechten en vaak adresruimte-identificatoren. Lokaliteit binnen pagina's en hergebruik bij nabijgelegen toegangen houden de trefferfractie voor vertalingen hoog.

Als bijvoorbeeld 1% van de toegangen vereist dat de paginatabel gedurende 30 cycli wordt doorlopen en de tijd van een TLB-treffer verder wordt verborgen, voegt het doorlopen gemiddeld 0,01×30=0,3 cycli per toegang toe. Dit voorbeeld gaat ervan uit dat het doorlopen normaal wordt voltooid en laat de afhandeling van paginafouten buiten beschouwing.

Laat indexering en vertaling overlappen

Een fysiek geïndexeerde, fysiek getagde cache wacht op een fysiek adres voordat die een set selecteert. Een virtueel geïndexeerde, fysiek getagde cache, of VIPT-cache, begint een set te lezen terwijl de TLB vertaalt en vergelijkt daarna fysieke adrestags.

Het eenvoudige VIPT-ontwerp haalt alle index- en blokoffsetbits uit de paginaoffset, omdat vertaling die bits behoudt. Dit vereist

cachecapaciteitposities per set≤paginagrootte.

Bij pagina's van 4 KiB heeft een 8-weg cache van 32 KiB 4 KiB per positie en voldoet die. Een 12-weg cache van 48 KiB voldoet ook. Een 8-weg cache van 64 KiB heeft 8 KiB per positie en heeft een paginanummerbit nodig voor de indexering, dus vereist die meer posities per set of een aanvullende afhandeling.

Houd bewaarde afbeeldingen actueel

Vertalingen behoren bij adresruimtes. Bij een contextwisseling kunnen oude items worden verwijderd of met adresruimte-identificatoren, of ASID's, worden onderscheiden. Wijzigingen in afbeeldingen vereisen overeenkomstig onderhoud van de vertaalcache; RISC-V biedt sfence.vma. Als een pagina uit het geheugen wordt verdrongen, mag de oude vertaling ervan niet bruikbaar blijven in de TLB. De TLB bevat afbeeldingen en toegangsrechten, terwijl gewone caches de gegevens en instructies van het programma bevatten.

Belangrijkste punten

  • Een TLB slaat vertalingen en toegangsrechten op, geen programmagegevens.
  • Het succesvol doorlopen van de paginatabel verhelpt een TLB-misser zonder paginafout.
  • Het TLB-bereik is het aantal items maal de paginagrootte.
  • Eenvoudige VIPT-indexering laat index- en blokoffsetbits binnen de paginaoffset passen.
  • ASID's en het ongeldig maken van vertalingen voorkomen het gebruik van afbeeldingen uit de verkeerde adresruimte of van een oude afbeelding.
6

Schrijf programma's die rekening houden met de cache

Lussen en gegevensindelingen bepalen welke bytes een processor als volgende opvraagt. Volg die adressen om de ruimtelijke lokaliteit te verbeteren, bruikbare gegevens door blokgewijze verwerking te behouden en te begrijpen wanneer vooraf ophalen wachttijd kan verbergen. Vergelijk rij- en kolomdoorlopen, indelingen voor records en het geheugenbeslag van rekenblokken voordat je een wijziging meet. Capaciteit, setconflicten, vertaalbereik en geheugenbandbreedte helpen allemaal verklaren waarom een aanpassing bij de ene werklast werkt en bij de andere minder helpt.

6.1 Kies lussen en indelingen die elke lijn gebruiken

Code die rekening houdt met de cache gebruikt opgehaalde bytes voordat hun blok wordt verdrongen. Begin met de adressen die de binnenste lus genereert. Vraag vervolgens welke gegevens opnieuw worden gebruikt, hoe ver toegangen uit elkaar liggen en of die blokken samen in de cache kunnen worden bewaard.

Doorloop arrays in opslagvolgorde

C en C++ slaan rechthoekige arrays op in rijgewijze opslagvolgorde. Aangrenzende kolommen van één rij liggen naast elkaar in het geheugen. Fortran, MATLAB en Julia gebruiken kolomgewijze opslagvolgorde; NumPy-arrays gebruiken standaard rijgewijze opslagvolgorde. Een efficiënte binnenste doorloop volgt de werkelijke indeling.

Een C-array double a[1024][1024] neemt 8 MiB in. Elke rij beslaat 8192 bytes. Bij cachelijnen van 64 bytes bevat elke lijn acht doubles. Een rijdoorloop kan alle acht gebruiken voordat die verdergaat, wat in een eenvoudig model met ophalen op verzoek ongeveer één eerste-toegangsmisser per acht toegangen geeft.

Een kolomdoorloop maakt stappen van 8192 bytes tussen opeenvolgende toegangen. Die raakt 1024 verschillende lijnen voordat nabijgelegen gegevens in de volgende kolom opnieuw worden gebruikt. Die lijnen nemen 64 KiB in en overschrijden daarmee een L1-cache van 32 KiB. Ze conflicteren ook: in een cache met 64 sets behoudt een stapgrootte van 128 lijnen de setindex. Een 8-weg set kan geen 1024 concurrerende lijnen bevatten.

Als je een rij opvult tot 1032 doubles, wordt de stapgrootte 8256 bytes, of 129 lijnen. Opeenvolgende rijen gaan dan telkens één set verder modulo 64, waardoor de verzoeken worden gespreid. Opvulling pakt afbeeldingsconflicten aan; de hoeveelheid gegevens blijft van belang.

Verwissel lussen als het resultaat behouden blijft

Verwisseling van lusvolgorde verandert welke lus binnen een andere loopt. Bij rijgewijze matrixvermenigvuldiging doorloopt de volgorde i, j, k een rij van A, maar een kolom van B. In een model met grote gegevensstromen en weinig hergebruik tussen doorgangen kost dit ongeveer 1/8+1=1,125 missers per binnenste iteratie.

Bij i, k, j doorloopt de binnenste lus rijen van B en C, terwijl één element van A opnieuw wordt gebruikt. Als je voor beide rijen een nieuwe stroom telt, geeft dat ongeveer 1/8+1/8=0,25 missers per iteratie, 4,5 keer minder. Als de herhaaldelijk bijgewerkte rij van C aanwezig blijft, nadert het aantal 0,125. Cachecapaciteit en conflicten bepalen welk hergebruik behouden blijft.

Verwisseling moet het vereiste gedrag van de berekening behouden. Afhankelijkheden, overlappende pointers en de evaluatievolgorde van drijvendekommabewerkingen kunnen aanpassingen beperken; compilers hebben bewijs nodig dat een wijziging is toegestaan.

Haal de velden op die je gebruikt

Een array van structuren groepeert alle velden van één object. Een structuur van arrays groepeert één veld over objecten heen. Als een deeltjesrecord acht doubles in één lijn van 64 bytes bevat, haalt het optellen van alleen x over één miljoen uitgelijnde records ongeveer 64 MB op. Een afzonderlijke aaneengesloten array x haalt ongeveer 8 MB op en gebruikt elke binnengehaalde double. Code die alle deeltjesvelden samen gebruikt, kan baat hebben bij de oorspronkelijke structuurindeling.

Gekoppelde knooppunten kunnen verspreid liggen en elk volgend adres kan afhangen van een zojuist geladen pointer. Aaneengesloten arrays of pools van knooppunten kunnen de lokaliteit verbeteren. Compacte veelgebruikte velden laten ook meer actieve gegevens binnen elk niveau passen.

Meet de uitvoeringstijd en relevante prestatietellers in de hardware vóór en na een wijziging. Cachemissers kunnen een langzame lus verklaren, maar berekeningen, bandbreedte of sprongen kunnen de beperkende factor zijn. Houd de invoer en resultaten vergelijkbaar zodat een snelheidsverschil de beoordeelde wijziging weerspiegelt.

Belangrijkste punten

  • Stem de binnenste lus af op de opslagvolgorde van de array.
  • Grote stapgroottes die een macht van twee zijn kunnen verzoeken in één set concentreren.
  • Opvulling verandert de afbeelding; compacte indelingen verminderen het aantal opgehaalde bytes.
  • Verwisseling van lusvolgorde moet het vereiste gedrag van de berekening behouden.
  • Kies arrays van structuren of structuren van arrays op basis van de gebruikte velden.
  • Meet de bottleneck en controleer resultaten wanneer je code wijzigt.

6.2 Gebruik rekenblokken opnieuw en haal gegevens vooruit op

Verwisseling van lusvolgorde verbetert de toegangsvolgorde. Blokgewijze verwerking, ook wel verwerking in rekenblokken genoemd, gaat verder door een klein gebied met gegevens actief te houden totdat het nuttige hergebruik is voltooid. Vooraf ophalen verplaatst een toekomstige overdracht naar een eerder moment, zodat de vertraging overlapt met nuttig werk.

Houd een groep rekenblokken aanwezig

Bij blokgewijze vermenigvuldiging van vierkante matrices dragen één blok van A en één blok van B bij aan één blok van C. Een blok met zijde b bevat b2 elementen. Door herhaaldelijk op deze kleine blokken te werken, worden gegevens opnieuw gebruikt voordat de verwerking naar het volgende gebied gaat.

Voor doubles van 8 bytes vereisen drie blokken 3b2×8=24b2 bytes. In een cache van 32 KiB is de capaciteitsgrens

24b2≤32768,b≤32768/24≈36,9.

Een zijde van 32 gebruikt 24.576 bytes, of 24 KiB, en laat enige ruimte over voor andere gegevens. Als je 36 kiest alleen omdat de berekening dat toestaat, blijft veel minder ruimte over en kunnen conflicten optreden. Capaciteit is een eerste schatting; werkelijke blokgroottes worden op basis van metingen afgestemd.

Een blokgewijze doorloop laat de buitenste lus stappen maken ter grootte van het blok. De bovengrenzen van de binnenste lussen stoppen bij de kleinste waarde van het blokeinde en de matrixgrootte. Als een dimensie bijvoorbeeld 70 is en blokken een zijde van 32 hebben, bevat het laatste blok slechts zes elementen langs die dimensie. Een laatste blok van volledige grootte zou buiten de array toegang zoeken.

Schat wat hergebruik bespaart

In een vereenvoudigd model met grote matrices en lijnen van 64 bytes heeft de eenvoudige volgorde i, j, k ongeveer 1,125N3 missers wanneer doorlopen rijen bij de volgende doorgang niet meer in de cache staan. Een blokgewijze versie kan dit verminderen tot ongeveer N3/(4b), aangenomen dat de drie gebruikte blokken in de cache blijven en zonder rekening te houden met conflicten.

Voor N=1024 en b=32 zijn deze schattingen ongeveer 1,2 miljard en 8,4 miljoen missers, een factor 144. Beide versies voeren nog steeds ongeveer 2N3 drijvendekommabewerkingen uit. De besparing zit in herhaalde gegevensverplaatsing, niet in het aantal rekenbewerkingen van de vermenigvuldiging. Het model beschrijft ideaal hergebruik; de gemeten versnellingsfactor hangt ook af van bandbreedte, uitvoering en andere overhead.

Haal vroeg genoeg vooraf op om latentie te verbergen

Hardware die vooraf ophaalt, herkent stromen zoals opeenvolgende toegangen of toegangen met constante stapgrootte. Die vraagt lijnen op voordat ze nodig zijn voor een toegang. Ook software kan vragen om gegevens vooraf op te halen, bijvoorbeeld met __builtin_prefetch van GCC of Clang.

Het tijdstip is van belang. Een verzoek dat te laat wordt gedaan, laat de gevraagde toegang wachten. Een verzoek dat te vroeg wordt gedaan, kan een lijn binnenhalen die vóór gebruik weer wordt verdrongen. Een onnauwkeurig verzoek verbruikt bandbreedte en cacheruimte zonder het programma te helpen. Bij het volgen van pointers is vooraf ophalen moeilijker omdat het volgende adres vaak pas bekend wordt nadat het huidige knooppunt aankomt.

Tijdig vooraf ophalen kan latere missers bij opvragen omzetten in treffers, maar de lijnen reizen nog steeds door de hiërarchie. Het verbergt latentie zonder de vereiste hoeveelheid gegevens voor een opeenvolgende doorloop te verminderen. Blokgewijze verwerking helpt wanneer waarden opnieuw worden gebruikt; een eenmalige doorloop heeft geen herhaalde gegevens om te bewaren en kan al door de geheugenbandbreedte worden begrensd.

Belangrijkste punten

  • Blokgewijze verwerking houdt hergebruikte rekenblokken actief zolang hun gegevens nuttig zijn.
  • Schat de opslag voor rekenblokken van alle arrays die tegelijk nodig zijn.
  • Handel gedeeltelijke randblokken af met begrensde luslimieten.
  • Blokgewijze verwerking vermindert gegevensverplaatsing terwijl de hoeveelheid rekenwerk behouden blijft.
  • Vooraf ophalen vereist bruikbare adressen en voldoende voorsprong; onnauwkeurige verzoeken verspillen bandbreedte.

Geheugenhiërarchie en caches: voorbeelden

6 Walkthroughs

1

Van een arraydoorloop naar een geheugenhiërarchie

13 stappen
Verbind de lokaliteit van programma's met geheugentechnologieën en de kosten van treffers en missers.
  1. 1
    IntroductieWaarom een klein geheugen dichtbij houden?

    Een processor kan veel sneller werk uitgeven dan een groot geheugen elk verzoek kan beantwoorden. Een cache helpt wanneer een programma terugkeert naar recente gegevens of nabijgelegen adressen gebruikt; dat hergebruik heet lokaliteit. Volg een arraydoorloop om te zien hoeveel één lijnvulling kan bedienen en verbind dat hergebruik daarna met de technologieën en niveaus die de gegevens leveren: de geheugenhiërarchie.

  2. 2
    UitlegOnderscheid twee soorten lokaliteit

    Temporele lokaliteit gebruikt een gegeven snel opnieuw: een luslichaam wordt herhaaldelijk uitgevoerd en een lopend totaal wordt bij elke iteratie bijgewerkt. Ruimtelijke lokaliteit gebruikt nabijgelegen adressen: een opeenvolgende arraydoorloop leest aangrenzende elementen.

    Een lus kan beide soorten in zijn instructiestroom hebben, ook wanneer elk array-element maar één keer wordt gelezen. Bepaal wat wordt aangesproken voordat je een soort lokaliteit toekent.

  3. 3
    VoorbeeldHoeveel levert één lijn?

    Een op een blokgrens uitgelijnde array bevat 1.000 gehele getallen van elk 4 bytes. Cachelijnen bevatten 64 bytes. Elke vulling levert 64/4=16 opeenvolgende gehele getallen. Nadat het eerste gehele getal een misser oplevert, kunnen de volgende 15 treffers opleveren. De laatste lijn hoeft niet vol te zijn: de array van 4.000 bytes heeft ⌈4000/64⌉=63 lijnen nodig.

  4. 4
    UitdagingVoorspel een kleinere doorloop

    Een uitgelijnde array bevat 320 gehele getallen van vier bytes. Hoeveel leesbewerkingen van de array missen in een aanvankelijk lege cache die op verzoek ophaalt, met lijnen van 64 bytes, zonder verstoring en met ruimte voor de array? Welke lokaliteit levert de overige treffers op?

    ---reveal---

    Er zijn 16 gehele getallen per lijn en 320/16=20 lijnen, dus missen 20 leesbewerkingen. De andere 300 leveren door ruimtelijke lokaliteit treffers op. Elk element wordt één keer gebruikt; voor deze treffers is geen temporeel hergebruik van de elementen nodig.

  5. 5
    KernpuntEen werkverzameling heeft bruikbare plaatsen nodig

    De werkverzameling bestaat uit de blokken die tijdens een tijdvenster worden gebruikt. Een kleine actieve verzameling kan dichtbij blijven, ook als het hele programma groot is.

    Zowel capaciteit als plaatsing is van belang. Als twee actieve blokken slechts één gedeelde positie mogen gebruiken, kunnen ze elkaar verdringen terwijl andere posities leeg blijven. Lusvariabelen in registers hebben ook geen ruimte in de gegevenscache nodig, zelfs als de broncode ze herhaaldelijk leest.

  6. 6
    UitlegVergelijk geheugencellen onder spanning

    SRAM bewaart een bit in een stabiele schakeling onder spanning, doorgaans met zes transistors. Het hoeft niet te worden ververst en is snel, maar kost aanzienlijk oppervlak per bit. DRAM bewaart lading op een condensator; door weglekken is verversing nodig. De compactere cellen maken het geschikt voor een groot hoofdgeheugen.

    Beide zijn vluchtig. “Statisch” beschrijft hoe SRAM zijn toestand bewaart terwijl er stroom is, niet of de inhoud een stroomuitval overleeft.

  7. 7
    VoorbeeldEerst wachten, dan overdragen

    DRAM activeert een rij in de rijbuffer van een bank en levert daaruit geselecteerde kolommen. Bursts en overlappende banken verhogen de leveringssnelheid. Ze nemen de initiële toegangsvertraging niet weg.

    Bij 60 ns initiële latentie heeft een lijn van 64 bytes die met 16 bytes/ns wordt overgedragen nog eens 4 ns nodig. De totale afhandeling duurt ongeveer 64 ns. Het grootste deel van die wachttijd gaat vooraf aan de overdracht, ook al verplaatst de interface bytes snel.

  8. 8
    UitlegKies opslag die zijn inhoud bewaart

    NAND-flashgeheugen bewaart gegevens zonder stroom. Het leest en programmeert pagina's en wist grotere blokken voordat geprogrammeerde ruimte opnieuw kan worden gebruikt. Die bewerkingen duren veel langer dan toegang tot SRAM of DRAM.

    Slijtage door programmeren en wissen begrenst de levensduur van een blok. Slijtageverdeling spreidt bijwerkingen over blokken, zodat vaak gewijzigde logische gegevens niet één fysieke plaats vroegtijdig laten verslijten.

  9. 9
    UitdagingOnderscheid gegevensbehoud en verversing

    Een apparaat moet gegevens bewaren nadat de stroom is uitgeschakeld. Zou het vervangen van DRAM door SRAM aan die eis voldoen? Leg uit.

    ---reveal---

    Nee. SRAM heeft geen verversing nodig, maar verliest zonder stroom nog steeds zijn gegevens, net als DRAM. Niet-vluchtige opslag zoals flash voldoet aan de eis voor gegevensbehoud. De langzamere paginabewerkingen en de noodzaak om te wissen verklaren waarom flash een andere rol heeft dan cachegeheugen op de chip.

  10. 10
    UitlegZet de niveaus op volgorde

    Registers staan het dichtst bij de uitvoering, gevolgd door L1, L2, L3, DRAM en opslag. Caches verplaatsen blokken, meestal van 64 bytes, terwijl virtueel geheugen pagina's gebruikt, meestal van 4 KiB.

    L1 scheidt vaak instructie- en gegevenscaches zodat de pipeline beide tegelijk kan benaderen. Bij een misser in één niveau gaat het zoeken daaronder verder; een L1-misser kan nog steeds een L2-treffer zijn.

  11. 11
    VoorbeeldBereken de kosten van een incidentele misser

    Gebruik een vereenvoudigde opzoektijd van 1 cyclus, 97% treffers en een extra vertraging van 100 cycli per misser. Elk verzoek betaalt de opzoektijd en 3% betaalt de extra vertraging:

    1+0,03×100=4 cycli.

    Een misser kost hier 101 cycli. De 100 cycli zijn extra tijd, dus als je die als de volledige tijd voor een misser rekent, laat je de opzoektijd bij missers weg.

  12. 12
    UitdagingVerbind het programma met zijn gemiddelde

    Twee programma's gebruiken dezelfde cache van 1 cyclus en dezelfde extra vertraging van 80 cycli. Het ene heeft 2% missers; het andere 20%. Bepaal hun gemiddelde tijden en leg uit waarom identieke hardware verschillende resultaten geeft.

    ---reveal---

    De gemiddelden zijn 1+0,02×80=2,6 en 1+0,20×80=17 cycli. Verschillende toegangspatronen leveren verschillende misserfracties op. De cache benut de lokaliteit die elk programma biedt; de capaciteit en technologie alleen leggen het resultaat niet vast.

  13. 13
    SamenvattingBekijk een toegang op drie schalen

    Bepaal bij het onderzoeken van geheugengedrag welk gegeven opnieuw wordt gebruikt, welk blok daarmee wordt overgedragen en welk niveau het levert. Lokaliteit verklaart waarschijnlijk hergebruik, geheugentechnologie verklaart kosten en capaciteit en de tijden voor treffers en missers zetten die waarnemingen om in een schatting van de toegangstijd. Begin bij een concreet programma met de werkelijke adresstroom.

2

Bouw en volg een cacheopzoeking

15 stappen
Splits adressen, volg de vervangingstoestand en vergelijk directe afbeelding met meerdere posities per set.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEen adres moet twee vragen beantwoorden
  2. 2
    UitlegVerwijder eerst de byteoffset
  3. 3
    UitlegTel posities vóór indexbits
  4. 4
    UitdagingControleer een nieuwe veldindeling
  5. 5
    VoorbeeldTel de opgeslagen adrestag mee
  6. 6
    VoorbeeldBegin met een lege cache
  7. 7
    VoorbeeldZie hoe één positie van eigenaar wisselt
  8. 8
    VoorbeeldVoltooi de vervangingsreeks
  9. 9
    UitdagingVolg de toegang zonder bytes en blokken te verwarren
  10. 10
    UitlegVerdeel posities over sets
  11. 11
    VoorbeeldHoud recent gebruik bij elke toegang bij
  12. 12
    UitdagingOnderscheid LRU van FIFO
  13. 13
    KernpuntWeet wat meer posities per set kunnen opleveren
  14. 14
    UitdagingVergelijk ontwerpen met gelijke capaciteit
  15. 15
    SamenvattingHoud de toestand bij tijdens het opzoeken
3

Onderzoek een misser en bewaar gewijzigde gegevens

12 stappen
Deel missers in, volg gewijzigde blokken die worden vervangen en onderscheid strategieën bij schrijftreffers en schrijfmissers.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEen misser heeft een oorzaak en een afhandelingspad
  2. 2
    UitlegHandel een wachtende leesbewerking af
  3. 3
    UitlegDeel in met de juiste vergelijking
  4. 4
    UitdagingOnderscheid vrije capaciteit van conflicten
  5. 5
    VerbandKies welke kosten je wilt verbeteren
  6. 6
    UitlegVolg een blok in een cache met terugschrijven
  7. 7
    UitlegZet opslaginstructies bij direct doorschrijven in een wachtrij
  8. 8
    UitlegStel een afzonderlijke regel in voor schrijfmissers
  9. 9
    UitdagingVolg een opslaginstructie en een latere leesbewerking
  10. 10
    VoorbeeldTel het verkeer in beide richtingen
  11. 11
    UitdagingVerbind de indeling met schrijfverkeer
  12. 12
    SamenvattingHoud de beslissingen gescheiden
4

Bereken de kosten van een hiërarchie

16 stappen
Werk van één cache naar gewogen verkeer, CPI, veranderingen in klokfrequentie en meerdere cacheniveaus.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieKoppel er een noemer en een eenheid aan
  2. 2
    VoorbeeldBereken de AMAT voor één niveau
  3. 3
    TipReken om na het berekenen
  4. 4
    UitdagingGebruik een opgegeven volledige tijd voor een misser
  5. 5
    VoorbeeldWeeg de verzoeken die er zijn
  6. 6
    VoorbeeldGa van toegangen naar instructies
  7. 7
    VoorbeeldEindig met de uitvoeringstijd
  8. 8
    UitdagingVerhoog de klokfrequentie van de processor
  9. 9
    VerbandControleer of vertragingen overlappen
  10. 10
    VoorbeeldHoud lokale en globale fracties gescheiden
  11. 11
    VoorbeeldBereken de lagere afhandelingskosten
  12. 12
    VoorbeeldKeer terug naar de oorspronkelijke stroom
  13. 13
    UitdagingOnderzoek een fout in de noemer
  14. 14
    VoorbeeldVoeg nog een voorwaardelijk niveau toe
  15. 15
    UitdagingCombineer cacheverkeer met CPI
  16. 16
    SamenvattingKies het juiste niveau van berekening
5

Vertaal een adres zonder opzoekingen te verwarren

15 stappen
Volg paginaoffsets, toegangsrechten, het doorlopen van de paginatabel bij TLB-missers en de indexeringsvoorwaarde van een VIPT-cache.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieEén adres, twee opzoekproblemen
  2. 2
    VoorbeeldZoek het ongewijzigde deel
  3. 3
    VoorbeeldGebruik het paginatabelitem
  4. 4
    UitdagingVertaal een andere byte
  5. 5
    UitlegOok een geldige pagina heeft toegangsrechten
  6. 6
    UitlegHandel een ontbrekende pagina af
  7. 7
    VoorbeeldSchat een vlakke tabel
  8. 8
    UitlegGebruik vertalingen in de TLB opnieuw
  9. 9
    KernpuntVolg onafhankelijke trefferresultaten
  10. 10
    UitdagingBepaal of opslag nodig is
  11. 11
    VoorbeeldBereken het vertaalbereik
  12. 12
    UitlegBegin cache-indexering tijdens de vertaling
  13. 13
    UitdagingControleer een voorgesteld L1-ontwerp
  14. 14
    VerbandMaak verouderde vertalingen ongeldig
  15. 15
    SamenvattingHoud vertaaltoestand en gegevenstoestand gescheiden
6

Maak elke opgehaalde lijn nuttig

13 stappen
Analyseer stapgroottes, kies een gegevensindeling, bepaal de grootte van herbruikbare rekenblokken en bepaal wat vooraf ophalen kan verbergen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBegin met de adressen van de binnenste lus
  2. 2
    VoorbeeldGebruik alle doubles in een lijn
  3. 3
    VoorbeeldBekijk capaciteit en conflicten samen
  4. 4
    TipVerander de rijstapgrootte
  5. 5
    UitdagingKies een indeling voor de toegang
  6. 6
    UitlegVerwissel lussen om gegevensstromen te benutten
  7. 7
    UitlegHoud drie rekenblokken actief
  8. 8
    VoorbeeldLaat ruimte over naast de capaciteitsschatting
  9. 9
    UitdagingStop randblokken bij de arraygrens
  10. 10
    KernpuntOnderscheid minder overdrachten van minder rekenwerk
  11. 11
    UitlegHaal op terwijl nuttig werk doorgaat
  12. 12
    UitdagingVerklaar een kleinere versnellingsfactor dan verwacht
  13. 13
    SamenvattingTest een concrete wijziging

Geheugenhiërarchie en caches: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Geheugengedrag en opzoeken in de cache10 Oefenvragen

Vraag 1 van 10

Een programma leest elk element van een aaneengesloten array één keer, in adresvolgorde. Welke soort lokaliteit verklaart waarom het ophalen van een hele lijn helpt?
  1. Temporele lokaliteit binnen elk element
  2. Ruimtelijke lokaliteit tussen elementen
  3. Temporele lokaliteit tussen pagina's
  4. Ruimtelijke lokaliteit bij herhaalde waarden
Toon antwoordVerberg antwoord
Antwoord: B
Aangrenzende elementen staan op nabijgelegen adressen, dus levert één opgehaalde lijn gegevens voor meerdere komende leesbewerkingen. Temporele lokaliteit vereist dat een gegeven opnieuw wordt gebruikt; als elk element één keer wordt gelezen, is er geen temporeel hergebruik van die elementen, ook al kunnen andere delen van het programma opnieuw worden gebruikt.

Vraag 2 van 10

Welke eigenschap maakt dat DRAM moet worden ververst en SRAM niet?
  1. DRAM verstuurt gegevens op beide klokflanken.
  2. DRAM bewaart gegevens wanneer de stroom wegvalt.
  3. DRAM bewaart elke bit in een stabiele latch.
  4. DRAM bewaart lading die geleidelijk weglekt.
Toon antwoordVerberg antwoord
Antwoord: D
Een DRAM-cel bewaart lading op een condensator en door lekkage moet de lading periodiek worden hersteld. Overdracht op beide klokflanken verbetert de bandbreedte van de interface, maar is niet de reden voor verversing. SRAM bewaart zijn toestand in een schakeling onder spanning zonder periodieke verversing.

Vraag 3 van 10

Een verzoek mist in L1 en treft in L2. Welke uitspraak beschrijft deze toegang?
  1. L2 levert een blok dat ontbreekt in L1.
  2. DRAM levert een blok dat ontbreekt in L2.
  3. De instructie veroorzaakt een paginafout.
  4. De TLB moet een vertaling opnieuw laden.
Toon antwoordVerberg antwoord
Antwoord: A
De treffer en misser beschrijven de afzonderlijke gecontroleerde niveaus: L1 had het blok niet, terwijl L2 het wel had. Een L1-misser vereist geen DRAM als een lagere cache die kan afhandelen. Uit de cacheresultaten blijkt niet of de vertaling mist of een paginafout is opgetreden.

Vraag 4 van 10

Een direct afgebeelde cache heeft 8 KiB aan gegevens, blokken van 32 bytes en byteadressen van 30 bits. Wat zijn de breedtes van adrestag, index en offset?
  1. 17, 8, 5 bits
  2. 12, 13, 5 bits
  3. 18, 7, 5 bits
  4. 17, 5, 8 bits
Toon antwoordVerberg antwoord
Antwoord: A
De cache heeft 8192/32=256 posities, waarvoor 8 indexbits nodig zijn. Een blok van 32 bytes heeft 5 offsetbits nodig, zodat 30−8−5=17 tagbits overblijven. Als je 13 indexbits gebruikt, neem je de logaritme van de capaciteit in bytes en tel je de blokoffset tweemaal.

Vraag 5 van 10

Een direct afgebeelde cache heeft acht posities van 16 bytes. Welk paar geeft voor byteadres 0x2B6 de positie-index en byteoffset?
  1. Index 6, offset 3
  2. Index 2, offset 6
  3. Index 3, offset 6
  4. Index 3, offset 11
Toon antwoordVerberg antwoord
Antwoord: C
Als je 0x2B6 door 16 deelt, krijg je blok 0x2B, of 43, met rest 6. Blok 43 modulo 8 selecteert index 3. De laagste drie bits van het onverschoven byteadres nemen zou index 6 geven, omdat die bits bij de byteoffset horen in plaats van bij de blokindex.

Vraag 6 van 10

Een lege direct afgebeelde cache heeft twee posities van 8 bytes. Leesbewerkingen gebruiken de byteadressen 0x00, 0x07, 0x10, 0x04, in die volgorde. Wat is de trefferfractie?
  1. 0%
  2. 25%
  3. 50%
  4. 75%
Toon antwoordVerberg antwoord
Antwoord: B
De eerste toegang laadt blok 0 en 0x07 levert een treffer op in dat blok. Adres 0x10 laadt blok 2 op dezelfde positie en verdringt blok 0, zodat 0x04 daarna mist. Slechts één van de vier toegangen levert een treffer op; als je de laatste toegang als treffer telt, zie je de tussentijdse vervanging over het hoofd.

Vraag 7 van 10

Een uitgelijnde array bevat 192 waarden van acht bytes. Een aanvankelijk lege cache gebruikt lijnen van 64 bytes, heeft ruimte voor de hele array en haalt niets vooraf op. Hoeveel missers ontstaan bij een opeenvolgende doorloop als er geen andere toegangen zijn?
  1. 12
  2. 64
  3. 192
  4. 24
Toon antwoordVerberg antwoord
Antwoord: D
Elke lijn bevat 64/8=8 waarden, dus raakt de doorloop 192/8=24 lijnen. De eerste leesbewerking van elke lijn mist en de volgende zeven waarden leveren treffers op. Als je 192 missers telt, behandel je een lijnvulling alsof die alleen het gevraagde element levert.

Vraag 8 van 10

Een geheugenverzoek heeft een initiële latentie van 45 ns, gevolgd door een overdracht van 128 bytes met 32 GB/s. Wat is de totale afhandelingstijd in dit model?
  1. 49 ns
  2. 45 ns
  3. 77 ns
  4. 41 ns
Toon antwoordVerberg antwoord
Antwoord: A
Bij 32 GB/s draagt de interface 32 bytes per nanoseconde over, dus duren 128 bytes 4 ns. De initiële 45 ns erbij opgeteld geeft 49 ns. Wie 77 ns gebruikt, verwart het getal voor de bandbreedte met een vertraging in plaats van de blokgrootte door de overdrachtssnelheid te delen.

Vraag 9 van 10

Een direct afgebeelde cache van 4 KiB met terugschrijven heeft lijnen van 32 bytes en byteadressen van 24 bits. Tel gegevens, adrestags, één geldigheidsbit en één wijzigingsbit per lijn mee, zonder andere metadata. Hoeveel bits worden opgeslagen?
  1. 34.304 bits
  2. 34.944 bits
  3. 34.560 bits
  4. 33.024 bits
Toon antwoordVerberg antwoord
Antwoord: C
Er zijn 128 lijnen, dus zijn de breedtes van index en offset 7 en 5 bits en blijven 12 bits over voor de adrestag. Elke lijn slaat 256 + 12 + 1 + 1 = 270 bits op, samen 34.560 bits. De keuze van 34.304 bits laat beide besturingsbits van elke lijn weg, hoewel ze expliciet in de telling zijn opgenomen.

Vraag 10 van 10

Een lege direct afgebeelde cache heeft vier posities van 16 bytes. Leesbewerkingen gebruiken 0x24, 0x28, 0x64, 0x34, 0x2C, 0x68. Welke trefferfractie en welk eindblok op index 2 zijn het resultaat?
  1. 50%; blok 2
  2. 25%; blok 6
  3. 16,7%; blok 2
  4. 16,7%; blok 6
Toon antwoordVerberg antwoord
Antwoord: D
De blokreeks is 2, 2, 6, 3, 2, 6. Alleen de tweede toegang levert een treffer op; blokken 2 en 6 vervangen elkaar op index 2, waar uiteindelijk blok 6 staat. De keuze van 50% houdt beide conflicterende blokken ten onrechte tegelijk aanwezig en behandelt de cache alsof die extra plaatsingsmogelijkheden heeft.
Set 2: Plaatsing, missers en opslaginstructies10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een programma spreekt een blok voor het eerst aan en de gevraagde toegang mist. Hoe wordt die misser in het drie-C's-model ingedeeld?
  1. Conflictmisser
  2. Capaciteitsmisser
  3. Eerste-toegangsmisser
  4. Coherentiemisser
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een cache met terugschrijven verdringt een geldig blok waarvan de wijzigingsbit niet is gezet. Wat moet er met dat te vervangen blok gebeuren?
  1. Het moet vóór vervanging naar beneden worden geschreven.
  2. Het kan zonder terugschrijven worden weggegooid.
  3. De vervanging moet direct doorschrijven gebruiken.
  4. De wijzigingsbit moet vóór verdringing worden gezet.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een cache van 12 KiB heeft lijnen van 64 bytes en drie posities per set. Hoeveel sets heeft de cache?
  1. 32
  2. 192
  3. 64
  4. 256
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een volle 2-weg set gebruikt LRU en bevat aanvankelijk P en Q, waarbij P het langst geleden is gebruikt. De toegangen zijn Q, P, R, Q, waarbij R ontbreekt. Welke blokken worden bij de twee missers verdrongen?
  1. Q, daarna P
  2. P, daarna R
  3. P, daarna Q
  4. Q, daarna R
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een cache zonder cachetoewijzing bij een schrijfmisser is aanvankelijk leeg. Een opslaginstructie naar adres 0x80 wordt gevolgd door een leesbewerking van 0x80, zonder tussentijdse toegangen. Wat gebeurt er in deze cache?
  1. Opslaan mist; lezen treft.
  2. Opslaan treft; lezen treft.
  3. Opslaan treft; lezen mist.
  4. Opslaan mist; lezen mist.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een herhaalde gevraagde toegang mist in een direct afgebeelde cache, maar treft in een volledig associatieve LRU-cache van dezelfde grootte met dezelfde toegangsgeschiedenis. Wat veroorzaakte de misser volgens de drie-C's-test?
  1. Een eerste toegang tot het blok
  2. Een beperking op de plaatsing van blokken
  3. Te weinig volledig associatieve capaciteit
  4. Een overvolle schrijfbuffer op een lager niveau
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een cache met direct doorschrijven heeft een schrijfbuffer met eindige capaciteit. Gedurende een langere periode komen opslaginstructies sneller binnen dan het lagere niveau ze kan accepteren. Wat gebeurt er uiteindelijk?
  1. De cache schakelt over op terugschrijven.
  2. Het lagere niveau laat wachtende schrijfbewerkingen vallen.
  3. De processor wacht wanneer de buffer vol raakt.
  4. De buffer neemt de bandbreedtelimiet weg.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een lege volledig associatieve LRU-cache met twee lijnen ontvangt leesbewerkingen voor blokken 1, 2, 3, 1, 2. Hoeveel eerste-toegangs-, capaciteits- en conflictmissers treden op?
  1. 2 eerste-toegangs-, 3 capaciteits-, 0 conflictmissers
  2. 3 eerste-toegangs-, 0 capaciteits-, 2 conflictmissers
  3. 3 eerste-toegangs-, 1 capaciteits-, 1 conflictmisser
  4. 3 eerste-toegangs-, 2 capaciteits-, 0 conflictmissers
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een lege cache met één lijn, terugschrijven en cachetoewijzing bij een schrijfmisser heeft lijnen van 32 bytes. Die ontvangt opslaginstructies naar 0x00, 0x04, 0x20 en 0x24, gevolgd door een leesbewerking van 0x40. Hoeveel bytes worden tussen deze cache en het volgende niveau verplaatst als je alleen vullingen en het terugschrijven van vervangen blokken telt?
  1. 160 bytes
  2. 96 bytes
  3. 128 bytes
  4. 192 bytes
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een lege 2-weg cache heeft twee sets en LRU-vervanging. Leesbewerkingen voor blokken herhalen onbeperkt 0, 2, 4. Wat is de trefferfractie na het opwarmen en wat zou een volledig associatieve cache met vier lijnen doen?
  1. Twee derde; die zou ook bij een derde missen.
  2. Nul; die zou na de eerste drie missers treffen.
  3. Een derde; die zou na vier missers treffen.
  4. Nul; die zou ook bij elke toegang missen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Toegangstijd en programmasnelheid10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een cache levert 184 treffers bij 200 toegangen. Wat is de misserfractie?
  1. 8%
  2. 16%
  3. 92%
  4. 0,08%
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een rapport geeft het aantal L2-missers gedeeld door alle verzoeken die L2 bereikten. Welke fractie wordt gerapporteerd?
  1. Globale L2-misserfractie
  2. Globale L1-misserfractie
  3. Lokale L2-misserfractie
  4. Lokale geheugentoegangsfractie
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een cache heeft een opzoektijd van 2 cycli, 6% missers en een extra vertraging van 75 cycli per misser. Wat is de AMAT bij 2,5 GHz?
  1. 6,5 ns
  2. 1,8 ns
  3. 3,0 ns
  4. 2,6 ns
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

De basis-CPI is 1,2, instructiemissers zijn 1%, 40% van de instructies veroorzaakt één gegevenstoegang, gegevensmissers zijn 5% en alle missers voegen zonder overlap 80 cycli toe. Wat is de totale CPI?
  1. 6,0
  2. 3,6
  3. 2,8
  4. 2,4
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

L1 mist 8% van de verzoeken. L2 heeft een lokale misserfractie van 15%. Welk deel van de oorspronkelijke verzoeken mist in beide caches?
  1. 1,2%
  2. 15%
  3. 23%
  4. 0,12%
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een cacheopzoeking duurt 1 ns. De misserfractie is 10% en een volledige toegang bij een misser duurt 41 ns, inclusief die opzoeking. Wat is de AMAT?
  1. 5,1 ns
  2. 4,1 ns
  3. 5,0 ns
  4. 4,0 ns
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Elke instructie wordt één keer opgehaald en veroorzaakt gemiddeld 0,5 gegevenstoegangen. De misserfracties voor instructies en gegevens zijn 1% en 7%. Beide caches hebben een opzoektijd van 2 cycli en een extra vertraging van 60 cycli bij een misser. Wat is de AMAT per geheugentoegang?
  1. 4,7 cycli
  2. 3,8 cycli
  3. 4,4 cycli
  4. 2,7 cycli
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

L1 opzoeken duurt 2 cycli en mist 5%. L2 opzoeken duurt 8 cycli en mist lokaal 20%. L3 opzoeken duurt 30 cycli en mist lokaal 10%. Het geheugen voegt na een L3-misser 150 cycli toe. Wat is de AMAT?
  1. 2,45 cycli
  2. 4,35 cycli
  3. 3,95 cycli
  4. 2,85 cycli
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een programma heeft een basis-CPI van 1,5 en 2,5 geheugenwachtcycli zonder overlap per instructie bij 2 GHz. De klokfrequentie stijgt naar 4 GHz; het aantal uitgevoerde instructies, de basis-CPI, het aantal missers en geheugenvertragingen in nanoseconden blijven gelijk. Wat is de versnellingsfactor?
  1. Ongeveer 1,23 keer
  2. Ongeveer 2,00 keer
  3. Ongeveer 0,62 keer
  4. Ongeveer 1,60 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Cache A heeft een opzoektijd van 0,8 ns en 6% missers. Cache B heeft een opzoektijd van 1,1 ns en 4% missers. Beide gebruiken dezelfde extra vertraging bij een misser. Bij welke extra vertraging worden hun AMAT's gelijk?
  1. 5 ns
  2. 10 ns
  3. 15 ns
  4. 30 ns
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Pagina's, TLB's en cache-indexering10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welk deel van een adres blijft bij gewone paginavertaling ongewijzigd?
  1. Het virtuele paginanummer
  2. Het fysieke paginanummer
  3. Het basisadres van de paginatabel
  4. De byteoffset binnen de pagina
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een toegang mist in de TLB en het doorlopen van de paginatabel vindt een geldige afbeelding die de toegang toestaat. Wat is de normale volgende stap?
  1. Lees de pagina uit de opslag.
  2. Plaats de vertaling en ga verder.
  3. Beëindig het proces wegens een ongeldig adres.
  4. Maak de gegevenscachelijn ongeldig.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Bij pagina's van 8 KiB wordt virtueel adres 0x12345 afgebeeld op fysiek paginanummer 0x2A. Wat is het fysieke byteadres?
  1. 0x54345
  2. 0x2A345
  3. 0x54045
  4. 0x16345
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een volledig associatieve TLB bevat 96 vertalingen, allemaal voor pagina's van 16 KiB. Wat is het bereik?
  1. 96 KiB
  2. 1.536 MiB
  3. 1,5 MiB
  4. 6 MiB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een proces schrijft naar een aanwezige pagina. De TLB treft, maar de huidige afbeelding geeft alleen leesrecht. Wat gebeurt er?
  1. De opslaginstructie slaagt omdat de vertaling treft.
  2. De TLB moet missen voordat een fout kan optreden.
  3. De pagina moet opnieuw uit de opslag worden geladen.
  4. De processor veroorzaakt een paginafout wegens toegangsrechten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een eenvoudige VIPT-cache gebruikt lijnen van 64 bytes en pagina's van 4 KiB. De gegevenscapaciteit is 64 KiB. Wat is de kleinste associativiteit die een macht van twee is en alle setindex- en blokoffsetbits binnen de paginaoffset houdt?
  1. 8-weg
  2. 16-weg
  3. 32-weg
  4. 4-weg
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een vlakke paginatabel dekt een bytegeadresseerde virtuele ruimte van 36 bits met pagina's van 16 KiB en items van 8 bytes. Hoeveel geheugen vereist één volledige tabel?
  1. 4 MiB
  2. 16 MiB
  3. 32 MiB
  4. 64 MiB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een lege volledig associatieve LRU-TLB met vier items gebruikt pagina's van 4 KiB. Een lus leest herhaaldelijk één waarde van 8 bytes op elk adres 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, in die volgorde. Alle pagina's zijn aanwezig. Wat gebeurt er na het opwarmen?
  1. Elke vertaalopzoeking mist; paginafouten zijn niet nodig.
  2. Alleen de eerste opzoeking per lus mist; paginafouten zijn niet nodig.
  3. Elke vertaalopzoeking mist; elk vereist een leesbewerking uit de opslag.
  4. Alle vertaalopzoekingen treffen; slechts 40 bytes worden aangesproken.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een toegestane toegang heeft een treffer in de gegevenscache van 2 cycli. Een TLB-opzoeking kost altijd 1 cyclus vóór het opzoeken in de cache. TLB-missers treden op bij 2% van de toegangen en voegen 40 cycli voor het doorlopen van de paginatabel toe; gegevenscachemissers treden op bij 5% en voegen 80 cycli toe. Geen kosten overlappen en er treden geen paginafouten op. Wat is de gemiddelde toegangstijd?
  1. 6,8 cycli
  2. 4,8 cycli
  3. 7,6 cycli
  4. 7,8 cycli
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Processen P en Q beelden verschillende virtuele pagina's af op fysiek paginakader 7. P mag schrijven; Q mag alleen lezen. P wijzigt een byte en het systeem coördineert de zichtbaarheid correct. Wat volgt wanneer Q die afgebeelde byte later leest of ernaar schrijft?
  1. Q leest een eigen kopie en mag schrijven.
  2. Q kan de wijziging lezen, maar schrijven veroorzaakt een fout.
  3. Q krijgt bij beide bewerkingen een fout omdat P schreef.
  4. Q leest de wijziging en erft het schrijfrecht van P.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Codewijzigingen en afwegingen in de hiërarchie10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke doorloop bezoekt aangrenzende elementen van een normale rechthoekige C-array a[i][j]?
  1. Verhoog i terwijl j gelijk blijft.
  2. Verlaag i terwijl j gelijk blijft.
  3. Verhoog j terwijl i gelijk blijft.
  4. Verhoog i en j tegelijk.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een uitgelijnde array heeft 600 records van elk 48 bytes. Een lus leest slechts één veld van 8 bytes per record. Welke indeling minimaliseert de overgedragen gegevens voor dat veld bij een doorloop vanuit een lege cache met lijnen van 64 bytes en zonder vooraf ophalen?
  1. Een afzonderlijke aaneengesloten array voor het veld.
  2. Dezelfde records in hun oorspronkelijke volgorde.
  3. Dezelfde records in omgekeerde volgorde doorlopen.
  4. Dezelfde records met elk 16 opvulbytes.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Drie vierkante rekenblokken met waarden van 8 bytes moeten in een cache van 48 KiB passen. Welke genoemde blokzijde past en laat ten minste 8 KiB ongebruikt?
  1. 48
  2. 44
  3. 42
  4. 40
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Softwarematig vooraf ophalen vermindert cachemissers bij opvragen tijdens een eenmalige doorloop, maar de uitvoeringstijd blijft gelijk. De geheugeninterface droeg al gegevens over op de blijvend haalbare limiet. Welke verklaring past hierbij?
  1. Alleen doorlopen die elk element hergebruiken kunnen overdrachtslatentie verbergen.
  2. De doorloop heeft nog steeds dezelfde door bandbreedte begrensde overdrachten nodig.
  3. De lagere misserfractie bij opvragen bewijst dat er nu minder bytes bewegen.
  4. Vooraf opgehaalde gegevens kunnen de bandbreedtelimiet van de interface omzeilen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een cache heeft 32 sets, lijnen van 64 bytes en voldoende totale capaciteit voor de actieve gegevens. Een kolomdoorloop maakt stappen tussen rijen van 256 doubles, waarbij alle rijbeginnen op een lijngrens liggen. Welke opvulling spreidt opeenvolgende rijbeginnen over alle sets?
  1. Vul elke rij op tot 264 doubles.
  2. Vul elke rij op tot 272 doubles.
  3. Vul elke rij op tot 288 doubles.
  4. Vul elke rij op tot 320 doubles.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een matrixdimensie is 94 en de zijde van een rekenblok is 24. Elke blokcoördinaat geeft één gebied aan, inclusief gedeeltelijke randen. Hoeveel blokgebieden zijn er en hoeveel elementen bevat het gebied rechtsonder?
  1. 16 gebieden; 576 elementen
  2. 9 gebieden; 484 elementen
  3. 16 gebieden; 484 elementen
  4. 9 gebieden; 576 elementen
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een matrixkernel met blokgewijze verwerking gebruikt drie vierkante rekenblokken van doubles in een cache van 32 KiB. Een voorstel verandert de blokzijde van 16 naar 40 en voorspelt met het model waarin blokken aanwezig blijven 2,5 keer minder missers. Welke beoordeling is gerechtvaardigd?
  1. Drie blokken vereisen 12,5 KiB; de voorspelde vermindering is gerechtvaardigd.
  2. Drie blokken vereisen 37,5 KiB; de aanname dat ze aanwezig blijven gaat niet op.
  3. Drie blokken vereisen 37,5 KiB; missers moeten 6,25 keer afnemen.
  4. Drie blokken vereisen 37,5 KiB; ongewijzigd rekenwerk bepaalt de missers.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een vast programma heeft 0,04 L1-missers per instructie, basis-CPI 1 en zonder L2 een extra vertraging van het geheugen van 120 cycli. Een voorgestelde L2-cache voegt een opzoektijd van 12 cycli toe en mist lokaal 10%, waarbij alle wachtcycli na elkaar plaatsvinden. Wat is de versnellingsfactor bij dezelfde klokfrequentie?
  1. Ongeveer 1,25 keer
  2. Ongeveer 3,92 keer
  3. Ongeveer 2,00 keer
  4. Ongeveer 2,96 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een rijgewijze matrixvermenigvuldiging verandert van i-j-k naar i-k-j. In het model met gegevensstromen heeft de eerste volgorde 1,125 missers per binnenste iteratie. In de nieuwe volgorde wordt B doorlopen met één misser per acht iteraties en blijft de rij van C na het opwarmen in de cache. Met welke factor neemt het aantal missers in de stabiele toestand af als je ander verkeer buiten beschouwing laat?
  1. 4,5 keer
  2. 8 keer
  3. 9 keer
  4. 0,25 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een cache bevat 128 gegevenslijnen. Een lus doorloopt herhaaldelijk vijf blokken die allemaal op één set worden afgebeeld. Vergelijk een 4-weg LRU-ontwerp met een 8-weg LRU-ontwerp met gelijke lijngrootte en gegevenscapaciteit; de vijf blokken delen in beide een set. Wat verandert er na het opwarmen?
  1. De 4-weg cache mist steeds; de 8-weg cache treft steeds.
  2. Beide treffen steeds omdat vijf kleiner is dan 128.
  3. De 4-weg cache treft één keer per cyclus; de 8-weg cache twee keer.
  4. Beide missen steeds omdat de setindex wordt gedeeld.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

80 Kernbegrippen, elk met een definitie

A

Adresruimte-identificator
Een adresruimte-identificator, of ASID, onderscheidt vertalingen die bij verschillende adresruimtes horen wanneer hun TLB-items naast elkaar bestaan.
Twee processen kunnen een virtueel paginanummer opnieuw gebruiken zonder elkaars vertaling te gebruiken wanneer items passende ASID's dragen.
Adrestag
Een adrestag is de hoge adresinformatie die bij een cachepositie wordt opgeslagen om aan te geven welk blok de geselecteerde positie of set inneemt.
Dezelfde index kan naar veel geheugenblokken verwijzen, dus onderscheidt een vergelijking van adrestags het blok dat momenteel in de cache staat.
Array van structuren
Een array van structuren slaat records aaneengesloten op met de velden van elk record bij elkaar, wat toegang tot meerdere velden van één record bevordert.
Een bijwerking van een deeltje die positie en snelheid samen gebruikt, kan een groot deel van de voor dat deeltje opgehaalde lijn benutten.

B

Bandbreedte
Bandbreedte is de hoeveelheid gegevens die een geheugenpad per tijdseenheid kan overdragen, gewoonlijk uitgedrukt in bytes per seconde.
Een overdrachtspad van 16 GB/s verplaatst 64 bytes in 4 ns zodra de gegevensstroom na de initiële latentie begint.
Basis-CPI
De basis-CPI is het aantal cycli per instructie dat al nodig is vóór de extra geheugenwachtcycli die worden gemodelleerd, inclusief normale cachetreffers.
Een wachtcyclusmodel telt vertragingen door missers bij de basis-CPI op in plaats van de cachetoegangstijd een tweede keer te tellen.
Blokgewijze verwerking
Blokgewijze verwerking organiseert een berekening rond kleine gegevensgebieden die in de cache blijven terwijl hun waarden herhaaldelijk opnieuw worden gebruikt.
Drie matrixblokken kunnen voor veel vermenigvuldigingen en optellingen opnieuw worden gebruikt voordat het algoritme naar de volgende groep blokken gaat.
Blokoffset
Een blokoffset is de bytepositie binnen een cachelijn, weergegeven door de laagste adresbits bij een lijngrootte die een macht van twee is.
De laagste zes bits van een byteadres selecteren één van de 64 byteposities binnen een cachelijn van 64 bytes.
Byteadressering
Byteadressering geeft elke byte een afzonderlijk geheugenadres, zodat bloknummers worden gevonden door de byteoffsetinformatie te verwijderen.
Adressen die alleen in de lage offsetbits verschillen, kunnen verschillende bytes uit dezelfde aanwezige lijn selecteren.

C

Cache met meerdere niveaus
Een cache met meerdere niveaus combineert een kleine snelle cache op een hoger niveau met grotere lagere caches die veel missers van hogere niveaus vóór het hoofdgeheugen afhandelen.
Een verzoek betaalt de L2-opzoektijd alleen als het in L1 mist, dus weegt de geneste AMAT die opzoektijd met de L1-misserfractie.
Cache-index
Een cache-index is het adresveld dat de positie of set selecteert waarin een geheugenblok mag staan.
In een direct afgebeelde cache met vier posities selecteren blokken 0 en 4 beide index 0, ondanks hun verschillende adrestags.
Cachelijn
Een cachelijn, ook blok genoemd, is de gegevenseenheid met vaste grootte die een cache opslaat en overdraagt.
Een lijn van 64 bytes levert acht aangrenzende doubles, ook als de toegang die de vulling veroorzaakte er maar één opvroeg.
Cachemisser
Een cachemisser treedt op wanneer het gecontroleerde cacheniveau geen bruikbare kopie van het gevraagde blok bevat en die van een lager niveau moet ophalen.
Twee afwisselende blokken kunnen herhaaldelijk missen wanneer directe afbeelding ervoor zorgt dat ze elkaar vervangen.
Cachepositie binnen een set
Een cachepositie binnen een set is één van de beschikbare posities in die set, die elk een afzonderlijk getagd gegevensblok kunnen bevatten.
Een 8-weg set kan acht concurrerende blokken bewaren voordat bij een nieuwe vulling een geldig blok voor vervanging moet worden gekozen.
Cachetoegangsregistratie
Een cachetoegangsregistratie is een geordend overzicht van toegangen en daaruit volgende toestandswijzigingen, waarmee treffers, missers en verdringingen worden bepaald.
Door elke positie direct na een vulling bij te werken gebruikt de volgende rij van de registratie het juiste aanwezige blok.
Cachetoegangstijd
De cachetoegangstijd is de vertraging voor toegang tot een cacheniveau en het vaststellen of er een treffer is, inclusief het opzoeken dat ook bij missers plaatsvindt.
Een opzoektijd van 2 cycli draagt twee cycli bij aan elk verzoek voordat extra vertraging door een misser wordt meegeteld.
Cachetoewijzing bij een schrijfmisser
Cachetoewijzing bij een schrijfmisser is een strategie die het ontbrekende blok in de cache ophaalt en daarna de opslaginstructie op dat blok toepast.
Een latere leesbewerking kan treffen in de lijn die is geplaatst door een eerdere opslaginstructie met toewijzing naar een andere byte van hetzelfde blok.
Cachetreffer
Een cachetreffer treedt op wanneer het gecontroleerde niveau het gevraagde blok al bevat op een geldige positie met een overeenkomende adrestag.
Een verzoek kan in L1 missen en toch in L2 treffen, dus moet het resultaat voor elk niveau afzonderlijk worden benoemd.
Cachevervuiling
Cachevervuiling is de verdringing van bruikbare aanwezige blokken door gegevens die weinig voordeel bieden, zoals onnauwkeurig of te vroeg vooraf opgehaalde gegevens.
Een te vroeg vooraf opgehaalde lijn kan een plaats innemen die het huidige werk nodig heeft en zelf vóór gebruik worden verdrongen.
Capaciteitsmisser
Een capaciteitsmisser is een latere misser die ook optreedt in een volledig associatieve LRU-cache met gelijke capaciteit en dezelfde toegangsgeschiedenis.
Een volledig associatieve cache met twee lijnen mist wanneer een cyclus van drie blokken terugkeert naar het zojuist verdrongen blok.
Coherentiemisser
Een coherentiemisser treedt op wanneer een blok ontbreekt doordat een schrijfbewerking van een andere kern de kopie in de cache ongeldig heeft gemaakt.
Een kern kan missen op recent gebruikte gedeelde gegevens nadat een andere kern de bijbehorende cachelijn heeft gewijzigd.
Conflictmisser
Een conflictmisser is een latere misser die een volledig associatieve LRU-cache met gelijke capaciteit voorkomt doordat flexibele plaatsing het blok bewaart.
Op een direct afgebeelde positie kunnen twee adrestags elkaar afwisselen terwijl een associatieve referentiecache van dezelfde grootte beide blokken bewaart.

D

Direct afgebeelde cache
Een direct afgebeelde cache staat toe dat elk geheugenblok precies één positie inneemt, bepaald door het blokadres en het aantal posities.
Wanneer twee actieve blokken een positie delen, verdringt het laden van het ene blok het andere, zelfs als andere posities leeg zijn.
Direct doorschrijven
Direct doorschrijven is een cachestrategie die elke opslaginstructie naar het volgende niveau stuurt en bij een treffer ook de cache bijwerkt, vaak met een schrijfbuffer.
Een schrijfbuffer kan de bijwerking voor het lagere niveau tijdelijk bewaren, ook al heeft de opslaginstructie de waarde in de cache al gewijzigd.
Doorlopen van de paginatabel
Het doorlopen van de paginatabel leest na een TLB-misser de afbeeldingsitems die nodig zijn om een adres te vertalen en controleert of de afbeelding toegang toestaat.
Als het doorlopen slaagt, wordt de TLB opnieuw gevuld, terwijl een ontbrekende of niet-toegestane afbeelding een paginafout kan veroorzaken.
DRAM
DRAM is vluchtig geheugen dat bits opslaat als condensatorlading die periodiek moet worden ververst en zo compact en betaalbaar hoofdgeheugen biedt.
Een groot programma kan zijn actieve pagina's in DRAM houden terwijl kleinere caches de meest aangesproken lijnen bewaren.

E

Eerste-toegangsmisser
Een eerste-toegangsmisser is een misser bij de eerste toegang tot een blok in de geschiedenis, die alleen door meer cachecapaciteit niet kan worden voorkomen.
De eerste gevraagde toegang tot elke lijn bij een opeenvolgende arraydoorloop vanuit een lege cache is een eerste-toegangsmisser als er niets vooraf wordt opgehaald.
Extra CPI door geheugenwachtcycli
De extra CPI door geheugenwachtcycli is het extra aantal cycli per instructie dat aan wachten op het geheugen wordt toegeschreven, waarbij overlap volgens het tijdmodel wordt behandeld.
Een aantal van 0,02 missers per instructie en een extra vertraging van 100 cycli zonder overlap voegen twee cycli toe aan de totale CPI.
Extra vertraging bij een cachemisser
De extra vertraging bij een cachemisser is de vertraging na het opzoeken in de cache die nodig is om een blok uit een lager niveau op te halen, te plaatsen en te leveren.
Een opzoektijd van 2 cycli met een extra vertraging van 80 cycli laat een volledige toegang bij een misser in een sequentieel model 82 cycli duren.

F

FIFO-vervanging
FIFO-vervanging verdringt het blok dat het eerst in een set is geplaatst, zonder de plaatsingsvolgorde te veranderen wanneer dat blok een treffer oplevert.
Herhaalde treffers kunnen het langst geleden geladen blok zeer bruikbaar maken, maar FIFO kiest het nog steeds vóór nieuwere blokken.
Fysiek paginanummer
Een fysiek paginanummer geeft het fysieke paginakader aan dat een afbeelding gebruikt en vormt het hoge deel van het vertaalde byteadres.
Het fysieke byteadres is het basisadres van het paginakader plus de ongewijzigde paginaoffset, niet het onverschoven paginakadernummer plus de offset.

G

Geen cachetoewijzing bij een schrijfmisser
Geen cachetoewijzing bij een schrijfmisser is een strategie die de opslaginstructie naar beneden stuurt zonder het blok in de gecontroleerde cache te plaatsen.
Een eenmalige uitvoerstroom kan voorkomen dat herbruikbare gegevens in de cache worden verdrongen wanneer schrijfmissers geen toewijzing veroorzaken.
Geheugenbank
Een geheugenbank is een afzonderlijk aangestuurde DRAM-array van rijen en kolommen waarvan de bewerkingen met die van andere banken kunnen overlappen.
Verzoeken afwisselend over banken verdelen kan de geleverde bandbreedte verhogen terwijl één bank op een rijbewerking wacht.
Geheugenbeslag van rekenblokken
Het geheugenbeslag van rekenblokken is de opslagruimte van alle blokken die samen aanwezig moeten zijn zodat een blokgewijze berekening het beoogde hergebruik behoudt.
Drie rekenblokken van 32×32 doubles nemen 24 KiB in en laten in een cache van 32 KiB enige ruimte over voor andere actieve gegevens.
Geheugenhiërarchie
Een geheugenhiërarchie is een verzameling opslagniveaus die kleine snelle geheugens combineert met grotere langzamere geheugens om de lokaliteit van programma's te benutten.
Een L1-misser kan door L2 worden afgehandeld voordat het verzoek de veel langere vertraging van een DRAM-toegang oploopt.
Geheugenverversing
Geheugenverversing is het periodiek herstellen van lading in DRAM-cellen, zodat lekkage de opgeslagen waarden niet uitwist.
DDR4-verversing bij normale temperatuur behandelt de rijen binnen een venster van 64 ms, met kortere tussenpozen bij hogere temperaturen.
Geldigheidsbit
Een geldigheidsbit is metadata bij een positie die vastlegt of de opgeslagen adrestag en gegevens een bruikbaar blok in de cache beschrijven.
Een positie met overeenkomende tagbits mist toch wanneer de geldigheidsbit na het opstarten of ongeldig maken niet is gezet.
Gemiddelde geheugentoegangstijd
De gemiddelde geheugentoegangstijd is de verwachte vertraging per geheugenverzoek, waarin de opzoektijd en de naar waarschijnlijkheid gewogen extra kosten van missers worden gecombineerd.
Een langzamere opzoeking kan het voordeel van minder missers tenietdoen wanneer de bespaarde extra vertraging van het lagere niveau klein is.
Gewogen misserfractie
Een gewogen misserfractie combineert verzoekklassen door hun verwachte aantallen missers op te tellen en te delen door hun gezamenlijke aantal toegangen.
Instructie- en gegevensfracties moeten naar aantallen toegangen worden gewogen wanneer elke instructie minder dan één gegevensverzoek oplevert.
Globale misserfractie
Een globale misserfractie deelt de missers van een cacheniveau door de oorspronkelijke geheugenverzoeken van de processor, inclusief verzoeken die boven dat niveau zijn afgehandeld.
L1-missers van 5% en lokale L2-missers van 20% geven een globale L2-misserfractie van 1%.

H

Het gevraagde woord eerst
Het gevraagde woord eerst is een vulstrategie die het gevraagde woord vóór andere woorden in het cacheblok overdraagt om de wachttijd erop te verkorten.
Een verzoek om een woord aan het einde van een lijn kan dat woord eerst ontvangen in plaats van op eerdere woorden te wachten.

K

Klokcyclustijd
De klokcyclustijd is de duur van één processorcyclus, gelijk aan het omgekeerde van de klokfrequentie, en wordt gebruikt om CPI naar tijd om te rekenen.
Een verdubbeling van de klokfrequentie halveert de klokcyclustijd, maar verdubbelt het aantal cycli dat een ongewijzigde DRAM-vertraging kost.

L

Latentie
Latentie is de verstreken tijd vanaf het uitgeven van een geheugenverzoek totdat de eerste gevraagde gegevens beschikbaar komen.
Een brede geheugeninterface kan veel bytes per seconde leveren terwijl een afzonderlijke afhankelijke laadbewerking nog steeds tientallen nanoseconden wacht.
Lokale misserfractie
Een lokale misserfractie deelt de missers op één cacheniveau alleen door de toegangen die dat niveau na filtering door hogere niveaus bereikten.
Een lokale L2-misserfractie van 20% beschrijft de moeilijkere verzoekstroom van L2, niet 20% van alle processortoegangen.
Lokaliteit
Lokaliteit is de neiging van een programma om zijn toegangen gedurende korte tijd te concentreren in een relatief klein deel van zijn adresruimte.
Een lus kan herhaaldelijk een klein actief gebied gebruiken, ook als het programma vele gigabytes heeft toegewezen.
LRU-vervanging
LRU-vervanging verdringt van de geldige posities in de gekozen set het blok waarvan de laatste toegang het langst geleden is.
Een treffer verandert de gebruiksvolgorde ook zonder een nieuw blok te laden, waardoor bij de volgende misser een ander blok kan worden vervangen.

M

Misserfractie
Een misserfractie is het deel van een bepaalde verzameling verzoeken dat het blok niet vindt in de gemeten cache.
Een misserfractie van 4% wordt als 0,04 ingevuld wanneer je die in een AMAT-berekening met een extra vertraging vermenigvuldigt.

N

NAND-flashgeheugen
NAND-flashgeheugen is niet-vluchtige opslag die pagina's leest en programmeert, grotere blokken wist en een beperkt aantal programmeer- en wiscycli aankan.
Een SSD-controller wijst bijgewerkte logische gegevens toe aan beschikbare flashruimte in plaats van flash te behandelen als DRAM dat byte voor byte kan worden beschreven.
Niet-blokkerende cache
Een niet-blokkerende cache laat andere treffers of verdere missers doorgaan terwijl één of meer blokverzoeken openstaan.
Een processor die instructies buiten de programmavolgorde uitvoert kan een onafhankelijke laadbewerking uit de cache afhandelen terwijl een andere laadbewerking op een vulling uit DRAM wacht.

O

Ongeldig maken van adresvertalingen
Het ongeldig maken van adresvertalingen voorkomt dat bewaarde afbeeldingen bruikbaar blijven na relevante wijzigingen in paginatabellen of toewijzingen van adresruimtes.
RISC-V gebruikt sfence.vma om de toestand van de vertaalcache af te stemmen op wijzigingen in afbeeldingen.
Opvulling
Opvulling voegt ongebruikte opslagruimte toe tussen logische gegevensgebieden, wat de adresstapgrootte en de afbeelding van die gebieden op cachesets kan veranderen.
Acht doubles toevoegen aan een rijlengte die een macht van twee is, kan opeenvolgende rijbeginnen over verschillende sets spreiden.

P

Paginafout
Een paginafout is een uitzondering die ontstaat wanneer paginavertaling of controles van toegangsrechten voor een toegang niet normaal kunnen worden voltooid.
Een verboden opslaginstructie kan bij een aanwezige pagina een paginafout veroorzaken, terwijl sommige ontbrekende afbeeldingen worden afgehandeld zonder uit de opslag te lezen.
Paginakader
Een paginakader is een plaats ter grootte van een pagina in het fysieke hoofdgeheugen die de inhoud kan bevatten waarnaar een virtuele pagina wordt afgebeeld.
Twee processen kunnen bewust gegevens delen door geselecteerde virtuele pagina's op hetzelfde fysieke paginakader af te beelden.
Paginaoffset
Een paginaoffset is de bytepositie binnen een pagina, die behouden blijft wanneer het virtuele paginanummer naar een fysiek paginanummer wordt vertaald.
Twee adressen in dezelfde pagina delen één vertaling, terwijl hun verschillende offsets verschillende bytes selecteren.
Paginatabelitem
Een paginatabelitem legt vertaalinformatie vast zoals een fysiek paginanummer, geldigheid, toegangsrechten en of de pagina is aangesproken of gewijzigd.
Een aanwezige pagina kan een opslaginstructie nog steeds afwijzen als het PTE lezen toestaat maar geen schrijfrecht geeft.
Pseudo-LRU
Pseudo-LRU is een benaderende vervangingsmethode die minder toestand bijhoudt dan exacte LRU en tegelijk probeert recent gebruikte blokken te behouden.
Sterk associatieve caches benaderen recent gebruik vaak omdat het vastleggen van een volledige volgorde meer hardware kost.

R

Rijbuffer
Een rijbuffer is een schakeling die een geactiveerde DRAM-rij bewaart, zodat toegangen kolommen kunnen selecteren zonder die rij opnieuw te openen.
Herhaalde verzoeken aan een al open rij vermijden het voorladen en activeren dat nodig is om in die bank van rij te wisselen.
Rijgewijze opslagvolgorde
Rijgewijze opslagvolgorde slaat de elementen van elke rij van een rechthoekige array aaneengesloten op en plaatst opeenvolgende rijen achter elkaar.
In een C-array a[i][j] doorloop je aangrenzende elementen van één rij als je j in de binnenste lus laat variëren.
Ruimtelijke lokaliteit
Ruimtelijke lokaliteit is de neiging om adressen dicht bij een onlangs aangesproken adres te gebruiken, waardoor naburige bytes nuttig zijn.
Een opeenvolgende arraydoorloop kan de resterende waarden in een cachelijn gebruiken nadat de eerste waarde de lijn heeft binnengehaald.

S

Schrijfbuffer
Een schrijfbuffer is een eindige wachtrij met openstaande schrijfbewerkingen naar een lager niveau, zodat de uitvoering kan doorgaan voordat die bewerkingen klaar zijn.
Een lange reeks opslaginstructies vult de buffer als de bestemming bijwerkingen niet zo snel kan verwerken als ze binnenkomen.
Set-associatieve cache
Een set-associatieve cache beeldt een blok af op één set, maar laat het elk van meerdere posities binnen die set innemen.
Twee blokken die een index delen kunnen samen in een 2-weg set staan en zo verdringingen vermijden die bij directe afbeelding nodig zouden zijn.
Slijtageverdeling
Slijtageverdeling is een techniek van de controller die schrijfbewerkingen en wisbewerkingen in flash over fysieke blokken verdeelt om de slijtage van cellen te spreiden.
Herhaalde bijwerkingen van één logisch record kunnen in verschillende fysieke blokken worden geplaatst om te voorkomen dat één plaats verslijt.
SRAM
SRAM is vluchtig geheugen dat bits zonder periodieke verversing in stabiele schakelingen onder spanning bewaart en vaak voor snelle caches wordt gebruikt.
Een cache op de chip gebruikt SRAM voor lage latentie en bewaart daarbij een kleine hoeveelheid vaak gebruikte gegevens.
Stapgrootte
Een stapgrootte is het adresverschil tussen opeenvolgende toegangen in een doorloop, gemeten in bytes of in elementen met vermelding van de eenheid.
Een kolomdoorloop in een rijgewijs opgeslagen matrix gaat telkens een rijlengte in bytes verder in plaats van de grootte van één element.
Structuur van arrays
Een structuur van arrays slaat elk recordveld op in een eigen aaneengesloten array, wat het doorlopen van dat veld over veel records bevordert.
Bij het optellen van alleen horizontale posities kan een aaneengesloten positiearray worden opgehaald zonder de andere velden van elk deeltje te laden.

T

Temporele lokaliteit
Temporele lokaliteit is de neiging om kort na een eerdere toegang dezelfde instructie of hetzelfde gegeven opnieuw aan te spreken.
De instructies binnen een korte lus worden herhaaldelijk opgehaald terwijl de lus opeenvolgende elementen verwerkt.
Terugschrijven
Terugschrijven is een cachestrategie die opslaginstructies vastlegt in een gewijzigd blok in de cache en dat blok bij verdringing naar beneden stuurt.
Veel opslaginstructies naar één aanwezige lijn kunnen worden gecombineerd tot één uitgaande blokoverdracht wanneer de lijn wordt vervangen.
TLB
Een vertaalbuffer, of TLB, bewaart recente vertalingen van virtuele pagina's en bijbehorende toegangsrechten om herhaaldelijk doorlopen van de paginatabel te voorkomen.
Een TLB-treffer kan toch samengaan met een gegevenscachemisser omdat de aanwezigheid van een afbeelding verschilt van de aanwezigheid van een gegevenslijn.
TLB-bereik
Het TLB-bereik is het totale adresbereik dat door de beschikbare vertalingen wordt vertegenwoordigd, berekend als het aantal items maal de paginagrootte bij pagina's van gelijke grootte.
Een TLB met 64 items dekt 256 KiB bij pagina's van 4 KiB, ook als een lus slechts enkele bytes van elke pagina aanspreekt.
Trefferfractie
Een trefferfractie is het aantal toegangen dat het blok in het gecontroleerde niveau vindt, gedeeld door alle toegangen tot dat niveau.
Negentig treffers bij honderd cacheverzoeken geven een trefferfractie van 90% en een aanvullende misserfractie van 10%.

V

Verwisseling van lusvolgorde
Verwisseling van lusvolgorde wisselt de nestvolgorde van lussen om de doorloop te veranderen terwijl het vereiste gedrag van de berekening behouden blijft.
Door te veranderen welke matrixindex het snelst loopt, kun je een kolomstroom in een rijstroom omzetten zonder het rekenwerk te verminderen.
Virtueel geheugen
Virtueel geheugen beeldt procesadressen af op fysiek geheugen en ondersteunt daarbij beveiliging, gecontroleerd delen en pagina's in de opslag.
Een proces gebruikt nog steeds virtueel geheugen wanneer alle actieve pagina's in DRAM passen en het niets uitwisselt met de opslag.
Virtueel geïndexeerde, fysiek getagde cache
Een virtueel geïndexeerde, fysiek getagde cache begint het opzoeken van de set met virtuele adresbits en controleert de identiteit met een vertaalde fysieke adrestag.
Een 8-weg L1-cache van 32 KiB kan de set- en lijnoffsetbits binnen de offset van een pagina van 4 KiB laten passen.
Virtueel paginanummer
Een virtueel paginanummer is het hoge deel van een virtueel adres dat de pagina aangeeft waarvan de vertaling de afbeelding moet ophalen.
Bij pagina's van 4 KiB blijft na het verwijderen van de laagste 12 offsetbits het virtuele paginanummer over dat voor de vertaling wordt gebruikt.
Volledig associatieve cache
Een volledig associatieve cache heeft één set met alle posities, zodat elk blok elke positie kan innemen zonder indexveld.
Een volledig associatieve LRU-cache met gelijke capaciteit dient als referentie om conflict- en capaciteitsmissers te onderscheiden.
Vooraf ophalen
Vooraf ophalen vraagt gegevens op voordat een gevraagde toegang ze nodig heeft, zodat overdrachtslatentie met nuttig werk kan overlappen wanneer het verzoek tijdig is.
Hardware die gegevensstromen vooraf ophaalt kan latere arraylijnen voorbereiden, maar onnauwkeurige verzoeken verbruiken nog steeds bandbreedte en cacheruimte.
Voortdurende blokverdringing
Voortdurende blokverdringing is het herhaaldelijk verdringen en opnieuw laden van actief benodigde blokken, wat veel missers veroorzaakt omdat ze niet samen aanwezig kunnen blijven.
Als drie blokken steeds worden doorlopen in een 2-weg LRU-set, kan elk blok vlak voor het volgende gebruik worden verdrongen.
Vroegtijdig hervatten
Vroegtijdig hervatten laat de wachtende toegang doorgaan wanneer het gevraagde woord tijdens een blokvulling aankomt, voordat de hele lijn is ontvangen.
De processor kan doorgaan met het benodigde woord terwijl de rest van een lange lijn nog wordt overgedragen.

W

Werkverzameling
Een werkverzameling is de verzameling blokken of pagina's die een programma tijdens een bepaald tijdvenster actief gebruikt.
Twee blokken van een werkverzameling kunnen op één positie conflicteren, ook als hun totale grootte onder de cachecapaciteit ligt.
Wet van Amdahl
De wet van Amdahl begrenst de totale versnellingsfactor door het deel van de uitvoeringstijd dat een verbetering beïnvloedt en de tijd die ongewijzigd blijft.
Als de uitvoeringskosten van de kern dalen, vormen geheugenwachttijden een groter deel van de uitvoeringstijd wanneer die wachttijden gelijk blijven.
Wijzigingsbit
Een wijzigingsbit legt vast dat een blok in de cache wijzigingen bevat die nog niet naar het volgende niveau van de hiërarchie zijn doorgegeven.
Een ongewijzigd geldig blok kan worden weggegooid, terwijl de gewijzigde gegevens van een gewijzigd geldig blok moeten worden bewaard.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag