2016-06-28 11 views
0

Seit geraumer Zeit habe ich vermieden worden durch, stattProfil Grafiken Shadern

in meinem Shader-Code Verzweigung
float invert_value(in float value) 
{ 
if(value == 0.0) 
    return 0.0; 
else 
    return 1.0/value; 
} 

wie diese

float invert_value_ifless(in float value) 
{ 
float sign_value = sign(value); 
float sign_value_squared = sign_value*sign_value; 
return sign_value_squared/(value + sign_value_squared - 1.0); 
} 

Dies gibt genau ‚klug‘ Code zu schreiben, was Die erste Funktion hat keine Verzweigungen und ist daher schneller.

Oder ist es? Kämpfe ich hier mit Geistern?

Wie Grafik Shader für Geschwindigkeit zu profilieren? Ich interessiere mich am meisten für die neuesten mobilen Plattformen (Android), aber jeder Hinweis auf Grafik-Profiling im Allgemeinen wäre willkommen!

+1

"* Kämpfe ich hier mit Geistern? *" [Ja, bist du.] (Http://stackoverflow.com/q/37827216/734069) –

+0

Ausgezeichnete Antwort dort Nicol. – Leszek

+0

Fliegt das auch mit Geistern? Anstatt if (a> 0) b = (1-a)/(2-a) else b = (1 + a)/(2 + a) Schreib Signa = sign (a); b = (1-ZeichenA * a)/(2-ZeichenA * a); ? – Leszek

Antwort

1

Es ist oft noch aus dem Grund, dass Sie wahrscheinlich ursprünglich geglaubt haben - eine GPU ist oft als eine sehr breite SIMD-Prozessor implementiert, so die Durchführung der gleichen Operationen für jedes Pixel ermöglicht eine Menge von ihnen auf einmal während der Kommissionierung verarbeitet werden Verschiedene Operationen pro Pixel machen diesen Kalkül viel problematischer. Deshalb überleben Operationen wie step in GLSL. Ein guter GLSL-Compiler kann normalerweise die Kompilierungszeit-Konditionalität eliminieren und kann Ihren Branching-Code durch andere Mittel nicht verzweigen, aber GLSL-Compiler sind im Allgemeinen nicht so gut wie normale Offline-Compiler, weil sie ihr eigenes Leistungsbudget haben .

Ich bin ein iOS-Person professionell, so dass ich ausführlich über die Wunder des Xcode Frame Profiler sprechen kann, und werde dies für eine vollständige Antwort tun, aber ich entschuldige mich, dass ich nicht viel über Android anbieten kann .

In Xcode gibt es einen Frame-Capture-Button. Treffen Sie darauf und der vollständige OpenGL-Befehlsfluss wird für einen einzelnen Frame erfasst. Von dort aus können Sie alle Status und Puffer wie vor und nach jedem OpenGL-Befehl überprüfen. Wie lange jeder Anruf dauerte, wird gemeldet. Besser als das, Ihr GLSL-Code selbst wurde bis auf Zeilenebene profiliert - μs pro Codezeile werden gemeldet. Und wenn Sie es wirklich über den Rand stellen, können Sie Ihren GLSL-Code direkt dort neu schreiben und den erfassten Frame erneut ausführen, um herauszufinden, was mit Ihren Kosten passiert. Oder ganz allgemein als eine GLSL-Autorenumgebung mit schnellem Feedback, obwohl es nicht wirklich dafür geeignet ist.

0

Alle großen GPU-Hersteller unter Android haben ihre eigenen GPU-Profiling-Tools, die in etwa der Frame-Erfassung von XCode entsprechen. ARM, Qualcomm und PowerVR tun.

Dinge wie diese müssen gemessen werden, und leider, aufgrund der Probleme mit Android-Nutzern, die aus verschiedenen Gründen nicht aktualisieren, ist die Qualität der Treiber da draußen in der Wildnis variabel.

+0

Ja, ich versuche, den Adreno Profiler ATM zu verwenden, aber aus irgendeinem Grund kann er keine adreno Profiler-fähige App finden, wenn ich ihn an mein Telefon anschließe .... Ich werde ein paar mehr versuchen :) – Leszek

+0

Ja, meine Erfahrung mit den GPU-Profiling-Tools war in der Regel eine Übung in Frustration. Wenn Sie nach einer Abkürzung suchen, weiß ich, dass der Shader-Editor von PowerVR Schätzungen für die Anzahl ihrer GPU-Architekturen vornimmt, ohne dass Sie den Shader auf dem Gerät ausführen müssen (ich erwarte, dass die anderen Hersteller ähnliche Funktionen haben, aber ich weiß nicht sicher). Das könnte ausreichen, um eine Idee zu bekommen. – Columbo