Войти
ПрограммированиеФорумГрафика

HLSL и вызов функций (4 стр)

Страницы: 13 4 5 69 Следующая »
#45
22:31, 5 фев. 2016

innuendo
ну я глянул в msdn
https://msdn.microsoft.com/en-us/library/windows/desktop/bb174580… vs.85%29.aspx
но я не пойму как это сматчить на GL
в моем понимании если мы сравниваем

#if DEF
#endif
vs
if (uniform) {
}
то в первом случае код выкинется тупо препроцессором
в случае
if (DEF) {
}
выкинется компилятором
а вот с юниформом будет какой то бранчинг
при этом я так понимаю врятли
    texld r0, v0, s0
    mul r1, v0.xyxy, v0.xyxy
    cmp oC0, -c0.x, r1, r0
потому что как то глупо, но тут я не шарю и мне кажется uniform flow control должно как то по другому работать

#46
22:43, 5 фев. 2016

в общем бегло пробежался по "вендорам"
у AMD проскакивают слова типа при static flow control шейдер перекомпилируется под разные бранчи и кешируется
что бы не было проблем с перекомпиляцией советуют делать прогон шейдера при старте

примерно тоже самое судя по гуглу встречается в доках по PowerVR

#47
22:43, 5 фев. 2016

cNoNim
> ну так погоди я не понял... ну это асм... полученный из HLSL насколько я понял,
> а он что дальше не может драйвером или чем там преобразоваться дальше перед
> выполнением?

Ну он конечно может драйвером во всё что угодно преобразоваться.
Но по сути это два разных кода, делающие одно и тоже. CMP это ALU инструкция, это не бранчинг.

#48
23:03, 5 фев. 2016

Executor
насколько я понял по этому треду твой асм с cmp
это
[flatten] if
а версия с ифом это повидимому
[branch] if
но только это все ортогонально static бранчингу мне кажется
компилятор разумеется если решит что ему в данном конкретном месте проще сделать вообще без бранчинга
запилит [flatten] if даже если там
static flow control
но в особо ушлых случаях а я говорю именно о них будет рекомпиляция шейдера в зависимости от констант
и с одной стороны это безусловно плохо, походу намного хуже чем выкинуть чтонибудь в compile time
но судя по докам это кешируется и если делать prewarming то разницы по сравнению с multiple shaders ни какой
и тут уже нужно конкретно думать насколько вероятно переключение констант
в моем случае (я подразумеваю реализацию radix-sort) бранчинг двух типов:
1) порядок сортировки
2) signed/unsigned
и если порядок сортировки может вообще не переключаться в рантайме
то signed/unsigned меняется при сортировке старших бит т.е. при сортировке signed нужно 7 раз прогнать unsigned переключить бранчинг и прогнать один раз signed
и вот тут уже задумываешься... но опять же выбор типа данных скорее всего не будет делаться в рантайме и prewarming должен спасать

#49
23:23, 5 фев. 2016

ну и продолжая пляски...
вот есть еще один вид бранчинга в radix-sort
это просто сортировка и сортировка key value
вот она уже отличается количеством буферов на входе...
добавляется буфер значений...
и соответственно вопрос, если вгонять это все в один шейдер то
получится value буфер будет юзаться только в одной ветви static flow control,
нужно ли биндить буфер если он не используется?
вообще этот кейс какой то мутный надо быть наверное уверенным, что ветка отбросится именно статически

#50
0:37, 6 фев. 2016

cNoNim
> насколько я понял по этому треду твой асм с cmp
> это
> [flatten] if
> а версия с ифом это повидимому
> [branch] if

Да, но если напишешь просто if, то на усмотрение компилятора, а тут ты как бы его форсишь.

#51
2:29, 6 фев. 2016

подскажите... как в GLSL
вот это

uint sel = descending ? 0 : mask;
запилить так что бы бранчинга не было
а то я чего то туплю
как я понял mix для целых и булевых типов только в 4.5 появился

#52
3:41, 6 фев. 2016

ну как бы я подумал подумал...

uint sel = uint(!descending) * mask;
тока оно правда надо?
мне кажется компилятор и сам справится
но может кто еще чего подскажет на тему
uint key = descending ? (RADICES - LOCAL_IDX - 1) : LOCAL_IDX;

#53
8:14, 6 фев. 2016

cNoNim
> запилить так что бы бранчинга не было
А где тут бранчинг?

#54
10:38, 6 фев. 2016

-Eugene-
Ну тернарный оператор синтаксический сахар сами же говорили... Значит там возможен бранчинг или нет?

#55
10:46, 6 фев. 2016

cNoNim
Возможен. Но не обязателен. Считай, что это тот же if, только ты не можешь указать ему атрибуты.

#56
12:06, 6 фев. 2016

Если descending - это тоже uint, то можно сделать просто

uint key = mix(LOCAL_IDX, RADICES - LOCAL_IDX - 1, descending)
но не факт, что это будет быстрее

#57
12:27, 6 фев. 2016

cNoNim
> uint sel = descending ? 0 : mask;

Это не бранчинг, это cmp скорее всего будет.

#58
14:04, 6 фев. 2016

http://www2.ati.com/developer/gdc/d3dtutorial10_half-life2_shading.pdf

Какие там шейдера

#59
14:52, 6 фев. 2016

чета я не вдупляю...
вот есть у меня uvec4 key
я тестирую его... сами значения ок
но мне нужно провести вот такую операцию

temp[WG_IDX * WG_SIZE + LOCAL_IDX][i] = MASK - key[i]
MASK это девайн там 0xf
значения элементов key изменяется от 0 до 15
и короче чего получается
temp[WG_IDX * WG_SIZE + LOCAL_IDX][i] = MASK - key[i]
для нуля в temp ложится 0x8000000f
а вот так
temp[WG_IDX * WG_SIZE + LOCAL_IDX][i] = (MASK - key)[i]
ложится нормальное значение...
WTF? я с эту фигню уже второй день пытаюсь вычислить только сейчас допер скобки поставить

Страницы: 13 4 5 69 Следующая »
ПрограммированиеФорумГрафика