Ich habe den Programmierleitfaden und die Best Practices-Anleitung gelesen und erwähnt, dass der Global Memory-Zugriff 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.Wie viele Speicherlatenzzyklen pro Speicherzugriffstyp in OpenCL/CUDA?
Ich denke, konstante Cache ist das gleiche wie die Register, wenn alle Threads die gleiche Adresse im konstanten Cache verwenden. Im schlimmsten Fall bin ich mir nicht so sicher.
Shared Memory ist wie Register, solange keine Bankkonflikte bestehen? Wenn ja, wie entfaltet sich die Latenz?
Was ist mit Textur-Cache?
Lohnt es sich immer Konstanten-Cache zu verwenden, wenn zum Beispiel alle Threads auf 1000 Floats zugreifen? Wäre das wie ein 1000 liest aus einem Register? Der Leitfaden sagte die Verwendung von konstanten Cache auf diese Weise skaliert linear richtig? – smuggledPancakes
Wenn alle Threads in einer Iteration einer Schleife auf den gleichen Wert zugreifen, können Sie den Konstantencache verwenden. Der konstante Cache wird aufgrund der räumlichen Lokalität einen gewissen Vorteil bieten (auf Fermi kann der L1-Cache das gleiche erreichen, aber dadurch bleibt L1 für andere Daten frei). Nachdem ich das gesagt habe, wende ich mich hauptsächlich an Fermi und benutze niemals "__constant__", ich benutze nur const viel und lasse den Compiler es herausfinden! In deinem Fall würde ich beispielsweise den Kernel arg als 'const float * const myfloatarray' übergeben. Ich würde empfehlen, den Visual Profiler immer auf Serialisierung zu überprüfen, nur für den Fall, dass Sie etwas übersehen haben. – Tom
Man könnte hinzufügen, dass Cache-Zeilen 128 Byte (32 Byte) für L1 (L2) sind, also sprechen wir über Adressen, die in die gleichen Zeilen fallen (nicht notwendigerweise dieselben Adressen). Einige Zahlen zu anderen Latenzzeiten finden Sie [hier] (http://stackoverflow.com/questions/6744101/fermi-l2-cache-hit-latency). –