2013-02-12 15 views
5

Warum benötigen wir ausgerichteten Speicher für SSE/AVX?Beziehung zwischen SSE-Vektorisierung und Speicherausrichtung

Eine der Antworten, die ich oft bekomme, ist ausgerichtet Speicherlast ist viel schneller als nicht ausgerichtete Speicherlast. Warum ist diese ausgerichtete Speicherlast viel schneller als die nicht ausgerichtete Speicherauslastung?

Antwort

9

Dies ist nicht nur spezifisch für SSE (oder sogar x86). Auf den meisten Architekturen müssen Lasten und Speicher natürlich ausgerichtet sein, andernfalls erzeugen sie entweder (a) eine Ausnahme oder (b) benötigen zwei oder mehr Zyklen plus einige Korrekturen, um die fehlausgerichtete Ladung/Speicherung transparent zu handhaben. Auf x86 (b) gilt für die Datentypen < 16 Bytes, aber (a) gilt für SSE-Datentypen, es sei denn, Sie verwenden explizit fehlausgerichtete Versionen der Lade-/Speicherbefehle, die fehlausgerichtete Daten verarbeiten können.

Sie fragen sich vielleicht: Warum nicht einfach die fehlausgerichteten Versionen dieser SSE-Lade-/Speicherbefehle verwenden, unabhängig von der Ausrichtung? Die Antwort ist, dass diese Anweisungen typischerweise viel langsamer sind als ihre angepassten Gegenstücke, da sie sich im Allgemeinen gemäß (b) oben verhalten, was sie typischerweise 2x oder langsamer macht, abgesehen von aktuellen Intel CPUs wie Core i7, wo die Strafe viel kleiner ist aber nicht unbedeutend.

+2

Und bedenken Sie, dass auch bei modernen Kernen, bei denen fehlausgerichtete Zugriffe im Allgemeinen schnell sind, Seitenzugriffe immer noch ziemlich langsam sind. Wenn Ihr Puffer groß genug und falsch ausgerichtet ist, enthält er Seitenübergänge. –

+1

Wahr, und das Überschreiten von Cache-Zeilengrenzen aufgrund von Fehlausrichtungen kann zu einem größeren Cache-Footprint führen, der sich ebenfalls negativ auf die Leistung auswirken kann. –

+1

Seiten zu überqueren ist noch schlimmer ... – Mysticial

Verwandte Themen