2014-04-10 13 views
7

Ich habe eine einfache Frage, von der ich keine festen Fakten über das Verhalten von GPUs finden konnte, wenn 3 Scheitelpunkte die gleiche variierende Ausgabe vom Vertex-Shader hatten. Erkennt die GPU diesen Fall oder versucht sie zu interpolieren, wenn sie nicht einmal benötigt wird?Ein Dreieck mit 3 Variationen von gleichem Wert .. interpoliert GPU die Leistung?

Dies könnte interessant sein, da es einige Fälle gibt, in denen Sie einen konstant variierenden Fragmentshader pro Dreieck wünschen. Bitte raten Sie nicht einfach, versuchen Sie Referenzen oder zumindest einige Gründe, warum Sie denken, dass es so oder so ist.

+6

Da die Anzahl der Variierungen fest ist und grundsätzlich die gesamte Hardware implementiert wurde, um den nächsten Wert in einem Zyklus zu berechnen, wäre es sicherlich nicht vorteilhaft, einen zusätzlichen Sonderfallpfad zu entwickeln. Ich habe keine Referenzen, das ist nur eine Vermutung. Also ist es keine Antwort. – Tommy

+0

Es wäre interessant zu wissen, ob die Interpolation immer noch eine feste oder sogar hardwaremäßig implementierte Funktion ist. Ich könnte mir vorstellen, dass sie eine Prüfung implementieren würden, bevor Sie ein paar tausend Fragment-Interpolations-Jobs generieren. An diesem Ort könnte es ein bisschen billig sein mit riesigen Gewinnen für diesen Fall.Wenn jedoch die dedizierte Hardware die Interpolation durchführt, könnte sie einfach sagen "schraubt es, es ist kein Schaden, eine ansonsten ungenutzte Ressource zu verwenden". Das ist eine ziemlich interessante Frage für mich. –

+2

@ManuelArwedSchmidt: Es gibt eine spezielle Attributinterpolator-Hardware. AMD nennt sie SPIs (Shader Processor Interpolators), und im DX11-Shader-Modell kann der Pixel- (Fragment-) Shader Interpolation auf Anforderung anfordern, anstatt sie zu erledigen, bevor der Shader überhaupt zu arbeiten beginnt. Wirklich intelligente Shader-Compiler könnten daher die Interpolation einiger Parameter vermeiden, außer während der Laufzeitausführung von seltenen Verzweigungen von Code auf Hardware, die das "Pull-Modell" unterstützt. –

Antwort

2

Die GPU führt die Interpolation durch, egal ob sie benötigt wird oder nicht.

Der Grund ist ziemlich einfach: Überprüfen, ob die variierende Variable bereits geändert wurde, ist sehr teuer.


Shader sind kleine Programme, die gleichzeitig auf verschiedenen GPU-Kernen ausgeführt werden. Wenn Sie also vermeiden möchten, dass zwei verschiedene Kerne den gleichen Wert berechnen, müssten Sie die Ausgangsvariable "reservieren". Sie benötigen also eine zusätzliche Datenstruktur (wie eine Flagge oder einen Mutex), die jeder Kern lesen kann. In Ihrem Fall würde dies bedeuten, dass drei verschiedene Kerne dieselbe Flagge lesen müssen, und die erste von ihnen muss sie reservieren, wenn sie nicht bereits reserviert ist.

Dies muss atomar geschehen, was bedeutet, dass der reservierende Kern der einzige sein muss, der die Flagge auf einmal setzt. Um dies zu tun, würden alle anderen Kerne z.B. muss für ein Häkchen gestoppt werden. Da Sie nicht wissen, welche Kerne den Vertex-Shader berechnen, müssten Sie ALLE anderen Kerne stoppen (bei einem GTX-Titan wären es 2687 andere).

Wenn die Variable gesetzt ist und ein neuer Frame gerendert wird, müssten alle Flags zurückgesetzt werden, damit das Rennen für das Flag erneut beginnen kann.

Zum Schluss: Sie würden zusätzliche Hardware in Ihrer GPU benötigen, das ist teuer und verlangsamt die Rendering-Pipeline.

Es ist der Programmierer Job zu vermeiden, dass mehrere Shader die gleiche Ausgabe produzieren. Wenn Sie also Ihre Arbeit richtig machen, passiert das nicht, oder Sie wissen, dass das Vermeiden (auf der CPU) mehr kostet als das Ignorieren.

Ein Beispiel wäre das Sticken für verschiedene Detailebenen (wie auf einer Höhenkarte), wo die meisten Methoden einige Fragmente zweimal erzeugen. Dies ist ein sehr geringer Einfluss auf die Rendering-Leistung, erfordert jedoch viel CPU-Zeit, um dies zu vermeiden.

0

Wenn das Verhalten in der OpenGL-Spezifikation nicht vorgeschrieben ist, lautet die Antwort, dass es an der Implementierung liegt.

Die Kommentare und andere Antworten sind fast sicher genau das, dass es keinen Optimierungsweg für identische Werte gibt, weil es wenig oder gar keinen Nutzen von der zusätzlichen Komplexität geben würde, einen solchen Pfad zu erstellen.