Виконання циклу в шейдері


11

Мені цікаво, який найкращий спосіб інтегрувати функцію динамічного циклу в шейдер?

По-перше, здається, що динамічні масиви неможливі. Отже, чи краще створити масив максимального розміру і лише заповнити його частину або визначити масиви із заданими розмірами?

Тоді, який найкращий спосіб перебрати цей масив?

Чи краще використовувати розкручений цикл або динамічний цикл для чогось від 4 до 128 ітерацій? Я також бачив, що можна розкрутити його до максимально заданої кількості ітерацій, а потім зупинити його при такій умові, як if (i == myCurrentMaximumIterationNumber).


2
Що ви намагаєтеся зробити з масивом і циклом? Я прошу, бо це мені якось звучить як проблема XY . Оскільки найкращий спосіб використання умов та циклів на графічному процесорі - це утриматися від їх використання, можливо, є навіть кращі способи замість використання масивів та циклів у вашому випадку.
Нерон

Я реалізую ефект розсіювання надповерхового екрану, який працює в даний час. Але у мене є деякі сумніви щодо того, як я використовую ядро ​​відповідно до виступів. Я вирішив зробити максимальний розмір масиву і заповнити лише частину і використовувати динамічний цикл з динамічним числом ітерації, який пов'язаний із вмістом масиву, який використовується в даний час. Я думаю, що є, що можна зробити або знати, коли програмувати шейдери відповідно до виступів. І на мою думку, петлі - це загальна тема ефективності, яка може відповідати деяким правилам та, можливо, «хорошим практикам», але я не знайшов жодної гарної відповіді на це.
MaT

Відповіді:


6

Компілятори шейдерів надзвичайно агресивно ставляться до розкручування, оскільки ранні HW часто не мали контролю над потоком, а вартість останніх HW може змінюватись. Якщо у вас є орієнтир, на який ви активно тестуєтесь, і ряд відповідних апаратних засобів, то спробуйте все, щоб побачити, що відбувається. Ваш динамічний цикл більше піддається втручанню розробника, ніж статичний цикл - але залишати його компілятору - це все-таки хороша порада, якщо у вас немає еталону. З еталоном, дослідження варто і (і цікаво).

До речі, найбільша втрата при динамічному циклі на графічному процесорі полягає в тому, що окремі "потоки" на хвилі / деформації закінчуються в різний час. Нитки, які зупиняються пізніше, змушують усіх, хто закінчує рано, виконувати NOP.

Вкладені петлі слід ретельно продумати: я реалізував блок-ентропійний декодер, який закодував прогони нулів (для JPEG, як стиснення). Природною реалізацією було декодування прогонів у тісному внутрішньому циклі - це означало, що часто лише одна нитка просувається; вирівнюючи цикл і явно перевіряючи в кожному потоці, чи був він в даний час декодуванням запуску чи ні, я підтримував всі потоки активними через цикл фіксованої довжини (декодовані блоки були однакового розміру). Якби потоки були схожі на потоки процесора, зміна була б жахливою, але на GPU, на якому я працював, я отримав 6-кратне підвищення продуктивності (що було все ще жахливо - не було достатньо блоків, щоб GPU був зайнятий - але це було доказом концепції).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.