Vermeiden von Potenzen von 2 für Cache-Freundlichkeit

8

Nehmen wir an, im geschwindigkeitskritischen Code haben wir ein Paar Arrays, die häufig zusammen verwendet werden, wobei die genaue Größe keine Rolle spielt, sondern nur auf etwas Vernünftiges gesetzt werden muss, z. B.

%Vor%

Ist dies möglicherweise eine Pessimierung, weil die niedrigen Adressbits, die identisch sind, es dem Cache erschweren können, beide Arrays gleichzeitig zu behandeln? Wäre es besser, z.B. 300 statt 256?

    
rwallace 08.08.2012, 15:34
quelle

1 Antwort

6

Verschieben Sie meinen Kommentar zu einer Antwort:

Sie haben den Verdacht, dass Zweierpotenzen problematisch sein könnten. Aber es gilt normalerweise nur, wenn Sie mehr als 2 Schritte haben. Es wird nicht wirklich schlecht, bis Sie Ihre L1 Cache-Assoziativität überschreiten. Aber schon vorher könnte es zu falschen Alias-Problemen kommen.

Hier sind zwei Beispiele, wo Zweierpotenzen tatsächlich problematisch werden:

Im ersten Beispiel gibt es 4 Arrays - alle sind vom Start einer 4k-Seite an auf den gleichen Offset ausgerichtet.

Im zweiten Beispiel zerstört das spaltenweise Springen einer Matrix die Leistung vollständig, wenn die Größe eine Zweierpotenz ist.

Beachten Sie in jedem Fall, dass das Schlüsselkonzept tatsächlich die Ausrichtung der Arrays und nicht deren Größe ist. Wenn Sie feststellen, dass Sie in Verlangsamungen geraten, fügen Sie einfach einen Abstand zwischen Ihren Arrays hinzu, um die Ausrichtung zu unterbrechen.

    
Mysticial 08.08.2012, 17:43
quelle