Ile wydajności dodają warunkowe i nieużywane samplery/tekstury do SM2/3 Pixel shaderów?

Mamy jeden pixel shader w HLSL, który jest używany do nieco różnych rzeczy w kilku miejscach i jako taki ma kilka bloków warunkowych, co oznacza, że złożona funkcjonalność jest pomijana w niektórych przypadkach. Oznacza to również, że przekazujemy tekstury jako parametry próbnika, które nie zawsze mogą być używane.

Nie mam pojęcia, ile wydajności uderzyło te dwie rzeczy dodać, ale zwłaszcza, że obsługujemy SM2. 0 Na zintegrowanych układach graficznych, nieefektywności są problemem. Więc, czy przekazywanie tekstury i nie używanie jej oznacza dodatkowe koszty? A czy używanie if po prostu działa, aby dodać kilka instrukcji, czy może drastycznie wpłynąć na rzeczy z powodu straganów i tak dalej, jak podczas optymalizacji procesora?

Author: Mr. Boy, 2011-03-17

1 answers

Ustawienie tekstury na GPU zajmuje trochę czasu procesora, ale jest dość małe w porównaniu do rzeczywistego kosztu batch . Co ważniejsze, nie powinno to mieć żadnego wpływu na rzeczywiste wykonanie shadera, , jeśli shader nigdy nie odwołuje się do niego.

Teraz, są trzy sposoby, że rozgałęzienia mogą być obsługiwane:

Po pierwsze, jeśli warunek gałęzi zawsze będzie taki sam (jeśli zależy tylko od stałych czasu kompilacji), to jedna strona gałęzi może być w całości. W wielu przypadkach lepiej jest skompilować wiele wersji shadera, jeśli pozwala to wyeliminować znaczące gałęzie w ten sposób.

Druga technika polega na tym, że shader może ocenić obie strony gałęzi, a następnie wybrać poprawny wynik na podstawie warunku, wszystko bez rzeczywistego rozgałęzienia (robi to arytmetycznie). Jest to najlepsze, gdy kod w gałęzi jest mały.

I wreszcie, może faktycznie używać instrukcji rozgałęziania. Przede wszystkim instrukcje oddziału mają skromne koszty liczenia instrukcji. A potem jest rurociąg. X86 ma długi rurociąg szeregowy, który można łatwo przeciągnąć. GPU ma zupełnie inny, równoległy rurociąg.

GPU ocenia grupy fragmentów (pikseli) równolegle, wykonując program fragment dla wielu fragmentów naraz. Jeśli wszystkie fragmenty w grupie pobierają tę samą gałąź, wtedy masz tylko koszt wykonania tej gałęzi. Jeśli biorą dwa (lub więcej) gałęzie, wtedy shader musi być wykonywany wielokrotnie, aby ta grupa fragmentów pokryła wszystkie gałęzie.

Ponieważ grupy fragmentów mają lokalizację na ekranie, pomaga, jeśli Twoje gałęzie mają podobną lokalizację na ekranie. Zobacz ten diagram:


(źródło: nvidia.com)

Teraz, kompilator shadera zazwyczaj wykonuje bardzo dobrą robotę, wybierając, którą z dwóch ostatnich metod użyć (dla pierwszej metody, kompilator będzie wbudowany dla ciebie, ale sam musisz zrobić wiele wersji shader ' a). Ale jeśli optymalizujesz wydajność, przydatne może być sprawdzenie rzeczywistego wyjścia kompilatora. W tym celu użyj fxc.exe w narzędziach DirectX SDK z opcją /Fc <file>, Aby uzyskać widok demontażu skompilowanego shadera.

(ponieważ jest to porada dotycząca wydajności: pamiętaj, aby zawsze mierzyć wydajność, ustalać limity, które osiągasz, a następnie martwić się o optymalizację. Nie ma sensu optymalizować gałęzi shadera, jeśli na przykład jesteś związany teksturą.)

Odniesienie DODATKOWE: klejnoty GPU 2: Rozdział 34. GPU Flow-Control Idioms .

 21
Author: Andrew Russell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55