Geheugenhiërarchie en prestaties

Waarom wordt het samenvoegen van de twee bovenstaande lussen tot één lus (loop fusion) bij grote N vaak sneller?

for (i = 0; i < N; i++) a[i] = b[i] * 2;
for (i = 0; i < N; i++) c[i] = a[i] + 1;
  1. AOmdat vermenigvuldiging en optelling in één instructie worden samengevoegd en de hoeveelheid rekenwerk halveert
  2. BOmdat a[i] direct na het schrijven kan worden gebruikt, zodat array a niet opnieuw uit het hoofdgeheugen hoeft te worden gelezen
  3. COmdat het aantal lusiteraties van N naar 2N toeneemt, zodat de pipeline beter wordt gevuld
Antwoord en toelichting tonen

Antwoord: B. Omdat a[i] direct na het schrijven kan worden gebruikt, zodat array a niet opnieuw uit het hoofdgeheugen hoeft te worden gelezen

Bij gescheiden lussen geldt dat, als de in de eerste lus beschreven a als geheel niet in de cache past, bij het opnieuw lezen vanaf het begin in de tweede lus misses optreden. Bij samenvoeging wordt a[i] direct na het schrijven in dezelfde iteratie gebruikt, zodat de data worden hergebruikt zolang ze nog in de cache of een register staan en het verkeer met het hoofdgeheugen afneemt. De hoeveelheid rekenwerk verandert niet, en het aantal lusiteraties daalt van 2N naar N.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Geheugenhiërarchie en prestaties

  1. Waarom treden bij het transponeren van een grote matrix (b[j][i] = a[i][j]) vaak veel cachemisses op, en welke combinatie met een gangbare oplossing is juist?
  2. Welke eigenschap geldt in de geheugenhiërarchie van een gangbare computer voor hogere niveaus (dichter bij de CPU)?
  3. Waarom moeten cacheprestaties niet alleen op missratio, maar ook op gemiddelde geheugentoegangstijd worden vergeleken?
  4. Wanneer twee programma's afwisselend op dezelfde core worden uitgevoerd, kunnen ze trager zijn dan wanneer elk afzonderlijk draait. Welke verklaring is vanuit de cache bezien het meest passend?
  5. Welk voorbeeld illustreert temporele lokaliteit het best?

Vergelijkingen bij dit onderwerp