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

Зависимое чтение из памяти в шейдере

#0
21:02, 13 авг 2014

Слышал, что зависимое чтение из памяти в шейдере медленное. Но что именно под этим подразумевается? Если я например создам большой UBO (или SSBO или текстурный буфер или ещё что-нибудь) с массивом, передам через uniform индекс в нём и буду читать по этому индексу из вершинного шейдера, то замедлит это что-нибудь? Практически, все вершины одного объекта будут читать только из одного и того же места в UBO. Этого достаточно, чтобы не появились тормоза?
Я хочу сделать это для удобства и гибкости, а также это понадобится, когда я соберусь реализовывать автоматический инстансинг в движке.

#1
21:58, 13 авг 2014

gammaker

Сколько годков натикало, если не секрет ?

#2
22:17, 13 авг 2014

innuendo
> Сколько годков натикало, если не секрет ?
Мне или моему движку?

А что? Я делаю архитектурные изменения в своём движке, на основе которых потом будет куча всего построено. Если окажется, что я сделал тормозно, то потом это уже будет очень сложно исправить. Придётся пол-движка перепиливать. Это не какая-то мелочь, которую можно будет оптимизировать в любой момент. Поэтому необходимо продумывать всё заранее.
Я уже реализовывал раньше неэффективные решения, сейчас вот разгребаю.

Сложно что ли на вопрос ответить? Мне это точно не повредит, буду лучше знать, как устроены современные GPU.

#3
22:32, 13 авг 2014

если на огл, советую посмотреть вот эти свежие демки - https://developer.nvidia.com/gameworks-opengl-samples

#4
22:42, 13 авг 2014

Neill
Смотрел уже. А при чём здесь мой вопрос?

#5
0:32, 14 авг 2014

Зависимое чтение - это когда индекс неизвестен. Когда индекс высчитывается в шейдере и потом по нему делают выборку. Хороший пример - текстурные координаты в фрагментном шейдере. Если ты их модифицируешь - это зависимая выборка.

#6
0:40, 14 авг 2014

Роман Шувалов
> Зависимое чтение - это когда индекс неизвестен. Когда индекс высчитывается в
> шейдере и потом по нему делают выборку.
Ну а если индекс считается в шейдере, но так получается, что у всех вершин индекс получается одинаковый - это зависимое чтение (с точки зрения производительности)?

#7
1:53, 14 авг 2014

Точно не знаю. Теоретически - да, но значение по этому индексу наверняка закэшируется.

Если заранее известно, что значение в шейдере будет везде одинаковым, не проще ли его на ЦПУ считать? Или ты просто пример привел?

#8
2:03, 14 авг 2014

Роман Шувалов
> Хороший пример - текстурные координаты в фрагментном шейдере. Если ты их
> модифицируешь - это зависимая выборка

Вообще, зависимая в FS - это когда новые uv выбираются из другой текстуры

#9
2:16, 14 авг 2014

gammaker
> > Сколько годков натикало, если не секрет ?
> Мне

Тебе, только темы про скорость и создаёшь.  Обычно, с возрастом это проходит :)

Вот сделал ты оптимизацию, на AMD медленно, на NVIDIA - быстро, и дальше что ?

#10
2:56, 14 авг 2014

innuendo
> зависимая в FS - это когда новые uv выбираются из другой текстуры
У меня как раз такая, карта высот и палитра. Но я думал, что при выборке нечистыми varying-координатами, то есть теми, над которыми совершали математические операции уже в FS, тоже являются зависимыми, т.к. их нельзя заранее проинтерполировать и узнать еще до самого FS.

#11
3:01, 14 авг 2014

И даже свизлить нельзя, кроме texcoord.xy.

Больше того, на этих сраных мобилочках все еще пичяльнее. Если выборка независимая, то она осуществляется еще до выполнения пиксельного шойдыра, поэтому на мобильных говночипах зависимые выборки очень болезненные когда неожиданно появляются в ходе разработки.

На яблофонах и яблопадах (PowerVR) tex2Dbias даже по независимым координатам выполняется как зависимая выборка.

Треш, угар, содомия.

#12
11:28, 14 авг 2014

Роман Шувалов
> Если заранее известно, что значение в шейдере будет везде одинаковым, не проще
> ли его на ЦПУ считать?
Так всё и посчитано на CPU, что только можно. Я просто хочу хранить не один текущий материал в uniform, а сразу все в одном UBO. А индекс передавать либо через per instance атрибут, либо через uniform передавать индекс BaseID первого инстанса, а итоговый индекс считать через BaseID+gl_InstanceID.
То есть вычислений почти нет. Но это зависимым чтением считается? Или оно только возникает, когда я читаю по этому индексу в одном массиве, чтобы узнать индекс, по которому я буду читать в другом?

innuendo
> Тебе
20

innuendo
> Вот сделал ты оптимизацию, на AMD медленно, на NVIDIA - быстро, и дальше что ?
Я не оптимизацию делаю, а наоборот пытаюсь изменить свой движок так, чтобы повысить гибкость. Так как обратного пути не будет, надо обдумать, к каким последствиям это может привести.

#13
11:36, 14 авг 2014

Роман Шувалов
> Зависимое чтение - это когда индекс неизвестен. Когда индекс высчитывается в
> шейдере и потом по нему делают выборку

innuendo
> Вообще, зависимая в FS - это когда новые uv выбираются из другой текстуры

Вот кстати да. Это не когда вычисляется, а когда результат следующей выборки из памяти зависит от предыдущей выборки. Тогда выборки не могут быть распараллелены и ждут друг друга - вот тут-то и есть затык в производительности. Сейчас это относится не только к текстурам, а вообще к любым буферам.

#14
11:40, 14 авг 2014

Wraith
> На яблофонах и яблопадах (PowerVR) tex2Dbias даже по независимым координатам
> выполняется как зависимая выборка

Бивис нельзя менять не шейдером ?

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

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