Hiérarchie mémoire
Pourquoi le traitement ci-dessus, qui additionne uniquement les coordonnées x, devient-il généralement plus rapide une fois réécrit sous forme de structure de tableaux (chaque composante dans un tableau séparé) ?
struct P { float x, y, z, mass; };
struct P p[N];
for (i = 0; i < N; i++)
sx += p[i].x;
- AAvec un tableau de structures, le compilateur ne peut pas générer d’instructions qui lisent uniquement x
- BAvec des tableaux séparés, les calculs en virgule flottante gagnent en précision
- CSeuls les x sont contigus, et les lignes chargées ne contiennent pas de composantes inutiles
Afficher la réponse et l'explication
Réponse : C. Seuls les x sont contigus, et les lignes chargées ne contiennent pas de composantes inutiles
Dans un tableau de structures (AoS), x, y, z et mass forment des groupes de 16 octets ; même un traitement qui ne lit que x laisse inutilisés les trois quarts de chaque ligne de 64 octets. Avec une structure de tableaux (SoA), seuls les x sont contigus : les lignes chargées sont entièrement utilisées et le trafic mémoire est divisé par environ 4. La vectorisation SIMD est également facilitée. Des instructions lisant x existent aussi en AoS, et changer la disposition du tableau ne modifie pas la précision des calculs.