Erhält die Serialisierung des gleichzeitigen globalen Speicherzugriffs auf eine Adresse, wenn L1- und L2-Cache-Level vorhanden sind?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

Frage

Basierend auf dem, was ich kenne, wenn Threads eines Warp auf dieselbe Adresse in der globalen Erinnerung zugreifen, werden Anforderungen serialisiert, so dass es besser ist, den konstanten Speicher zu verwenden.Ist die Serialisierung des gleichzeitigen globalen Speicherzugriffs auf die GPU mit L1- und L2-Cache-Levels (in Fermi- und Kepler-Architektur)?Mit anderen Worten, wenn Threads eines Warp auf dieselbe globale Speicheradresse auf dieselbe globale Speicheradresse zugreifen, nehmen 31 Threads eines Warp-Vorteils von der Cache-Existenz, da ein Thread diese Adresse bereits angefordert hat?Was passiert, wenn der Zugriff ein Lesen ist, und auch wenn der Zugriff ein Schreiben ist?

War es hilfreich?

Lösung

Gleichzeitige globale Zugriffe auf dieselbe Adresse von Threads in derselben Warp in Fermi und Kepler werden nicht serialisiert. Das Warp-Lesen hat einen Rundfunkmechanismus, der alle solcher Liegestütze von einem einzelnen Cacheline-Lesen erfüllt, das keine Leistung auswirkt. Die Leistung ist derselbe, als wäre es ein vollständig koaleszierter Lesen. Dies gilt unabhängig von Cache-Spezifikationen, beispielsweise ist es wahr, auch wenn L1 Caching deaktiviert ist.

Die Leistung von simultanen Schreibgeräten ist nicht angegeben (AFAIK), aber -verhalten , gleichzeitige Schreibvorgänge werden immer serialisiert, und die Reihenfolge ist undefiniert.

edit reagiert auf weitere Fragen unten:

    .
  1. Selbst wenn alle Threads in der Warp denselben Wert in dieselbe Adresse schreiben, wird er serialisiert? Gibt es keinen Schreibtragsmechanismus, der eine solche Situation anerkennt?

Es gibt keinen Schreibbundmechanismus, der sich auf alle gleichzeitigen Schreibvorgänge ansieht, um zu sehen, ob sie alle gleich sind, und dabei einigen Aktionen basierend darauf. Die richtige Antwort ist, dass die Schreibweisen in nicht nähereriener Reihenfolge auftreten, und die Leistungsmerkmale sind undefiniert. Wenn alle schriftlichen Werte gleich sind, können Sie sichergestellt sein, dass der Wert, der am Standort endet, der Wert ist. Wenn Sie jedoch fragen, ob die Schreibaktivität auf einen einzelnen Zyklus zusammengebrochen ist oder mehrere Zyklen abgeschlossen ist, ist das tatsächliche Verhalten nicht definiert (undokumentiert) und in der Tat kann von einer Architektur zum nächsten variieren ( Beispielsweise kann CC1.x so serialisieren, dass alle Schreibvorgänge durchgeführt werden, während Cc2.x so "serialisieren" auf eine solche Weise, dass ein WISS "WINS", und alle anderen verworfen werden, nicht in den tatsächlichen Zyklen konsumieren.) Die Leistung ist wieder auf undokumentiert / nicht spezifiziert, aber das Verhalten von programmbeobachtbarem ist definiert.

2 Mit diesem Broadcast-Mechanismus haben Sie erläutert, der einzige Unterschied zwischen dem Konstantenspeicher-Broadcast-Access- und globalen Speicher-Broadcast-Zugriff ist, dass der erste den Zugriff auf den globalen Speicher leiten kann, der letztere jedoch eine dedizierte Hardware aufweist und ist schneller , richtig?

__constant__-Speicher verwendet den konstanten Cache, der ein dedizierter Hardware ist, das auf einer PER-SM-Basis verfügbar ist, und zwischen einem bestimmten Abschnitt des globalen Speicherplatzes in einer --lesbare -Mode. Dieser HW-Cache ist physisch und logisch von L1-Cache getrennt (falls vorhanden und aktiviert) und L2-Cache. Für Fermi und darüber hinaus sendungen beide Mechanismen, die Sendung auflesen, und für einen konstanten Cache, dies ist das bevorzugte Zugriffsmuster, da der konstante Cache nur einen Lesezugriff pro Zyklus bedienen kann (dh keine Ganze-Cacheline, die von einem Warp gelesen wird.) Jeder Mechanismus kann im Cache (falls vorhanden) "treffend" oder "Fräulein" und löschen Sie ein globales Lesen aus. Beim ersten Lesen eines bestimmten Standorts (oder Cacheline) verfügt Nieteher Cache über die angeforderten Daten, und es wird daher ein globaler Speicher lesen und auslösen, um den Zugriff zu bedienen. Danach werden in beiden Fällen nachfolgende Reads aus dem Cache gewartet, vorausgesetzt, dass die relevanten Daten nicht in der Zwischenzeit ausgerichtet werden. Bei frühen CC1.X-Geräten war der konstante Speichercache ziemlich wertvoll, da diese frühen Geräte keinen L1-Cache hatten. Für Fermi und außerhalb des Hauptgrundes, um den konstanten Cache zu verwenden, wäre, wenn er identifizierbare Daten (dh schreibgeschützte) und Zugriffsmuster (identische Adresse pro Warp) verfügbar sind, verfügbar, und dann wird die Verwendung des konstanten Caches verhindern, dass diejenigen, dass diejenigen, dass sie durch L1 und möglicherweise von der Fahrt gelesen werden andere Daten hervorrufen. In der Tat erhöhen Sie den speicherbaren Fußabdruck etwas, über das, was der L1 alleine unterstützen kann.

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