Write-allocate versus no-write-allocate: gedrag bij een write miss, verkeer en combinaties vergeleken

Write-allocate en no-write-allocate zijn strategieën die bepalen of een cacheregel in de cache wordt gehaald wanneer een schrijfactie mist. Bij write-allocate leest de cache eerst de regel uit het niveau eronder en voert daarna de schrijfactie in de cache uit. Bij no-write-allocate wordt de regel niet opgehaald en gaat de schrijfactie rechtstreeks naar het niveau eronder. Dit is een andere keuze dan write-back versus write-through, die bepalen wanneer een schrijfactie met een hit het niveau eronder bereikt, maar write-allocate wordt meestal gecombineerd met write-back en no-write-allocate met write-through.

KenmerkWrite-allocateNo-write-allocate
Bij een write missLeest de hele regel uit het niveau eronder, plaatst die in de cache en schrijft er dan inLaat de cache ongemoeid en stuurt de schrijfactie direct naar het niveau eronder
Line fill (lezen)Vereist. Op multicoresystemen is het een read for ownership (RFO) die vóór het schrijven de kopieën van andere cores ongeldig maakt, zodat een store miss op de geheugenbus als een leesactie verschijntNiet nodig; alleen de geschreven data gaat naar het niveau eronder
Gebruikelijke combinatieWrite-back: latere schrijfacties naar de opgehaalde regel geven een hit en worden zonder geheugenverkeer opgevangen, wat de kosten van de eerste leesactie terugverdientWrite-through: elke schrijfactie gaat sowieso naar het niveau eronder, dus het ophalen van de regel zou het schrijfverkeer niet verminderen
Verkeer naar het niveau eronderLager als dezelfde regel vaak wordt beschreven of de geschreven data weer wordt gelezenElke missende schrijfactie gaat telkens naar buiten, maar er ontstaan geen extra leesacties
Grote hoeveelheden data die alleen worden geschreven (geheugen wissen, uitvoer schrijven)Elke regel wordt alleen gelezen om te worden overschreven en later teruggeschreven, wat het verkeer ongeveer verdubbelt, en nuttige data wordt uit de cache verdrongenGeen leesacties en geen cachevervuiling, dus geschikt voor dit soort data
Lezen direct na schrijvenDe regel staat in de cache, dus de leesactie geeft een hitDe regel staat niet in de cache, dus de leesactie mist en haalt de regel op
ImplementatietechniekenVoor data die alleen wordt geschreven, omzeilen non-temporal (streaming) stores de cache en sturen ze gebundelde schrijfacties rechtstreeks naar het hoofdgeheugen; sommige ISA's hebben ook een instructie die een hele regel op nul zet zonder de oude inhoud te lezenEen schrijfbuffer verbergt de schrijflatentie en voegt vaak meerdere schrijfacties naar dezelfde regel samen tot één overdracht
Waar het wordt gebruiktGebruikelijk in write-back-caches; de meeste L1- tot L3-caches van CPU's zijn write-backGebruikelijk in write-through-caches, zoals een kleine L1 met daarachter een write-back-L2, of eenvoudige embedded processors

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Write-allocate
Wanneer geschreven data snel opnieuw wordt gelezen of beschreven, zoals in een lus die elementen van een array bijwerkt: schrijfacties met temporele lokaliteit.
No-write-allocate
Wanneer een grote hoeveelheid data wordt geschreven die een tijd lang niet wordt teruggelezen. Het vermijdt nutteloze leesacties en houdt de cache vrij voor nuttige data.
In software
Ook met een write-allocate-cache vermijden non-temporal stores het lezen van regels voor grote buffers die alleen worden geschreven. De geschreven data blijft dan echter niet in de cache, dus direct teruglezen is trager.

Veelgestelde vragen

Wat is het verschil tussen write-allocate en no-write-allocate?

Bij een write miss laadt write-allocate de regel in de cache en schrijft daarna in de cache. No-write-allocate laadt de regel niet en schrijft direct naar het niveau eronder.

Gebruikt write-through altijd no-write-allocate?

Niet altijd. Hoe een write hit wordt doorgegeven (write-back of write-through) en of een regel bij een miss wordt opgehaald, zijn aparte keuzes. In de praktijk wordt write-through echter meestal gecombineerd met no-write-allocate en write-back met write-allocate. In een write-through-cache werkt een store met een hit de kopie in de cache bij en wordt die ook naar het niveau eronder geschreven; een store die mist, gaat normaal gesproken rechtstreeks naar beneden zonder de regel op te halen.

Waarom is write-allocate traag voor data die alleen wordt geschreven?

Omdat elke regel die alleen zal worden overschreven, eerst uit het hoofdgeheugen wordt gelezen. De leesactie plus de latere write-back verdubbelt het verkeer ongeveer en verdringt ook andere data die opnieuw gebruikt zou worden. Non-temporal stores vermijden deze leesactie.

Test uw begrip

Welke methode schrijft bij een cachemiss op een schrijfactie rechtstreeks naar het lagere niveau zonder de regel in te lezen?

  1. AWrite-allocate
  2. BWrite-back
  3. CNo-write-allocate
Antwoord en toelichting tonen

Antwoord: C. No-write-allocate

