2013-09-30 8 views
6

Ich dachte immer, dass Zweig Divergenz nur durch den Verzweigungscode verursacht wird, wie „if“, „else“, „für“, „Switch“, etc. Aber ich ein Papier vor kurzem, in dem gelesen haben heißt es:In CUDA verursachen nicht zusammengewachsene Speicherzugriffe Verzweigungsdivergenz?

" Dies ist in der Regel die Ergebnisse von zusätzlichen nicht zusammengewachsenen Zugriffen auf die Globaler Speicher Eine solche Thread-Divergenz führt daher zu vielen Speicherzugriffen, die serialisiert werden müssen, wodurch die Gesamtzahl der ausgeführten Befehle erhöht wird

Man kann beobachten, dass die Anzahl der Warp-Serialisierungen für die Version, die nicht zusammengewachsene Zugriffe verwendet, zwischen sieben und sechzehn Mal wichtiger ist als für ihr Pendant. Tatsächlich führt eine Thread-Divergenz, die durch nicht zusammengewachsene Zugriffe verursacht wird, zu vielen Speicherzugriffen, die serialisiert werden müssen, was die auszuführenden Befehle erhöht. "

Es scheint so, nach Ansicht des Autors, nicht-koalesziert Zugriffe divergent Zweige führen kann. Ist das wahr? Meine Frage ist, wie genau viele Gründe für die Branche Divergenz da? Vielen Dank im Voraus.

+1

Können Sie mit der ursprünglichen Referenz verknüpfen? – talonmies

+1

+1 Ich möchte wirklich wissen, wie eine Speicherzugriffsstrategie für divergente Verzweigungen verantwortlich wäre. Bitte fügen Sie die Referenz hinzu. –

+1

Diese These sollte die Referenz sein. Die 2 Paragraphen stammen von p80 bzw. p107. http://mistic.heig-vd.ch/luong/thesis.pdf – kangshiyin

Antwort

3

ich glaube, der Autor auf den Konzepten unklar ist und/oder Terminologie.

die beiden Konzepte der Divergenz und Serialisierung sind eng verwandt. Divergence Serialisierung verursacht, da die divergierenden Gruppen von Fäden in einem Kett seriell ausgeführt werden müssen Aber die Serialisierung verursacht keine Divergenz, da Divergenz ref spezifisch für Threads innerhalb eines Warps, die unterschiedliche Codepfade durchlaufen.

Andere Dinge, die Serialisierung (aber nicht Divergenz) verursachen, sind Bankkonflikte und atomare Operationen.

+1

Ein anderes Beispiel für eine Serialisierung ohne Verzweigungsdivergenz wäre ungleichmäßiger Zugriff auf __konstanten__ Speicher. – njuffa

+0

Danke für die Klärung der beiden Konzepte. Also hat das nicht zusammengewachsene Speicherzugriffsmuster des Algorithmus/Codes absolut nichts mit der Verzweigungsdivergenz zu tun, genauer gesagt mit dem "Zweigeffizienz" -Ergebnis, das vom NVIDIA Profiler erhalten wurde? – Ben

+0

@Ben: Das ist richtig. Die CUDA Profiler Dokumente sagen: 'Branch Efficiency = ({Zweige} - {Verzweigungen verzweigen})/{Branches}' und 'Divergente Zweige = Zweige, die unterschiedlich über einen Warp ausgewertet wurden 'und' Verzweigungen = Verzweigungsanweisungen ausgeführt'. Mit anderen Worten bezieht sich "Branch Efficiency" speziell auf die Verzweigungsbefehle in einem Warp und zählt die Fälle, in denen sie divergieren (einige werden genommen und einige nicht genommen). –