Speicherhierarchie und Leistung
Welche Kombination aus Grund und typischer Gegenmaßnahme ist richtig, warum beim Transponieren einer großen Matrix (b[j][i] = a[i][j]) leicht viele Cache-Misses auftreten?
- AGrund ist der hohe Rechenaufwand. Gegenmaßnahme ist, Gleitkomma in Ganzzahlen umzuwandeln
- BGrund ist, dass das Lesen sprunghaft wird. Gegenmaßnahme ist, nur die Schreibseite zusammenhängend zu machen
- CGrund ist, dass entweder das Lesen oder das Schreiben in Spaltenrichtung erfolgt. Gegenmaßnahme ist blockweises Transponieren
Antwort und Erläuterung anzeigen
Antwort: C. Grund ist, dass entweder das Lesen oder das Schreiben in Spaltenrichtung erfolgt. Gegenmaßnahme ist blockweises Transponieren
Beim Transponieren wird a zeilenweise gelesen und nach b spaltenweise geschrieben; schreibt man umgekehrt b zeilenweise, liest man a spaltenweise, sodass einer der beiden Zugriffe zwangsläufig sprunghaft ist. Wird die Matrix daher in kleine Blöcke zerlegt, die in den Cache passen, und innerhalb der Blöcke transponiert, werden die geladenen Zeilen vollständig genutzt, bevor es weitergeht, und die Misses sinken stark. Nur die Schreibseite zusammenhängend zu machen löst das Problem nicht grundlegend, da das Lesen sprunghaft wird. Auch der Rechenaufwand ist nicht das Problem.