Speicherhierarchie und Leistung
Warum wird es tendenziell schneller, die beiden obigen Schleifen zu einer zusammenzufassen (Loop Fusion), wenn N groß ist?
for (i = 0; i < N; i++) a[i] = b[i] * 2;
for (i = 0; i < N; i++) c[i] = a[i] + 1;
- AWeil Multiplikation und Addition in einer Anweisung zusammengefasst werden und sich die Rechenmenge halbiert
- BWeil a[i] direkt nach dem Schreiben verwendet werden kann und das Array a nicht erneut aus dem Hauptspeicher gelesen werden muss
- CWeil sich die Zahl der Schleifendurchläufe von N auf 2N erhöht und die Pipeline leichter gefüllt wird
Antwort und Erläuterung anzeigen
Antwort: B. Weil a[i] direkt nach dem Schreiben verwendet werden kann und das Array a nicht erneut aus dem Hauptspeicher gelesen werden muss
Bleiben es getrennte Schleifen und ist das Array a, das in der ersten Schleife geschrieben wird, so groß, dass es nicht in den Cache passt, treten in der zweiten Schleife beim erneuten Lesen vom Anfang her Misses auf. Bei Fusion wird a[i] direkt nach dem Schreiben im selben Durchlauf verwendet, sodass die Daten wiederverwendet werden, solange sie in Cache oder Register liegen, und der Verkehr zum Hauptspeicher sinkt. Die Rechenmenge ändert sich nicht, und die Zahl der Schleifendurchläufe sinkt von 2N auf N.