De methode die bij een schrijfmiss rechtstreeks naar het lagere niveau schrijft zonder de regel in te lezen, is no-write-allocate; ze wordt vaak gecombineerd met write-through. Bij data die na het schrijven niet meer worden teruggelezen, bespaart dit onnodig inlezen. Write-allocate leest juist eerst de regel in en schrijft dan; dit is voordelig als de geschreven data snel weer worden gebruikt en wordt daarom vaak met write-back gecombineerd. Write-back bepaalt hoe schrijfhits worden afgehandeld en is een andere as dan de vraag of bij een miss wordt ingelezen.

Wat is het belangrijkste voordeel van stores die de cache omzeilen (non-temporal stores) bij het wegschrijven van grote data die eenmaal worden geschreven en daarna een tijd niet worden teruggelezen?

  1. ADe geschreven data blijven lang in de cache staan, zodat later lezen sneller gaat
  2. BDe cache wordt niet gevuld met data die niet worden hergebruikt
  3. CDe schrijfvolgorde wordt niet meer gegarandeerd, zodat programmafouten gemakkelijker te vinden zijn
Antwoord en toelichting tonen

Antwoord: B. De cache wordt niet gevuld met data die niet worden hergebruikt

Bij gewoon schrijven wordt vanwege write-allocate de regel eerst uit het hoofdgeheugen ingelezen en daarna beschreven; ook voor data die alleen worden geschreven ontstaat zo leesverkeer, en worden andere data die worden hergebruikt verdrongen. Non-temporal stores sturen schrijfacties gebundeld rechtstreeks naar het hoofdgeheugen, vervuilen de cache niet en besparen het onnodige inlezen. De geschreven data blijven niet in de cache staan, dus als ze direct worden teruggelezen wordt het juist trager. Het anders omgaan met volgorde is een bijwerking en geen voordeel.

Wat is de belangrijkste reden dat write-back voordeliger is dan write-through bij het herhaaldelijk schrijven naar dezelfde regel?

  1. ASchrijven blijft binnen de cache en naar het hoofdgeheugen hoeft maar één keer te worden geschreven bij verdringing
  2. BOmdat het hoofdgeheugen bij elke schrijfactie actueel is, is er bij verdringing geen verwerking nodig
  3. COmdat cache en hoofdgeheugen altijd overeenstemmen, is coherentiebeheer niet nodig
Antwoord en toelichting tonen

Antwoord: A. Schrijven blijft binnen de cache en naar het hoofdgeheugen hoeft maar één keer te worden geschreven bij verdringing

Bij write-back blijven herhaalde schrijfacties naar dezelfde regel binnen de cache, en bij verdringing wordt de dirty regel slechts één keer teruggeschreven. Daardoor nemen het verkeer naar het hoofdgeheugen en het energieverbruik sterk af. Het hoofdgeheugen bij elke schrijfactie actueel maken is een eigenschap van write-through, waarbij herhaald schrijven naar dezelfde regel telkens verkeer veroorzaakt. Dat cache en hoofdgeheugen altijd overeenstemmen is ook een eigenschap van write-through; bij write-back zijn er perioden waarin ze niet overeenstemmen.

  1. Welke uitspraak over de schrijfmethode write-back van een cache is juist?
  2. Wat is het belangrijkste doel van een schrijfbuffer bij een write-through cache?
  3. Wat is de juiste rol van de dirty bit die bij elke regel van een write-back cache hoort?

Oefenvragen over Geheugenhiërarchie en prestaties

Belangrijke termen uitgelegd

Write-allocate
Methode waarbij bij een cachemiss bij schrijven de regel eerst in de cache wordt ingelezen en daarna wordt beschreven. Wordt vaak gecombineerd met write-back. De methode die rechtstreeks naar het onderliggende niveau schrijft zonder in te lezen heet no-write-allocate.
Write-through
Methode waarbij tegelijk met het schrijven naar de cache ook naar het onderliggende niveau (zoals het hoofdgeheugen) wordt geschreven. Het onderliggende niveau blijft altijd actueel, maar er is veel schrijfverkeer, dus wordt het met een schrijfbuffer gecombineerd.
Cacheregel (cache line)
Eenheid waarin data tussen de cache en het onderliggende niveau worden gelezen en geschreven. Ook cacheblok genoemd. Bij veel CPU's 64 byte, waarbij de laagste adresbits de positie (offset) binnen de regel aangeven.
Cachegeheugen
Snel geheugen met kleine capaciteit dicht bij de CPU. Het bewaart veelgebruikte gegevens en overbrugt het snelheidsverschil met het hoofdgeheugen. Wordt meestal met SRAM gemaakt.
Temporele lokaliteit
Eigenschap dat gegevens of instructies die één keer zijn benaderd, binnenkort waarschijnlijk opnieuw worden benaderd. Een voorbeeld zijn variabelen die herhaaldelijk in een lus worden gebruikt; een van de redenen waarom caches werken.
Cachecoherentie
Mechanisme dat in een multicore-CPU de consistentie bewaart wanneer de caches van meerdere cores data van hetzelfde adres bevatten. Wordt gerealiseerd door bijvoorbeeld verouderde kopieën in andere cores ongeldig te maken zodra een core schrijft.

Verwante vergelijkingen