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

DX11 (63 стр)

Страницы: 162 63 64 65 66 Следующая »
#930
23:41, 19 авг. 2016

Digan
> Почему такое выравнивание так критично для производительности?
А у меня вопрос, почему это вообще работает? А то OpenGL всегда (если не рассматривать устаревшие packed и shared, а рассматривать только std140) вставляет выравнивание в uniform block'е. В SSBO вроде правила попроще, но тоже вроде должен вставить.

И ещё вопрос по той ссылке, почему там написано только про 32-битные значения и 128-битные? Два float2 вектора подряд тоже приведут к проблемам что ли? А то std140 в OpenGL вроде не требует выравнивания в этом случае.


#931
0:31, 20 авг. 2016

Два float2  улягутся в один "слот" для 4-х float.

#932
0:41, 20 авг. 2016

bykabak

а что перестановка изменила? не очень понял(про пример из ссылки)
была структура 128бит + 32бита + 96 бит - это не правильно
стала 128бит + 96 бит + 32 и это хорошо

#933
0:49, 20 авг. 2016

Вероятно, так работает Assembler Input Stage когда принимает данные.  Мы же не разработчики драйверов и железа.  Подозреваю, что автор статьи  знает что пишет. С точки зрения 128 бит что так , что так. Вероятно есть нюансы.  У Фрэнка Луны такого пример нет. Он просто предостерегает, что пихайте данные кратно 128 битам - выравнивайте массивы типа: Float3 + Float ,  Float2 + Float2 чтобы все переменные передаваемые в шейдер были кратны 128 битам или float4.  Дополняйте пустышками, если после float3 идёт float3.  Float3 +float пустой и т.д.

#934
5:37, 20 авг. 2016

u960
В железе обычно типы размером 2^n, выровненные кратно своему размеру. Невыровненный доступ медленный или его, вообще, нет.
Для float3 сделан костыль, типа, читаем float4 и отбрасываем последнее число — соответственно требования к выравниванию как у float4.

#935
7:12, 20 авг. 2016

}:+()___ [Smile]
> Для float3 сделан костыль, типа, читаем float4 и отбрасываем последнее число
А почему не сделан костыль: читаем float4, отбрасываем первое число?

#936
12:38, 20 авг. 2016

}:+()___ [Smile]
ну вот
float4
float
float3

какими частями будет читать? с float4 понятно. за раз прочитывается, а дальше? за раз сразу float + float3?

#937
12:51, 20 авг. 2016

bykabak
> Подозреваю, что автор статьи знает что пишет.

Ну ясень перец, он работает в Nvidia :)

#938
15:51, 20 авг. 2016

MrShoor
> А почему не сделан костыль: читаем float4, отбрасываем первое число?
Потому что, если из {x, y, z, w} выкинуть первое число, то получиться {y, z, w} вместо {x, y, z}.
Но, вообще-то, сделать еще один костыль можно, но железные костыли — они не бесплатные.

u960
> какими частями будет читать?
В лучшем случае, float3 будет загружаться как float4 + шаффл.
Но может и как float1 + float2 + шаффл или float4 + float4 + шаффл.
Ввиду того, что рекомендуют так не делать, я склоняюсь к последнему варианту.

P. S. Это все мои предположения, не стоит относиться к ним слишком серьезно, я не работаю на проектировании видеокарт.

#939
17:55, 20 авг. 2016

}:+()___ [Smile]
> Потому что, если из {x, y, z, w} выкинуть первое число, то получиться {y, z, w}
> вместо {x, y, z}.
> Но, вообще-то, сделать еще один костыль можно, но железные костыли — они не
> бесплатные.
Но у них же есть аппаратный свизлинг. Из флоат4 можно бесплатно получить что угодно, хоть yzx, хоть wyx...

#940
19:41, 20 авг. 2016

А есть ли какая-нибудь оптимизация для Vertex Buffer по аналогии с выравниванием к float4 или там иные правила ?

#941
21:04, 20 авг. 2016

пихайте всё в Vector4 и не парьтесь))

#942
21:14, 20 авг. 2016

т.е. не нужно добавлять к переменной пустышку если она не float4 ?

#943
21:15, 20 авг. 2016

bykabak
> т.е. не нужно добавлять к переменной пустышку если она не float4 ?
или паковать не float4 переменные в float4

#944
23:28, 20 авг. 2016

Digan
> Почему такое выравнивание так критично для производительности?
Все просто:
В первом случае float3 получается выровненным и будет прочитан за один такт. Во втором случае он не выровнен и будет прочитан за два такта.

Но вообще такие вещи должны разрешаться компилятором, избыточная упаковка лучше потери производительности. В компиляторе DX все переменные в структурах, будь то float, float3 или float4, ставятся по границе 16 байт и упаковать  float и float3 в один регистр или в памяти подряд можно только явно, и не припомню, чтобы там можно было сбить выравнивание.

Но D3D - это шейдеры и к ним несколько другие требования, чем к программам ГПГПУ.

Страницы: 162 63 64 65 66 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.