Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

06.12.2010, 16:42

[HLSL] Dynamic Branching für mehr Performance?

Hi Leute!
Ich bin in der MSDN über "Omptimizing HLSL Shaders" gestolpert. Dort wird zu Dynamic Branching geraten, um die Performance zu verbessern. Dynamic Branching kenne ich aber allgemein nur als Performance-Killer.
Hier der Artikel: Link

Ich gehe jetzt mal von DirectX 10 Hardware und höher aus.
Was sagt ihr dazu? Hat schonmal jemand daruch Performance gut gemacht?
Oder waren das nur nicht gründlich überlegte Gedankengänge von Microsoft, die nicht wissen, was sie schreiben?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.12.2010, 17:10

Wie immer bei solchen Fragen lautet hier die erste Antwort: Kann man so allgemein nicht beantworten, hängt vom konkreten Fall ab. Grundsätzlich muss man eben den Overhead den man sich durch Dynamic Branching einhandelt gegen den Overhead den man sich durch das Branching sparen kann abwägen. Dynamic Branching wird auf aktueller (D3D10+) Hardware normalerweise dann zum Performance-Killer wenn du stark divergierende Branches hast, d.h. benachbarte Pixel nehmen sehr oft verschiedene Codezweige. Wenn sehr viele Pixel in großflächigen Bereichen alle den selben Pfad nehmen und z.B. nur wenige Pixel an einigen Diskontinuitäten den anderen Zweig dann wird der Overhead praktisch zu Null. (Hintergrund: Moderne GPUs führen Shader einfach gesagt in Gruppen zusammengefasst parallel auf Instruktionsebene aus. D.h. auf einem "GPU Core" laufen z.B. zu jedem Zeitpunkt 32 Pixel gleichzeitig wobei in jedem Takt eben die selbe Instruktion nur eben auf den entsprechenden Daten des jeweiligen Pixels ausgeführt wird. So lange alle 32 Pixel den selben Strom an Instructions abarbeiten ist gibt es gar keinen Overhead, egal in welchem Codezweig sich die Pixel befinden, es muss einfach nur der selbe sein. Erst wenn mindestens ein Pixel der Gruppe einen anderen Pfad nimmt muss der Core beide Pfade abarbeiten (einmal für alle Pixel in Pfad 1 und einmal für alle Pixel in Pfad 2 während jeweils die anderen Pixel schlafen gelegt werden) und erst dann gibt es einen nennenswerten Overhead (von der Compare-Operation die über die Branch entscheidet mal abgesehen, aber die wird normalerweise kaum ins Gewicht fallen)).
Zusammengefasst: Dynamic Branching kann einen Performancevorteil bringen genauso wie einen Performancenachteil. Die einzige sichere Antwort auf deine Frage erhältst du wie immer nur indem du beide Varianten ausprobierst und misst welche schneller ist.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

3

06.12.2010, 17:15

OK, dachte ich mir schon. Ich hatte eigentlichg gehofft, dass das schonmal jemand ausprobiert hat.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

06.12.2010, 17:19

Die Chance dass jemand schonmal haargenau das ausprobiert hat was du vor hast in genau dem selben Kontext mit genau den selben Daten ist ziemlich gering würde ich mal meinen ;)
Und selbst wenn hast du zu wenig Information gegeben als dass derjenige sich angesprochen fühlen könnte. Und im MSDN Artikel steht eben auch nicht mehr als ich dir gesagt habe:

Zitat von »MSDN«

Therefore, dynamic branching can help speed up shader execution time.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

06.12.2010, 18:54

Ich habe das schonmal ausprobiert. Mein Gedanke war, dass man Rechenzeit sparen könnte, wenn man die kompletten Lichtberechnungen auslässt, sobald die Fläche von der Lichtquelle wegzeigt. Damals war es in jedem Fall langsamer, egal wie ich es gedreht habe. Und dabei sollte man meinen, dass "Rückseite" ohne NormalMap eine hinreichend gleichmäßiges Kriterium ist, bei dem nur wenig doppelte Ausführungen zu erwarten sind. Die Unterscheidung war ein einzelnes if() auf Basis eines skalaren Wertes, den ich eh schon verwendet hatte, und die potentiell ausgelassenen Code-Segmente umfassten diverse Berechnungen und 8 Textursamples. Trotzdem war es langsamer mit Dynamic Branching.

Der Test lief allerdings für Geforce7-Hardware... seitdem ist einiges Wasser die Flüsse runtergeflossen. Wie das heutzutage aussieht, weiß ich nicht.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

06.12.2010, 19:03

Ja die GeForce 7 war afaik noch wie alle früheren GPUs auf Vektorprozessoren aufgebaut und daher noch eine komplett andere Architektur, wie das dort genau funktioniert hat weiß ich tbh auch nicht, jedenfalls war dynamic Branching früher afaik eine nochmal viel heiklere Sache.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

7

06.12.2010, 22:10

In diesem auch sonst exzellenten Artikel gibts einen guten Teil über dynamic Branching klick
In Xrodon hat Dynamic Branching im Soft Shadow übrigens einen starken Performanceschub gegeben. Ein derartiger algo ist wohl auch so ein Paradebeispiel - man hat meistens große zusammenhängende Pixelbereiche und eine Reduktion von >32 auf 4 Texturesamples (bin mir nicht mehr sicher wieviel ich damals als Auswahltest und als Penumbra gemacht hab). Extrem wichtig speziell bei so Sachen wie Softshadows und anderen Texturesample abhängigen Szenarien sind die Sachen die in dem Paper ab Seite 8 erklärt werden! Wenn man das nicht beachtet, ist die ganze Branch hinfällig.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

07.12.2010, 22:06

Also doch selbst probieren.

Werbeanzeige