Speicherhierarchie und Leistung
In der obigen Schleife ist int 4 Byte groß und die Cache-Zeile 64 Byte; das Array liegt nicht im Cache, und sein Anfang ist an der Zeilengrenze ausgerichtet. Wie hoch ist die Miss-Rate beim Lesen des Arrays ohne Prefetch?
int a[1024];
for (i = 0; i < 1024; i++)
sum += a[i];
- A12,5 %
- B6,25 %
- C100 %
Antwort und Erläuterung anzeigen
Antwort: B. 6,25 %
In eine 64-Byte-Zeile passen 64 ÷ 4 = 16 int-Werte. Beim fortlaufenden Lesen gibt es beim ersten Element jeder Zeile einen Miss, die übrigen 15 sind Treffer; die Miss-Rate beträgt 1 ÷ 16 = 6,25 %. Bei 1024 Elementen sind es 1024 ÷ 16 = 64 Misses. 12,5 % ist der Wert bei der irrtümlichen Annahme, dass nur 8 Werte in eine Zeile passen. 100 % ergeben sich bei Zugriffen, die pro Zeile nur ein Element nutzen, etwa wenn jedes 16. Element (im Abstand von 64 Byte) gelesen wird.