5 Stimmen

Umgang mit großen switch-Anweisungen in CUDA

Ich weiß, dass die Verzweigung in CUDA nicht empfohlen wird, da sie die Leistung beeinträchtigen kann. Bei meiner Arbeit muss ich immer wieder große Switch-Anweisungen implementieren, die mehrere Dutzend Fälle enthalten.

Hat jemand eine Ahnung, wie stark sich dies auf die Leistung auswirken wird? (Die offizielle Dokumentation ist nicht sehr spezifisch) Auch hat jemand eine effizientere Art der Handhabung dieses Teils?

9voto

Roger Dahl Punkte 14554

Die GPU führt Threads in Gruppen von 32 Threads aus, die Warps genannt werden. Wenn verschiedene Threads in einem Warp verschiedene Pfade im Code durchlaufen, muss die GPU den gesamten Warp mehrfach ausführen, einmal für jeden Codepfad.

Um dieses Problem, das als Warp-Divergenz bezeichnet wird, in den Griff zu bekommen, sollten Sie Ihre Threads so anordnen, dass die Threads in einem bestimmten Warp so wenig unterschiedliche Codepfade wie möglich durchlaufen. Wenn Sie das geschafft haben, müssen Sie in den sauren Apfel beißen und den Leistungsverlust akzeptieren, der durch die verbleibende Warp-Divergenz verursacht wird. In manchen Fällen können Sie nichts tun, um Ihre Threads zu ordnen. Wenn dies der Fall ist und wenn die verschiedenen Codepfade einen großen Teil des Kernels oder der Gesamtarbeitslast ausmachen, ist die Aufgabe möglicherweise nicht für die GPU geeignet.

Es spielt keine Rolle wie Sie implementieren die verschiedenen Codepfade. if-else , switch Wenn es darauf ankommt, dass die Threads in einem Warp auf unterschiedlichen Pfaden laufen, wird die Leistung beeinträchtigt.

Es spielt auch keine Rolle, wie viele Fäden jeden Pfad durchlaufen, sondern nur die Gesamtzahl der verschiedenen Pfade im Warp.

Hier ist eine andere Antwort zu diesem Thema, die etwas ausführlicher ist.

2voto

geek Punkte 1799

Ein guter Weg, um mehrere Schalter zu vermeiden, ist die Implementierung einer Funktionstabelle und die Auswahl der Funktion aus der Tabelle durch einen Index, der auf Ihrer Schalterbedingung basiert. CUDA erlaubt Ihnen die Verwendung von Funktionszeigern auf __device__ Funktion in Kerneln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X