PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DX9 Pixelshader: Schleifen mit > 127 Schritten


Jotta
2010-09-09, 10:32:56
Hallo,

bei meinen DX9 Pixelshadern mit grösseren Schleifen
(d.h. >= 127 Iterationen) fängt meine Graphikkarte häufig
an zu stottern.

Teile ich aber z.B. die Schleife

for(int i=0;i<1024;i++)
{
bla_bla(..);
..
}

auf zu

for(int i=0;i<8;i++)
for(int i=0;i<128;i++)
{
bla_bla(..);
..
}

dann läuft das Programm sehr flüssig, obwohl beide
dasselbe Ergebnis liefern!? Das Problem tritt erst ab
128 Iterationsschritte auf.

Sind Scheifen mit höherer Iterationszahl nicht erlaubt?
In der SDK-Doku habe ich nichts gefunden. Mein Treiber
ist nicht der neuste, das Problem trat aber schon bei
sehr viel älteren Treibern auf.

Jotta

Expandable
2010-09-09, 11:31:51
Vielleicht rollt der Compiler die Schleife bis 128 Iterationen aus, sodass zur Laufzeit gar keine Schleife mehr ausgeführt wird?

Außerdem: Was meinst du mit "stottern"? Steigt die Rechnenzeit pro Frame, oder passiert das unregelmäßig?

Jotta
2010-09-09, 11:49:33
Ich habe auch erst gedacht, dass der Compiler ausrollt und zu lange Programme
generiert. Habe ich aber überprüft, die Programme sind unabhängig von der
Iterationszahl etwa gleich lang. Wenn ich aber bei z.B. 512 Schritten zu einer
Schleife mit i=0..128 und 4X Schleifenkörper ausrollen mache, dann klappt's
ohne Probleme.

Stottern: Unterschiedlich, teilweise reagiert Windows recht träge, aber auf
jeden Fall bricht bei meiner Applikation die FPS drastisch ein.

transstilben
2010-09-15, 23:35:14
Hallo,
...
Sind Scheifen mit höherer Iterationszahl nicht erlaubt?
In der SDK-Doku habe ich nichts gefunden. Mein Treiber
ist nicht der neuste, das Problem trat aber schon bei
sehr viel älteren Treibern auf.

Jotta

Es gibt eine Hardwarebeschränkung (mal in den DeviceCaps ein bißchen stöbern). Ich vermute deine Grafikhardware kann nur 128 "am Stück". "MaxPixelShaderInstructionSlots" o.ä.

Coda
2010-09-16, 02:43:47
Erstmal: Was für ne GPU besitzt du denn?

Jotta
2010-09-19, 11:33:43
Hallo zusammen

und erstmal Entschuldigung für die späte Antwort, ich war ein paar Tage Off/OnRoad.

@Coda,

ich habe eine 8800GTS (erste Version,zwei Slots breit).

@transstilben,

aus dem CapsViewer sind mir in diesem Zusammenhang nur die ControlDepths
(Dynamic/Static) sowie NumInstructionSlots bekannt. Die haben aber eigentlich
nichts mit meinem Problem zu tun bzw. ich sehe da keinen Zusammenhang.

Ich bin gerade nochmal schnell über alle Caps-Einträge geflogen, habe aber
nichts passendes gefunden. Kannst du mir vieleicht sagen, welchen Wert
du meinst.


Jotta

transstilben
2010-09-20, 22:39:01
Hallo Jotta,

ich weiß ja nicht, was genau du mit Deinen DX9 Pixelshadern treibst,
aber wenn ich das richtig sehe hat doch Deine Grafikkarte genau 128
Pixel Shader zur Verfügung. Eine naheliegende Vermutung wäre doch,
daß bei einer Problemgröße größer 128 das Problem nicht mehr einfach
auf Deine Pixelshader Hardware abgebildet werden kann, oder ?

Transstilben

Jotta
2010-09-21, 11:45:20
Naja, bei den wenigsten Pixelshadern hat man "viele"
Schleifendürchläufe, es gibt aber interessante Anwendungen
wie z.B. VoxelShader. Für die Angehängten Bilder verwende
ich z.B. Shader mit 2048 Iterationen pro Raytrace. Nur dadurch
kann man selbst kleinste Äderchen erkennen, die bei z.B. 128
Schritten überhaupt nicht zu erkennen sind.
http://www.forum-3dcenter.org/vbulletin/attachment.php?attachmentid=37276&stc=1&d=1285062150
http://www.forum-3dcenter.org/vbulletin/attachment.php?attachmentid=37277&stc=1&d=1285062150
http://www.forum-3dcenter.org/vbulletin/attachment.php?attachmentid=37278&stc=1&d=1285062150
Jotta

Edit: 2048 Iterationen für den Hit-Test, dazu nochmal 1024 Iterationen für die
Schattenberechnung. Bei 512x512 auf meiner alten 8800GTS läuft das mit
ca. 15 FPS. Der Voxeldatensatz hat die Dimension 256x256x256, was aber auf
die FPS keine Auswirkung hat.