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;
- AOmdat vermenigvuldiging en optelling in één instructie worden samengevoegd en de hoeveelheid rekenwerk halveert
- BOmdat a[i] direct na het schrijven kan worden gebruikt, zodat array a niet opnieuw uit het hoofdgeheugen hoeft te worden gelezen
- 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.