Geheugenhiërarchie en prestaties
Waarom wordt een bewerking die alleen de x-coördinaten optelt vaak sneller wanneer een array van structuren wordt omgeschreven tot een structuur van arrays (elke component in een eigen array)?
struct P { float x, y, z, mass; };
struct P p[N];
for (i = 0; i < N; i++)
sx += p[i].x;
- AOmdat de compiler bij een array van structuren geen instructie kan genereren die alleen x leest
- BOmdat de floating-point berekening met aparte arrays met hogere nauwkeurigheid wordt uitgevoerd
- COmdat de x-waarden aaneengesloten liggen en de ingelezen regel geen onnodige componenten bevat
Antwoord en toelichting tonen
Antwoord: C. Omdat de x-waarden aaneengesloten liggen en de ingelezen regel geen onnodige componenten bevat
Bij een array van structuren (AoS) staan x, y, z en massa als groepen van 16 byte naast elkaar, zodat bij een bewerking die alleen x leest drie kwart van een regel van 64 byte uit ongebruikte data bestaat. Als elke component in een eigen array staat (SoA), liggen de x-waarden aaneengesloten, wordt de ingelezen regel volledig benut en daalt het geheugenverkeer tot ongeveer een vierde. Ook vectorisatie met SIMD wordt eenvoudiger. Ook bij AoS kan een instructie die x leest worden gegenereerd, en de rekennauwkeurigheid verandert niet door de arrayvorm.