Frage Wie viele Speicherlatenzzyklen pro Speicherzugriffstyp in OpenCL / CUDA?


Ich habe den Programmierleitfaden und die Best Practices-Anleitung gelesen und erwähnt, dass der Zugriff auf den Global Memory 400-600 Zyklen benötigt. Ich habe auf den anderen Speichertypen wie Textur-Cache, Konstanten-Cache, Shared Memory nicht viel gesehen. Register haben eine Speicherwartezeit von 0.

Ich denke, konstanter Cache ist der gleiche wie Register, wenn alle Threads die gleiche Adresse im konstanten Cache verwenden. Im schlimmsten Fall bin ich mir nicht so sicher.

Shared Memory ist genauso wie Register, solange keine Bankkonflikte bestehen? Wenn ja, wie entfaltet sich die Latenz?

Was ist mit Textur-Cache?


5
2017-11-04 14:27


Ursprung


Antworten:


Die Latenz zu den gemeinsam genutzten / Konstanten / Textur-Speichern ist gering und hängt davon ab, welches Gerät Sie haben. Im Allgemeinen sind GPUs als eine Durchsatzarchitektur ausgelegt, was bedeutet, dass durch das Erzeugen von genügend Threads die Latenz zu den Speichern, einschließlich des globalen Speichers, verborgen ist.

Der Grund, warum die Guides über die Latenz zum globalen Speicher sprechen, ist, dass die Latenz um Größenordnungen höher ist als die anderer Speicher, was bedeutet, dass es die dominante Latenz ist, die für die Optimierung in Betracht gezogen wird.

Sie haben insbesondere den konstanten Cache erwähnt. Sie sind völlig richtig, wenn alle Threads innerhalb eines Warps (d. H. Eine Gruppe von 32 Threads) auf dieselbe Adresse zugreifen, dann gibt es keine Strafe, d. H. Der Wert wird aus dem Cache gelesen und an alle Threads gleichzeitig gesendet. Wenn Threads jedoch auf andere Adressen zugreifen, müssen die Zugriffe serialisieren da der Cache immer nur einen Wert zur Verfügung stellen kann. Wenn Sie den CUDA Profiler verwenden, wird dieser unter dem Serialisierungszähler angezeigt.

Freigegebener Speicher kann im Gegensatz zu konstantem Cache eine viel höhere Bandbreite bereitstellen. Besuche die CUDA-Optimierung sprechen Sie für weitere Details und eine Erklärung von Bankkonflikten und deren Auswirkungen.


4
2017-11-04 16:40



Für (Kepler) Tesla K20 sind die Latenzen wie folgt:

Globaler Speicher: 440 Uhren
  Konstante Erinnerung
  L1: 48 Uhren
  L2: 120 Uhren
  Shared Memory: 48 Uhren
  Texturspeicher
  L1: 108 Uhren
  L2: 240 Uhren

Wie soll ich wissen? Ich habe die von den Autoren von Entmystifizierung der GPU-Mikroarchitektur durch Microbenchmarking. Sie liefern ähnliche Ergebnisse für die ältere GTX 280.

Dies wurde auf einem Linux-Cluster gemessen, der Computerknoten, auf dem ich die Benchmarks ausführte, wurde von keinem anderen Benutzer verwendet oder führte keine anderen Prozesse aus. Es ist BULLX Linux mit einem Paar 8 Kern Xeons und 64 GB RAM, nvcc 6.5.12. Ich habe das geändert sm_20 zu sm_35 zum Kompilieren.

Es gibt auch ein Operanden kosten Kapitel in PTX ISA, obwohl es nicht sehr hilfreich ist, es wiederholt nur, was Sie bereits erwarten, ohne genaue Zahlen zu geben.


6
2017-12-09 16:29