PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Floating Point Paranoia mit DirectX


pajofego
2004-08-28, 13:57:27
Hallo Leute,

ich habe mal wieder (wie sollte es auch anders sein :biggrin:) eine Frage rund um das Thema DirectX und Floating Point Texturen. Nachdem ich endlich meine numerische Simulation auf der Basis von DirectX 9 und PixelShadern zum Laufen gebracht habe, war es nun Zeit das ganze auf den Karten auszuprobieren. Dazu standen mir die ATI 9800 Pro und die nVIDIA FX 5900 zur verfügung. Beide unterstützen PS 2.0 und fp32 (bei ATI nur fp24). Anfangs gab es ja noch Probleme mit Floatinpointtexturen und DirectX 9.0b mit der nVIDIA, aber seit dem neuen Release 9.0c sollte es ja keine Probleme mehr damit geben.

So jetzt nun zu meinen Ergebnissen:

Mich hat es ja nun interessiert ob meine Simulation auf der GPU genau so gute Ergebnisse liefert wie die reine CPU Simulation. Sprich ist die Gleikommagenauigkeit von der GPU ausreichend genug - insbesondere bei der ATI? Dazu habe ich mir einen representativen Wert (Schallgeschwindigkeit) ausgesucht und diesen über mehrere Zeitschritte mit denen aus der GPU (ATI und nVIDIA) und der CPU verglichen. Wie man meiner Grafik entnehmen kann sind die Ergebnisse aus der ATI trotz fp24 sehr gut, d.h. ca. max. 1% Fehler zur CPU. Was mit der nVIDIA passiert ist - tendenziell richtig, aber dennoch falsche Ergebnisse - kann ich mir beim besten Willen nicht erklären.

Mein erstes Fazit lautet, dass trotz der geringeren Genauigkeit der ATI (fp24), diese sich nicht so krass bemerkbar machen, wie die, trotz fp32 bei nVIDIA, Probleme von nVIDIA mit der FX Serie und DirectX. Bemerkenswert ist auch die Performance von ATI vs. nVIDIA. Während die ATI bei mir mit ca. 33fps zu Werke geht schafft die nVIDIA nur magere 14fps.

Was im Detail genau das Problem mit nVIDIA und DirectX ist, weiss ich nicht und würde mich seitens von euch über eine konstruktive Kritik bzw. Idee über das Problem freuen. Anregungen, Ideen etc.?

Beste Grüße

pajofego

Demirug
2004-08-28, 14:16:37
Kannst du noch ein paar Details mehr zu dem benutzten Verfahren, Shader, etc. herausgeben? Mir ist noch nicht ganz klar was du gemacht hast.

pajofego
2004-08-28, 15:17:03
Kannst du noch ein paar Details mehr zu dem benutzten Verfahren, Shader, etc. herausgeben? Mir ist noch nicht ganz klar was du gemacht hast.

Aber sicher doch!

Also, das folgende partielle differentielle Gleichungssystem (siehe Grafik) wurde mit Hilfe einem "speziellen" (genaueres würde zu weite führen) finite Differenzenverfahren und einen expliziten Zeitintegrationsverfahren gelöst. Um das ganze auf der Grafikkarte zum Laufen zu bringen, habe ich Floating Point Texturen in DirectX wie folgt definiert:
m_pd3dDevice->CreateTexture(SizeX, SizeY, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &m_pFloatTexture,0);

Mit Hilfe von Pixel Shader 2.0 und HLSL wurde das o.g. Verfahren in einen Effect File implementiert. Mit dem oberen code hatte ich anfangs Probleme in DirectX 9.0b und nVidias FX 5900 (das ging anfangs nur mit dem Macro "fourcc"). Nachdem DirectX 9.0c herauskam konnte man o.g. code auch ohne Macro für die FX Serie benutzen. Zwar geht das, nur "richtig" rechnen tut sie eben nicht. Am code selbst, denke ich, kann es ja nicht liegen, da dieser ja auf der ATI wunderbar läuft.

Ich hoffe ich konnte die Sache jetzt ein bischen klarer darstellen, wenn nicht fühlt euch frei mir Gegenfragen zu stellen.

