Size: a a a

pro.graphon (and gamedev)

2020 May 25

AT

Anatoly Tomilov in pro.graphon (and gamedev)
Mind
У меня есть 3d текстура и надо как-то все её слои собрать в одну текстуру в compute шейдере. Есть что-то побыстрее, чем цикл по слоям?
vec4 frag = imageLoad(_combined, pos);
   for(int i = 0; i < nlayer; ++i ) {
       vec3 c = imageLoad(_buffer, ivec3(pos, i)).rgb;
       frag += vec4(c.rgb, 1);
   }
imageStore(_combined, pos, frag);
А сколько слоёв?
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
Mind
У меня есть 3d текстура и надо как-то все её слои собрать в одну текстуру в compute шейдере. Есть что-то побыстрее, чем цикл по слоям?
vec4 frag = imageLoad(_combined, pos);
   for(int i = 0; i < nlayer; ++i ) {
       vec3 c = imageLoad(_buffer, ivec3(pos, i)).rgb;
       frag += vec4(c.rgb, 1);
   }
imageStore(_combined, pos, frag);
Можно спараллелить по блокам слоев конечноже, но вопрос нужен ли тебе такой оверхед и что быстрее
источник

M

Mind in pro.graphon (and gamedev)
16 слоёв в общем. Паралелить пробовал - в результате или то же самое по времени или медленнее.

Может есть какой-то способ в одну текстуру писать из разных потоков без синхронизации?
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
Mind
16 слоёв в общем. Паралелить пробовал - в результате или то же самое по времени или медленнее.

Может есть какой-то способ в одну текстуру писать из разных потоков без синхронизации?
Есть imageAtomicAdd для int-ов. Для float-ов тебе нужно будет делать CAS loop с imageAtomicCompSwap и intBitsToFloat и floatBitsToInt. Но стоит ли оно того? "16 выборок в цикле с одной записью" vs "16 вряд ли одновременно работающих потоков с atomic read modify write со всеми накладными расходами"? Я бы выбрал первое в 100 случаев из 100.
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
Mind
16 слоёв в общем. Паралелить пробовал - в результате или то же самое по времени или медленнее.

Может есть какой-то способ в одну текстуру писать из разных потоков без синхронизации?
а как ты иначе параллелишь?
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
ну типа лучше данные из группы собирать и писать одним конечно же
источник

M

Mind in pro.graphon (and gamedev)
Ну я так и сделал. Но получилось что разницы либо нет, либо хуже стало
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
было бы у тебя 1000 слоёв — вот тогда бы думать надо было, а 16 — это очень мало
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
а как ты между группой шаришь?
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
16 да мало
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
never mind*
источник

M

Mind in pro.graphon (and gamedev)
shared vec3[local_size_x, local_size_y, local_size_z(4)];
Потом в глубину прохожу по 4 слоя в каждом потоке и пишу сумму из нулевого
источник

M

Mind in pro.graphon (and gamedev)
Просто это делается 16+ раз за кадр, и разница заметна. Даже просто разница между for (int I = 0; I < nlayer; ++I) и for (int I = 0; I < 16; ++I ) { if (I > nlayer) break; и то кадра в 3-4 выходит. Видимо втрое анролится нормально
источник

AF

Aidar Fattakhov in pro.graphon (and gamedev)
16 по 16 это не много же
источник

M

Mind in pro.graphon (and gamedev)
Да вот же. Там вообще странное что-то. nsight показывает сумму всей отрисовки 3 с небольшим миллисекунд на гпу и меньше миллисекунды на цпу, а фпс в сложных местах проседает до 30 на 1080. Уже не знаю чем ещё посмотреть, чтобы понять что не так
источник

d

disba1ancer in pro.graphon (and gamedev)
Anatoly Tomilov
Есть imageAtomicAdd для int-ов. Для float-ов тебе нужно будет делать CAS loop с imageAtomicCompSwap и intBitsToFloat и floatBitsToInt. Но стоит ли оно того? "16 выборок в цикле с одной записью" vs "16 вряд ли одновременно работающих потоков с atomic read modify write со всеми накладными расходами"? Я бы выбрал первое в 100 случаев из 100.
А разве нельзя распараллелить так чтобы чтения/записи не пересекались?
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
disba1ancer
А разве нельзя распараллелить так чтобы чтения/записи не пересекались?
тогда смысл параллелить? Тогда это будет последоватьельно
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
ничего путёвого не придумать, когда log(N) примерно равен N
источник

AT

Anatoly Tomilov in pro.graphon (and gamedev)
у него операции чтения из текстур тратят основное время, а не операция суммы. По-моему этот цикл вообще никак не улучшить
источник

M

Mind in pro.graphon (and gamedev)
Оч плохо. Придётся видимо как-то уменьшать число каналов. И искать что вообще столько времени тратит, если nsight этого не видит
источник