Wat is 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.

Japanse benaming: キャッシュライン

“Cacheregel (cache line)” komt voor in 10 oefenvragen uit 4 onderwerpen, bijv. Multicore en synchronisatie, Geheugenhiërarchie en prestaties, CPU en architectuur.

Vakgebied: Geheugenhiërarchie en prestaties

Waarom caches hele regels verplaatsen

Programma's die één adres aanspreken, spreken meestal kort daarna ook de naburige adressen aan; deze eigenschap heet ruimtelijke lokaliteit. Caches benutten dat door data te verplaatsen in vaste blokken, doorgaans 64 bytes, in plaats van losse woorden, en die grootte komt handig overeen met één DRAM-burst: acht overdrachten van 8 bytes op een 64-bit DDR4-kanaal. Elke gecachete regel heeft een tag die het adres identificeert, een valid-bit dat echte data markeert, een dirty-bit in write-back-caches en toestandsinformatie voor vervanging en coherentie. Een adres wordt daarom opgesplitst in tag-, index- en offsetvelden; bij regels van 64 bytes vormen de laagste 6 bits de offset.

Regelgrootte en toegangspatronen

De regelgrootte vertaalt toegangspatronen in miss rates. Wie een array van 4-byte-integers op volgorde leest, heeft één miss per 16 elementen, een miss rate van 6,25%, omdat elke miss de volgende 15 elementen meeneemt. Wie alleen elk 16e element leest, heeft elke keer een miss. C slaat tweedimensionale arrays op in row-major-volgorde, dus wie in de binnenste lus over de kolomindex loopt, doorloopt opeenvolgende adressen, terwijl het omwisselen van de lussen bij elke toegang een volledige rij verspringt en regels kan verdringen voordat ze opnieuw worden gebruikt. Grotere regels helpen sequentiële code, maar verspillen bandbreedte en capaciteit wanneer van elke regel maar weinig wordt gebruikt.

Coherentie werkt per regel

In een multicoreprocessor houden coherentieprotocollen het eigenaarschap bij op het niveau van cacheregels. Onder MESI is elke regel Modified (gewijzigd en alleen hier aanwezig, zodat het geheugen verouderd is), Exclusive (ongewijzigd en alleen hier aanwezig), Shared (elders kunnen ongewijzigde kopieën bestaan) of Invalid. Een core die wil schrijven, moet eerst de kopieën in andere caches ongeldig maken; een regel die al in M staat, kan herhaaldelijk worden beschreven zonder iemand te informeren. Kleine systemen broadcasten deze verzoeken, terwijl grote systemen directory's gebruiken die bijhouden welke caches elke regel bevatten, zodat het verkeer schaalt met het aantal cores.

False sharing

Omdat coherentie per regel werkt, maken twee threads die verschillende variabelen beschrijven die toevallig in dezelfde regel van 64 bytes liggen, bij elke schrijfactie toch elkaars kopieën ongeldig. De regel stuitert tussen de cores; de resultaten blijven correct, maar de prestaties kunnen sterk dalen. Arrays met tellers of vlaggen per thread zijn het klassieke voorbeeld. De oplossing is de data van elke thread op te vullen (padding) of uit te lijnen naar een eigen regel, bijvoorbeeld met alignment-attributen in C en C++. Daartegenover staat true sharing, waarbij threads werkelijk dezelfde variabele benaderen en communicatie niet via de geheugenindeling te vermijden is.

Nu oefenen: vragen over Cacheregel (cache line)

Welke grootte van een cacheregel (cacheblok) is gebruikelijk in de meeste huidige CPU's?

  1. A1 byte
  2. B64 byte
  3. C64 MB
Antwoord en toelichting tonen

Antwoord: B. 64 byte

De meeste CPU's wisselen gegevens tussen cache en hoofdgeheugen uit in regels van 64 byte. Gegevens op nabije adressen worden vaak achtereenvolgens gebruikt (ruimtelijke lokaliteit), dus ze samen binnenhalen is efficiënt, en het sluit ook aan op de burst-overdracht van DRAM (bij DDR4 8 keer 8 byte = 64 byte). Bij multithreaded programma's moet worden gelet op false sharing, waarbij verschillende variabelen op dezelfde regel conflicten veroorzaken.

Wat is de juiste rol van de valid bit die bij elke cacheregel hoort?

  1. AAangeven of de regel is gewijzigd
  2. BAangeven in welke volgorde de regel wordt verdrongen
  3. CAangeven of er zinvolle data in staan
Antwoord en toelichting tonen

Antwoord: C. Aangeven of er zinvolle data in staan

Direct na het inschakelen of nadat een regel ongeldig is gemaakt, bevat de cache betekenisloze waarden. Een regel met valid bit 0 wordt niet als hit beschouwd, ook niet als de tag toevallig overeenkomt, en de bit wordt 1 zodra correcte data zijn ingelezen. Zo wordt voorkomen dat een lege regel ten onrechte als hit wordt beoordeeld. Of een regel is gewijzigd wordt aangegeven door de dirty bit bij write-back, en de verdringingsvolgorde wordt beheerd met vervangingsinformatie zoals LRU.

Veelgestelde vragen

Hoe groot is een cacheregel?

64 bytes op de meeste huidige CPU's, hoewel sommige processors 32 of 128 bytes gebruiken; de grootte is een hardware-eigenschap die software kan opvragen.

Wat is het verschil tussen een cacheregel en een page?

Een cacheregel, meestal 64 bytes, is de eenheid die tussen cacheniveaus en geheugen wordt verplaatst, terwijl een page, vaak 4 KB, de eenheid is voor de mapping van virtueel geheugen die door het besturingssysteem en de MMU wordt beheerd.

Hoe voorkom ik false sharing?

Plaats data die door verschillende threads wordt beschreven in aparte cacheregels, doorgaans door structuren per thread op te vullen of uit te lijnen op 64 bytes.

“Cacheregel (cache line)” in de toelichting

Vragen met “Cacheregel (cache line)” (10)

  1. Welke grootte van een cacheregel (cacheblok) is gebruikelijk in de meeste huidige CPU's?
  2. In bovenstaande lus is een int 4 byte, een cacheregel 64 byte, staat de array niet in de cache en begint hij op een regelgrens. Wat is, zonder prefetching, de missratio bij het lezen van de array?
  3. Wat is de juiste rol van de valid bit die bij elke cacheregel hoort?
  4. Wat betekent het wanneer een cacheregel in het MESI-protocol in de toestand Modified (M) staat?
  5. Welke uitspraak over burst-overdracht bij DRAM is juist?
  6. Welk mechanisme houdt in een multicore-CPU de inhoud consistent wanneer de caches van de kernen gegevens van hetzelfde adres bevatten?
  7. Een tweedimensionale C-array a[i][j] wordt doorlopen met j als binnenste lus. Dit is doorgaans sneller dan met i als binnenste lus. Wat is de reden?
  8. Welke combinatie van de vier toestanden van het cachecoherentieprotocol MESI is juist?
  9. Welke uitleg over false sharing, dat bij multithreaded programma's optreedt, is juist?
  10. Bij een array van tellers per thread zoals 'long cnt[8];' treedt false sharing op. Welke maatregel is het meest geschikt?

Vergelijkingen met deze term

Halfgeleider-rekentools

Verwante termen

False sharing MESI-protocol Ruimtelijke lokaliteit (spatial locality) Prefetching Numerieke apertuur (NA) LRU (least recently used) TLB (translation lookaside buffer) Capaciteitsmiss (capacity miss) Compulsory miss Conflictmiss (conflict miss)

Naar de woordenlijst