Wat is Geheugenconsistentiemodel (memory consistency model)?

Afspraak die vastlegt in welke volgorde lees- en schrijfacties van een core op meerdere adressen voor andere cores zichtbaar kunnen zijn. Voorbeelden zijn sequentiële consistentie, TSO van x86 en de zwakke modellen van ARM en RISC-V.

Japanse benaming: メモリ一貫性モデル

“Geheugenconsistentiemodel (memory consistency model)” komt voor in 4 oefenvragen uit 1 onderwerpen, bijv. Multicore en synchronisatie.

Vakgebied: Multicore en synchronisatie

Waarom hardware geheugenbewerkingen herordent

Moderne cores voeren loads en stores niet strikt in programmavolgorde uit. Een store wordt vaak in een store buffer geparkeerd terwijl de core verdergaat, en loads kunnen vroeg of out-of-order worden uitgegeven om cachelatentie te verbergen. Binnen één thread zijn deze optimalisaties onzichtbaar, omdat de core altijd zijn eigen openstaande schrijfacties doorgeeft (forwarding) en zijn eigen resultaten behoudt. Een andere core kan dezelfde bewerkingen echter in een andere volgorde zien. Een geheugenconsistentiemodel is het contract dat precies vastlegt welke van deze herordeningen zichtbaar mogen worden, zodat programmeurs en compilers weten wanneer synchronisatie nodig is.

Sequentiële consistentie, TSO en zwakke modellen

Sequentiële consistentie (SC) is het strengste model: alle bewerkingen lijken in één globale volgorde plaats te vinden die de programmavolgorde van elke core respecteert. x86 gebruikt total store order (TSO), dat bijna even sterk is: de enige zichtbare herordening is dat een latere load naar een ander adres eerder voltooid wordt dan een eerdere store, precies wat een FIFO-store-buffer veroorzaakt. Arm en RISC-V gebruiken zwakke modellen die herordening van loads en stores naar verschillende adressen in de meeste combinaties toestaan. Ordening moet dan expliciet worden gevraagd met fence- of barrière-instructies of met acquire- en release-bewerkingen.

Een klassiek voorbeeld: de store-buffertest

Laat core 0 x = 1 uitvoeren en dan y lezen, terwijl core 1 y = 1 uitvoert en dan x leest, met x en y aanvankelijk 0. Bij sequentiële consistentie moet minstens één core 1 lezen. Bij TSO kunnen beide 0 lezen, omdat elke store nog in de store buffer van zijn eigen core kan staan wanneer de load van de andere core wordt uitgevoerd. Lockalgoritmen zoals die van Dekker en Peterson falen precies op deze manier, tenzij er een volledige fence tussen de store en de load wordt geplaatst. Op een zwak model kan zelfs het doorgeven van data met een vlag mislukken als barrières de toegangen niet ordenen.

Consistentie vs. cachecoherentie

Cachecoherentie is een garantie over één adres: alle cores zijn het eens over de volgorde van schrijfacties naar die locatie en zien uiteindelijk de laatste waarde. Een consistentiemodel gaat over de ordening tussen verschillende adressen, bijvoorbeeld of een schrijfactie naar x zichtbaar wordt vóór een latere schrijfactie naar y. Een systeem kan volledig coherent zijn en toch zulke herordeningen vertonen; daarom bestaan barrières naast coherentieprotocollen. Hogere programmeertalen definiëren hun eigen modellen, zoals de atomics van C11 en C++11, en compilers vertalen die naar de barrière-instructies die het hardwaremodel vereist.

Nu oefenen: vragen over Geheugenconsistentiemodel (memory consistency model)

Wat legt een geheugenconsistentiemodel vast?

  1. ADe grootte van de cacheregel en het aantal sets
  2. BHet type transistors dat voor het DRAM-hoofdgeheugen wordt gebruikt
  3. CIn welke volgorde de lees- en schrijfacties van een core naar meerdere adressen voor andere cores zichtbaar kunnen zijn
