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];
  1. A12,5 %
  2. B6,25 %
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Speicherhierarchie und Leistung

  1. Was ist der Hauptzweck von Loop Blocking (Tiling), das z. B. beim Matrixprodukt verwendet wird?
  2. 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)?
  3. Was ist der Hauptvorteil eines L1-Caches, der in einen Befehlscache (I-Cache) und einen Datencache (D-Cache) aufgeteilt ist?
  4. In einem System mit 4 KB Seitengröße und 64 Byte Zeilengröße soll der L1-Cache virtuell indiziert und physisch getaggt (VIPT) sein, wobei Index und Offset nur aus Bits innerhalb der Seite bestehen sollen. Wie groß darf der Cache bei 8-fach Satzassoziativität höchstens sein?
  5. Was ist der Hauptgrund, weshalb bei L1-Caches häufig das VIPT-Verfahren (virtuell indiziert, physisch getaggt) verwendet wird?

Vergleiche zu diesem Thema