Ziel meiner Arbeit: Rendering of Avalanches and Granular Flows (http://www.dgm.informatik.tu-darmstadt.de/students/theses.html)

Demirug
2004-08-28, 15:30:59
Schon mal mit dem Refrast probiert?

pajofego
2004-08-28, 15:42:07
Schon mal mit dem Refrast probiert?

O.K. jetzt aber muss ich zugeben, dass ich in Sachen Grafik nicht so der Experte bin :redface:, d.h. ich habe überhaupt keine Ahnung was der Refrast ist und was ich damit machen kann? Meinst du evt. den Zugriff auf die Texturen?

Demirug
2004-08-28, 16:00:08
Der Refrast ist eine komplette Softwareemulation einer Grafikkarte. Immer dann sehr nützlich wenn etwas scheinbar nicht richtig funktioniert. Man lässt es dann einfach mit dem Refrast laufen. Funktioniert es dann auch nicht hat man wahrscheinlich einen Fehler gemacht. Funktioniert es im Refrast hat man es wahrscheinlich mit einem Treiber/Hardware Problem zu tun.

Aktiviert wird der Refrast indem man beim erzeugen kein HAL sondern ein REF Device erzeugt.

Xmas
2004-08-28, 16:00:44
O.K. jetzt aber muss ich zugeben, dass ich in Sachen Grafik nicht so der Experte bin :redface:, d.h. ich habe überhaupt keine Ahnung was der Refrast ist und was ich damit machen kann? Meinst du evt. den Zugriff auf die Texturen?
Der Reference Rasterizer von D3D, eine Software-Implementierung der Renderpipeline also. Um den Refrast zu benutzen, musst du CreateDevice mit
D3DDEVTYPE_REF statt D3DDEVTYPE_HAL aufrufen.

pajofego
2004-08-28, 16:18:41
Ach so! Ja, den habe von anfang an benutzt, sonst wäre ja das Debuggen des Shaders ja gar nicht möglich. Entwickelt habe ich alles im Softwaremodus (D3DDEVTYPE_REF), nachdem alles wunderbar funktioniert hat, bin auf Hardwaremodus umgestiegen (D3DDEVTYPE_HAL). Das war auch der Grund warum ich mit DirectX gearbeitet habe ;D.

Crushinator
2004-08-30, 14:02:42
Ich habe eine ähnliche Erfahrung gemacht, als ich anfing die Idee, daß man GPUs als CPUs mißbrauchen könnte, interessant zu finden. Nur muß man dazu sagen, daß ich mir nicht sicher war, ob es an meiner leienhaften Umsetzung oder an der noch nicht ausgegorenen GLSlang bzw. den Shadercompilern lag. Ich habe im Momment leider auch gar nicht die Zeit, das Proggi welches ich dafür geschrieben hatte so zu gestalten, damit es jeder selbst ausprobieren kann.

Jetzt aber, fühle ich mich doch motiviert dem mehr nachzugehen. Es kann allerdings einwenig dauern, denn wie gesagt Zeit zum klar denken ist bei mir im Momment Mangelware. ;(

pajofego
2004-08-30, 17:18:16
Ich überlege schon die ganze Zeit woran das liegen könnte. :confused:

Ich habe nur eine Vermutung:

Als ich noch zu Zeiten von DirectX 9.0b die nVidia FX Serie benutzen wollte, wurde ich hier im Forum auf das FAQ von nVidia Frage 8 (http://developer.nvidia.com/object/General_FAQ.html#g8) verwiesen. Da ist zu lesen, wie man Floating Point Texturen unter DirectX verwenden kann. Das was mich aber interessiert hat, eine 128 Bit Texture ("MET_1_1_1_1 is coming soon"), war zu diesem Zeitpunkt nicht möglich.

Da ich nun mal mit allen 4 Kanälen (Variable.rgba) rechne und nicht genau weiss wie intern in DirectX nun die Sache mit den Floating point Texturen in Bezug auf die FX Serie gelöst wurde, kann ich nur spekulieren.

Also, mal angenomme MS hätte im neuen Release nur das FourCC Macro für die FX Serie übernommen und die volle 128 Bit Textur im engen Sinne immer noch nicht zur Verfügung stehen, so würde ich im ersten Kanal nur mit 16 Bit Genauigkeit rechnen, d.h. es würde unweigerlich zu Fehlern und Abweichung in der Lösung kommen. Untermauert wird dies durch den Verlauf der Kurve in dem Diagramm mit der Schallgeschwindigkeit. Wie o. g. Prinzipiell richtig aber dennoch falsch. Das sind aber nur Spekulationen meinerseits, würde da mal ganz gerne genauer nachhacken. Vielleicht sollte ich denen mal eine Mail schicken und fragen ob das FAQ von denen immer noch auf dem aktuellsten Stand ist!