Wat is False sharing?

Verschijnsel waarbij afzonderlijke threads verschillende variabelen wijzigen, maar die in dezelfde cacheregel liggen, zodat de regel tussen cores heen en weer gaat en het traag wordt.

Japanse benaming: 偽共有

“False sharing” komt voor in 4 oefenvragen uit 2 onderwerpen, bijv. Multicore en synchronisatie, CPU en architectuur.

Vakgebied: Multicore en synchronisatie

Nu oefenen: vragen over False sharing

Welke uitleg over false sharing, dat bij multithreaded programma's optreedt, is juist?

  1. AVerschillende threads wijzigen verschillende variabelen, maar omdat die in dezelfde cacheregel liggen, pendelt de regel tussen de cores en wordt het traag
  2. BTwee threads wijzigen dezelfde variabele zonder synchronisatie, waardoor de waarde wordt verstoord
  3. CThreads wachten op elkaars locks en blijven stilstaan
Antwoord en toelichting tonen

Antwoord: A. Verschillende threads wijzigen verschillende variabelen, maar omdat die in dezelfde cacheregel liggen, pendelt de regel tussen de cores en wordt het traag

Coherentie wordt per cacheregel (gewoonlijk 64 byte) beheerd. Zelfs als core 0 alleen variabele a en core 1 alleen variabele b wijzigt, wordt bij ligging in dezelfde regel bij elke schrijfactie de kopie van de ander ongeldig en pendelt de regel tussen de twee cores. Dit is false sharing: het resultaat is juist, maar de prestaties dalen sterk. Het probleem treedt gemakkelijk op bij arrays voor tellingen per thread.

Bij een array van tellers per thread zoals 'long cnt[8];' treedt false sharing op. Welke maatregel is het meest geschikt?

  1. AHet type van de teller van long in int veranderen om de array te verkleinen
  2. BOpvulling tussen de tellers invoegen of ze uitlijnen, zodat ze in afzonderlijke cacheregels staan
  3. CHet aantal threads vergroten om de wachttijd te spreiden
Antwoord en toelichting tonen

Antwoord: B. Opvulling tussen de tellers invoegen of ze uitlijnen, zodat ze in afzonderlijke cacheregels staan

Bij een long van 8 byte passen 8 tellers in één regel van 64 byte, en alle threads strijden om dezelfde regel. Als opvulling wordt ingevoegd zodat elke teller per 64 byte staat, of de structuur op de grootte van de cacheregel wordt uitgelijnd, gebruikt elke thread een eigen regel. Het is ook effectief dat elke thread met een lokale variabele telt en aan het eind slechts één keer bij de gedeelde plaats optelt.

“False sharing” in de toelichting

Vragen met “False sharing” (4)

  1. Welke uitleg over false sharing, dat bij multithreaded programma's optreedt, is juist?
  2. Bij een array van tellers per thread zoals 'long cnt[8];' treedt false sharing op. Welke maatregel is het meest geschikt?
  3. Welke grootte van een cacheregel (cacheblok) is gebruikelijk in de meeste huidige CPU's?
  4. Welke van de volgende is geen oorzaak dat de prestaties van een parallel programma niet naar verwachting stijgen als het aantal cores wordt vergroot?

Verwante termen

Cacheregel (cache line) Ruimtelijke lokaliteit (spatial locality) Wet van Amdahl ABA-probleem Acquire-release Atomaire instructie Barrièresynchronisatie Compare-and-swap Conditievariabele Data race

Naar de woordenlijst