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