Frage

Dies ist eine etwas untergeordnete Frage.In der x86-Assembly gibt es zwei SSE-Anweisungen:

MOVDQA xmmi, m128

Und

MOVNTDQA xmmi, m128

Im IA-32-Softwareentwicklerhandbuch heißt es, dass NT in MOVNTDQA steht für Nichtzeitlich, und dass es ansonsten dasselbe wie MOVDQA ist.

Meine Frage ist, was bedeutet Nichtzeitlich bedeuten?

War es hilfreich?

Lösung

Nicht-temporale SSE-Anweisungen (MOVNTI, MOVNTQ usw.) folgen nicht den normalen Cache-Kohärenzregeln.Daher muss auf nicht-temporäre Speicherungen eine SFENCE-Anweisung folgen, damit ihre Ergebnisse von anderen Prozessoren rechtzeitig gesehen werden können.

Wenn Daten erzeugt und nicht (sofort) wieder verbraucht werden, beeinträchtigt die Tatsache, dass Speicherspeichervorgänge zuerst eine vollständige Cache-Zeile lesen und dann die zwischengespeicherten Daten ändern, die Leistung.Durch diesen Vorgang werden Daten aus den Caches verschoben, die möglicherweise erneut benötigt werden, und zwar zugunsten von Daten, die nicht bald verwendet werden.Dies gilt insbesondere für große Datenstrukturen wie Matrizen, die gefüllt und dann später verwendet werden.Bevor das letzte Element der Matrix gefüllt ist, verdrängt die schiere Größe die ersten Elemente, wodurch das Caching der Schreibvorgänge wirkungslos wird.

Für diese und ähnliche Situationen bieten Prozessoren Unterstützung für nicht-zeitliche Schreibvorgänge.Nicht temporär bedeutet in diesem Zusammenhang, dass die Daten nicht bald wiederverwendet werden, sodass es keinen Grund gibt, sie zwischenzuspeichern.Bei diesen nicht-temporären Schreibvorgängen wird keine Cache-Zeile gelesen und anschließend geändert.Stattdessen wird der neue Inhalt direkt in den Speicher geschrieben.

Quelle: http://lwn.net/Articles/255364/

Andere Tipps

Espo ist ziemlich genau auf dem richtigen Weg.Ich wollte nur meine Anmerkungen hinzufügen:

Der Ausdruck „nicht temporal“ bedeutet fehlende zeitliche Lokalität.Caches nutzen zwei Arten von Lokalitäten – räumliche und zeitliche – und durch die Verwendung einer nicht-temporalen Anweisung signalisieren Sie dem Prozessor, dass Sie nicht damit rechnen, dass das Datenelement in naher Zukunft verwendet wird.

Ich bin etwas skeptisch gegenüber der handcodierten Assembly, die die Anweisungen zur Cache-Steuerung verwendet.Meiner Erfahrung nach führen diese Dinge zu mehr bösen Fehlern als jede effektive Leistungssteigerung.

Laut dem Intel® 64 and IA-32 Architectures Software Developer's Manual, Band 1:Grundlegende Architektur, "Programmierung mit Intel Streaming SIMD -Erweiterungen (Intel SSE)":

Zwischenspeicherung von zeitlichem vs.Nicht-zeitliche Daten

Daten, auf die ein Programm verweist, können zeitlich (Daten werden erneut verwendet) oder nicht temporal (Daten werden einmal referenziert und in der unmittelbaren Zukunft nicht wiederverwendet) sein.Beispielsweise ist Programmcode im Allgemeinen temporal, wohingegen Multimediadaten, wie etwa die Anzeigeliste in einer 3D-Grafikanwendung, oft nicht temporal sind.Um die Caches des Prozessors effizient zu nutzen, ist es im Allgemeinen wünschenswert, zeitliche Daten zwischenzuspeichern und nicht-zeitliche Daten nicht zwischenzuspeichern.Das Überladen der Caches des Prozessors mit nicht-zeitlichen Daten wird manchmal als „Verschmutzen der Caches“ bezeichnet.Die Anweisungen zur Steuerung der Cachefähigkeit von SSE und SSE2 ermöglichen es einem Programm, nicht-temporale Daten auf eine Weise in den Speicher zu schreiben, die die Verschmutzung von Caches minimiert.

Beschreibung nichtzeitlicher Lade- und Speicheranweisungen.Quelle:Software-Entwicklerhandbuch für Intel 64- und IA-32-Architekturen, Band 2:Befehlssatzreferenz

LOAD (MOVNTDQA – Nicht temporal ausgerichteter Doppel-Quadword-Hinweis laden)

Lädt ein Doppel-Quadwort vom Quelloperanden (zweiter Operand) in den Zieloperanden (erster Operand) unter Verwendung eines nicht-zeitlichen Hinweises, wenn die Speicherquelle vom Speichertyp WC (Write Combining) ist.

[...] liest der Prozessor weder die Daten in die Cache-Hierarchie, noch holt er die entsprechende Cache-Zeile aus dem Speicher in die Cache-Hierarchie.

Beachten Sie, dass es, wie Peter Cordes anmerkt, im normalen WB-Speicher (Write-Back) auf aktuellen Prozessoren nicht sinnvoll ist, da der NT-Hinweis ignoriert wird (wahrscheinlich, weil es keine NT-fähigen HW-Prefetcher gibt) und die vollständige stark geordnete Ladesemantik gilt . prefetchnta kann als schadstoffmindernde Last aus dem WB-Speicher genutzt werden

STORE (MOVNTDQ – Gepackte ganze Zahlen mit nicht-temporalem Hinweis speichern)

Verschiebt die gepackten Ganzzahlen im Quelloperanden (zweiter Operand) mithilfe eines nicht temporalen Hinweises zum Zieloperanden (erster Operand), um ein Zwischenspeichern der Daten während des Schreibens in den Speicher zu verhindern.

[...] schreibt der Prozessor weder die Daten in die Cache-Hierarchie, noch holt er die entsprechende Cache-Zeile aus dem Speicher in die Cache-Hierarchie.

Unter Verwendung der in definierten Terminologie Cache-Schreibrichtlinien und Leistung, können sie als umschreibbar betrachtet werden (No-Write-Allocate, No-Fetch-on-Write-Miss).

Abschließend kann es interessant sein, dies zu überprüfen John McAlpin macht Anmerkungen zu nicht-zeitlichen Speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top