Dies ist eine etwas untergeordnete Frage. In der x86-Assembly gibt es zwei SSE-Anweisungen:
MOVDQA xmmi, m128
und
MOVNTDQA xmmi, m128
Das IA-32 Software Developer's Manual besagt, dass der NT in MOVNTDQA für Non-Temporal steht steht und ansonsten dasselbe wie MOVDQA ist.
Meine Frage ist, was bedeutet nicht-zeitlich ?
MOVNTDQA xmmi, m128
eine NT-Last ist, während alle anderen NT-Anweisungen außer gespeichert sindprefetchnta
. Die akzeptierte Antwort hier scheint nur über Geschäfte zu sprechen. Dies ist, was ich über NT-Lasten auftauchen konnte . TL: DR: Hoffentlich macht die CPU mit dem NT-Hinweis etwas Nützliches, um die Cache-Verschmutzung zu minimieren, aber sie überschreibt nicht die stark geordnete Semantik des "normalen" WB-Speichers, so dass sie den Cache verwenden müssen.Antworten:
Nicht-zeitliche SSE-Anweisungen (MOVNTI, MOVNTQ usw.) folgen nicht den normalen Cache-Kohärenzregeln. Daher müssen nicht-zeitlichen Speichern eine SFENCE-Anweisung folgen, damit ihre Ergebnisse von anderen Prozessoren rechtzeitig gesehen werden können.
Wenn Daten erzeugt und nicht (sofort) wieder verbraucht werden, wirkt sich die Tatsache, dass Speicherspeicheroperationen zuerst eine vollständige Cache-Zeile lesen und dann die zwischengespeicherten Daten ändern, nachteilig auf die Leistung aus. 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 später verwendet werden. Bevor das letzte Element der Matrix gefüllt wird, werden die ersten Elemente durch die schiere Größe entfernt, wodurch das Zwischenspeichern der Schreibvorgänge unwirksam wird.
Für diese und ähnliche Situationen bieten Prozessoren Unterstützung für nicht-zeitliche Schreibvorgänge. Nicht zeitlich begrenzt bedeutet in diesem Zusammenhang, dass die Daten nicht bald wiederverwendet werden, sodass kein Grund besteht, sie zwischenzuspeichern. Diese nicht-zeitlichen Schreibvorgänge lesen keine Cache-Zeile und ändern sie dann. Stattdessen wird der neue Inhalt direkt in den Speicher geschrieben.
Quelle: http://lwn.net/Articles/255364/
quelle
SFENCE
nicht erforderlich sein. Zumindest im selben Thread. Könnten Sie auch schauen?sfence
NT-Stores erforderlich sind, während dies nur für normale Stores erforderlich ist. NT-Stores werden nicht in Bezug auf andere Stores (NT oder nicht) bestellt, wie von anderen Threads gesehen , ohne einsfence
. Für Lesevorgänge aus demselben Thread, in dem die Stores ausgeführt wurden, benötigen Sie jedoch niesfence
: Ein bestimmter Thread sieht seine eigenen Stores immer in Programmreihenfolge, unabhängig davon, ob es sich um NT-Stores handelt oder nicht.Espo ist ziemlich genau richtig. Ich wollte nur meine zwei Cent hinzufügen:
Die "nicht zeitliche" Phrase bedeutet fehlende zeitliche Lokalität. Caches nutzen zwei Arten von Lokalitäten - räumliche und zeitliche. Wenn Sie eine nicht-zeitliche Anweisung verwenden, signalisieren Sie dem Prozessor, dass Sie nicht erwarten, dass das Datenelement in naher Zukunft verwendet wird.
Ich bin etwas skeptisch gegenüber der handcodierten Assembly, die die Anweisungen zur Cache-Steuerung verwendet. Nach meiner Erfahrung führen diese Dinge zu mehr bösen Fehlern als jede effektive Leistungssteigerung.
quelle
Gemäß dem Softwareentwicklerhandbuch für Intel® 64- und IA-32-Architekturen, Band 1: Grundlegende Architektur, Kapitel "Programmieren mit Intel Streaming SIMD Extensions (Intel SSE)":
Caching von zeitlichen und nicht-zeitlichen Daten
Beschreibung der nicht-zeitlichen Lade- und Speicheranweisungen. Quelle: Intel 64- und IA-32-Architekturen Software-Entwicklerhandbuch, Band 2: Befehlssatzreferenz
LOAD (MOVNTDQA - Nicht zeitlich ausgerichteten Doppelquadword-Hinweis laden)
Beachten Sie, dass es, wie Peter Cordes kommentiert, im normalen WB-Speicher (Write-Back) auf aktuellen Prozessoren nicht nützlich 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 verschmutzungsreduzierende Last aus dem WB-Speicher verwendet werdenSTORE (MOVNTDQ - Gepackte Ganzzahlen mit nicht-zeitlichem Hinweis speichern)
Verwenden der in Cache Write Policies and Performance definierten Terminologie können sie als Write-Around (No-Write-Allocate, No-Fetch-On-Write-Miss) betrachtet werden.
Schließlich kann es interessant sein, John McAlpins Notizen zu nicht-temporären Speichern zu lesen .
quelle
MOVNTDQA
nur etwas Besonderes in WC-Speicherbereichen (nicht zwischenspeicherbar), z. B. Video-RAM. Es ist im normalen WB-Speicher (Write-Back) auf der aktuellen HW überhaupt nicht nützlich, der NT-Hinweis wird ignoriert und es gilt die vollständige, stark geordnete Ladesemantik.prefetchnta
aber als Verschmutzung- kann nützlich sein, zu reduzieren Belastung von WB - Speichern. Unterstützen aktuelle x86-Architekturen nicht-zeitliche Lasten (aus "normalem" Speicher)? .