[HLSL 5.0] Fragen zur Leistung

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[HLSL 5.0] Fragen zur Leistung

Beitrag von Krishty »

Ich möchte optimieren, aber mein GPU Shader Analyzer ist kaputt und sowieso nicht mehr unterstützt, und naja, nun sitze ich hier. Meine Fragen:
  1. Was ist schneller – Texture.Sample() oder Texture.SampleLevel(), wenn die Textur sowieso keine Mip Levels hat? Mit Mip Levels ist SampleLevel() selbstverständlich schneller, weil ddx()/ddy() und die Mip-Auswahl entfallen. Aber haben Shader Compiler genug Informationen über die gebundenen Texturen, dass entsprechend optimiert wird? Mappt die Hardware alles zur selben Anweisung?
  2. Was ist schneller – frac(float), modf(float, 1.0f), oder float % 1.0f? Oder realisiert gängige Hardware sie alle durch die selbe Anweisung?
  3. Gibt es irgendeine Möglichkeit, Sample() mit Filterung direkt auf Texel-Indizes arbeiten zu lassen (à la Load()) statt auf normierten Koordinaten? Dann erledigt sich auch die Frage darunter:
  4. Was ist schneller – Texture.GetDimensions() oder Shader-Konstanten mit den Werten? Konstanten sind anstrengend, weil ich dann CPU-seitig Code schreiben muss. Ich meine, mich zu erinnern, dass GetDimensions() deutlich mehr Code hinterlässt, bin aber nicht sicher.
    Geklärt – Konstanten sind schneller. Fünf Mal so schnell im Einzelfall; doppelt so schnell in synthetischen Benchmarks. Der Unterschied dürfte bei echten großen Shadern gegen Null gehen; der Code ist aber ganz eindeutig größer und länger, und Code-Größe ist ja auch ein Faktor.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [HLSL 5.0] Fragen zur Leistung

Beitrag von Zudomon »

Von HLSL 5.0 habe ich keine Ahnung. Aber trotzdem möchte ich kurz etwas einwerfen zu:
Krishty hat geschrieben:Mit Mip Levels ist SampleLevel() selbstverständlich schneller, weil ddx()/ddy() und die Mip-Auswahl entfallen.
Ist das wirklich so? Ich glaube, dass beim normalen Rendern mit Texturen (und MipMaps) vor allem Caching zuschlägt und daher schneller ist. Früher war mir das nicht bewusst und ich habe mich gewundert, dass es mit tex2Dlod() langsamer läuft, als mit tex2D().
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [HLSL 5.0] Fragen zur Leistung

Beitrag von Krishty »

Ja; eine Textur mit Mip Levels ist in üblichen Anwendungsfällen deutlich schneller – dank Cache-Lokalität, wie du sagst.

Wenn du aber weißt, dass du von einer Textur immer nur ein bestimmtes Level brauchst (Lesen aus Render Targets bei Deferred Shading!) oder dass sie nur eines hat (Lookup Tables!), würde ich vermuten, dass SampleLevel() schneller ist. Ich wüsste es nur gern genau.

Wo wir gerade dabei sind: Vor Jahren war Sample() bei mir deutlich schneller als Load(). Ist das noch immer so? Auch bei 3D-Texturen?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten