gammaker
> > > Начиная с SM 4.0 есть точно.
> > Оно для shader subroutines, не?!
> Subroutines - это SM 5.0.
Оно ещё с SM2.0 есть
-Eugene-
Если [flatten] if не создаёт ветвлений , то как он анализирует что выполнить if или else от этого if ?
- что, проще выполнить параллельно и ту ветвь и ту чем "ветвить" ?
bykabak
> Если [flatten] if не создаёт ветвлений , то как он анализирует что выполнить
> if или else от этого if ?
Ты сам процитировал парой постов выше ответ на этот вопрос:
> Evaluate both sides of the if statement and choose between the two resulting values
неужели в GPU быстрее выполнить много кода из if и else сразу параллельно, чем проверить и выполнить нужную ветку ?
bykabak
Когда как - поэтому у тебя и есть выбор.
Спасибо. Теперь всё ясно.
bykabak
> неужели в GPU быстрее выполнить много кода из if и else сразу параллельно, чем
> проверить и выполнить нужную ветку ?
Если кода в ветке много, то обычно дешевле избежать его исполнения с помощью ветвления. Если в каждой ветке маленькие формулы, то лучше сделать считать обе и выбирать с помощью step, mix (lerp в HLSL), min, max и других функций. Но тоже всё может сильно от видеокарты зависеть.
Главное, что я осознал суть - как это работает. :) - Всё в руках писателя шейдера.
Всем спасибо.
-Eugene-
> А инструкция call?
Да, ты прав. Не сталкивался я с таким.
innuendo
> Ещё один любитель скорости ? Ты ещё спроси про загрузку констант за 1 вызов :)
Да ладно уже :) OpenGL Убог по передачи констант, и массив uniform это уродливо выглядит (nVidia (C)) . Но передавать лучше все таки пачками, И не всегда необходимо разбивать по группам, если этого не требует задача. Но тебе тебе пофиг, ты все цепляешь и будешь за то, что за 1 вызов невыгодно, но лишь иногда, и продолжаешь тролить при каждом удобном случае. Начинай снова. :)
Andrey
> Да ладно уже
Есть игры, где не стоят регистры в uniforms и используют Effects... И эти игры вышли и принесли бабло ( это для любителей скорости )
innuendo
> Оно ещё с SM2.0 есть
Это где? Subroutines появились только в GL 4.0, и аналог Dynamic Shader Linkage - в DX11.
gammaker
> Это где?
VS
bykabak
> неужели в GPU быстрее выполнить много кода из if и else сразу параллельно, чем проверить и выполнить нужную ветку ?
В SIMD архитектурах по типу GPU "branch if" физически невозможен.
За исключением случая, когда весь варп идет по одной ветке.
Так что единственная возможная разница между "branch" и "flatten" состоит в дополнительной проверке, идут ли все потоки варпа по одной ветке или нет.
Я почти уверен, что такая проверка на современных GPU реализована в железе (т. е. задействует скалярную управляющую логику в параллель к SIMD ALU) и не вносит оверхеда в вычисления.
пока тут все кидаются тапками... расскажите еще про static branching
я хз как оно в DX :) и вопрос наверное оффтопик потому что интересует OGL
но сильно ли будет плохо если
#if DEFINE
#endif
if (DEFINE) { }
if (some_uniform) { }
if (some_ubo_uniform) { }
Тема в архиве.