Speicherhierarchie und Leistung
Warum wird die oben gezeigte Summierung nur der x-Koordinaten tendenziell schneller, wenn sie auf eine Struktur von Arrays umgeschrieben wird (jede Komponente in einem eigenen Array)?
struct P { float x, y, z, mass; };
struct P p[N];
for (i = 0; i < N; i++)
sx += p[i].x;
- AWeil der Compiler bei einem Array von Strukturen keine Anweisungen erzeugen kann, die nur x lesen
- BWeil getrennte Arrays die Gleitkommaberechnung mit höherer Genauigkeit ausführen
- CWeil die x-Werte zusammenhängend liegen und sich in den geladenen Zeilen keine unnötigen Komponenten mehr befinden
Antwort und Erläuterung anzeigen
Antwort: C. Weil die x-Werte zusammenhängend liegen und sich in den geladenen Zeilen keine unnötigen Komponenten mehr befinden
Bei einem Array von Strukturen (AoS) liegen x, y, z und mass in Gruppen zu 16 Byte hintereinander, sodass selbst bei einer Verarbeitung, die nur x liest, drei Viertel einer 64-Byte-Zeile nicht benötigte Daten sind. Hat jede Komponente ein eigenes Array (SoA), liegen die x-Werte zusammenhängend, die geladenen Zeilen werden vollständig genutzt, und der Speicherverkehr sinkt auf etwa ein Viertel. Auch die Vektorisierung mit SIMD wird einfacher. Auch bei AoS lassen sich Anweisungen zum Lesen von x erzeugen, und eine Änderung der Array-Form ändert die Berechnungsgenauigkeit nicht.