Antwoord en toelichting tonen

Antwoord: C. In welke volgorde de lees- en schrijfacties van een core naar meerdere adressen voor andere cores zichtbaar kunnen zijn

Voor betere prestaties kan een CPU de volgorde van geheugenbewerkingen wijzigen, bijvoorbeeld door schrijfacties in een store buffer te verzamelen of lezen voor te trekken. Binnen één core is dit zo gemaakt dat het resultaat niet verandert, maar voor andere cores kan de volgorde verwisseld lijken. Het geheugenconsistentiemodel legt vast welke verwisselingen kunnen optreden en is de afspraak waarmee programmeurs correcte synchronisatie kunnen schrijven.

Welke eigenschap van het geheugenconsistentiemodel van x86 (TSO, Total Store Order) is juist?

  1. AHet is het zwakste model dat verwisseling van alle combinaties van lezen en schrijven toestaat
  2. BHet is gewoon sequentiële consistentie, die geen enkele verwisseling toestaat
  3. CHet is een relatief sterk model dat alleen toestaat dat een leesactie van een ander adres na een schrijfactie eerder zichtbaar wordt dan die schrijfactie
Antwoord en toelichting tonen

Antwoord: C. Het is een relatief sterk model dat alleen toestaat dat een leesactie van een ander adres na een schrijfactie eerder zichtbaar wordt dan die schrijfactie

Bij TSO blijven de volgorde van schrijfacties onderling, van leesacties onderling en van een schrijfactie na een leesactie behouden, en kan alleen een leesactie van een ander adres na een schrijfactie die inhalen. Dit is een model dat de aanwezigheid van de store buffer rechtstreeks weergeeft. Veel programma's werken binnen dit bereik intuïtief, dus bij x86 zijn barrières in relatief weinig situaties nodig.

Veelgestelde vragen

Wat is het verschil tussen cachecoherentie en geheugenconsistentie?

Coherentie zorgt ervoor dat alle cores schrijfacties naar één adres in dezelfde volgorde zien en uiteindelijk de laatste waarde lezen. Consistentie bepaalt in welke volgorde toegangen naar verschillende adressen door andere cores mogen worden waargenomen.

Waar staat TSO voor?

TSO staat voor total store order, het geheugenmodel van x86-processors. Het staat alleen toe dat een latere load naar een ander adres eerder wordt waargenomen dan een eerdere store, een effect van de store buffer.

Waarom hebben Arm- en RISC-V-programma's meer geheugenbarrières nodig dan x86-programma's?

Arm en RISC-V gebruiken zwakke geheugenmodellen die de meeste herordeningen van loads en stores naar verschillende adressen toestaan, dus ordening moet expliciet worden gevraagd. x86-TSO behoudt de meeste ordeningen al, zodat barrières alleen nodig zijn in gevallen zoals een store gevolgd door een load naar een ander adres.

“Geheugenconsistentiemodel (memory consistency model)” in de toelichting

Vragen met “Geheugenconsistentiemodel (memory consistency model)” (4)

  1. Wat legt een geheugenconsistentiemodel vast?
  2. Welke eigenschap van het geheugenconsistentiemodel van x86 (TSO, Total Store Order) is juist?
  3. In bovenstaande code bereidt thread 1 data voor en meldt dat met flag, en leest thread 2 data nadat hij flag heeft gezien. Wat is nodig om op een CPU met zwak geheugenconsistentiemodel zeker te zijn dat thread 2 de waarde 42 leest?
  4. Welk verschil tussen cachecoherentie en een geheugenconsistentiemodel is juist?

Verwante termen

Store buffer TSO (total store order) Numerieke apertuur (NA) Cachecoherentie ABA-probleem Acquire-release Atomaire instructie Barrièresynchronisatie Compare-and-swap Conditievariabele

Naar de woordenlijst