Multicore en synchronisatie

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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Multicore en synchronisatie

  1. Welke uitleg over een data race is juist?
  2. Wanneer bovenstaande code door twee threads tegelijk wordt uitgevoerd, kan de uiteindelijke waarde van counter kleiner zijn dan 200000. Wat is de juiste reden?
  3. Welke uitleg over atomaire instructies (ondeelbare instructies) is juist?
  4. Welke beschrijving van de werking van de atomaire instructie CAS (compare-and-swap) is juist?
  5. De bovenstaande code verdubbelt de gedeelde variabele counter met CAS(&p, verwachte waarde, nieuwe waarde). Wanneer mislukt CAS en wordt de lus opnieuw doorlopen?

Vergelijkingen bij dit onderwerp