Как вершинные шейдеры OpenGL 4.X обрабатывают огромное количество вершин

В OpenGL 4.3+ вычислительный шейдер позволяет пользователю явно настраивать количество потоков в каждом блоке и количество блоков, используемых для обработки данных (glDispatchCompute). Однако в Вершинном шейдере мне не нужно указывать конфигурацию потоков/блоков. Итак, для вершинного шейдера существует ли автоматический способ распределения рабочей нагрузки между блоками/процессами? Когда у меня есть большое количество вершин для обработки, возможно ли, что я явно предоставляю конфигурацию вершинному шейдеру?


person UNCAL LEE    schedule 15.11.2013    source источник
comment
Сам драйвер/графический процессор уже планирует большую часть конвейера для работы таким образом. Было бы ужасно неэффективно, если бы ему приходилось последовательно преобразовывать вершины, используя один варп/волновой фронт (единицу планирования потоков). Поскольку шейдеры вершин/фрагментов не могут считывать результаты смежных вершин/фрагментов, их легко планировать параллельно. Планирование, которое вы явно учитываете в вычислительных шейдерах, уже неявно происходит в обычном конвейере рендеринга. Балансировка нагрузки была важной частью дизайна графических процессоров со времен унифицированной модели шейдеров; вы должны делать экзотические (эпоха GL4) вещи в шейдере, чтобы возиться с ним   -  person Andon M. Coleman    schedule 16.11.2013
comment
Спасибо за ваши комментарии :) В таком случае означает ли это, что механизм распределения нагрузки может различаться между разными драйверами? Можно ли выяснить какие-либо закономерности этого распределения на случай, если я захочу оптимизировать данные для повышения производительности? (например, переупорядочить вершины, чтобы уменьшить частоту промахов кеша)   -  person UNCAL LEE    schedule 16.11.2013
comment
Чтобы выяснить шаблоны, вы, вероятно, могли бы использовать «атомарные счетчики», как этот код, который вычисляет шаблоны растеризации: geeks3d.com/20120309/   -  person rotoglup    schedule 16.11.2013


Ответы (1)


Возможно ли, что я явно предоставляю конфигурацию вершинному шейдеру?

No.

Итак, для вершинного шейдера существует ли автоматический способ распределения рабочей нагрузки между блоками/процессами?

Да. Графический процессор/драйвер уже должен позаботиться об этом за кулисами.

Используя большие пакеты в памяти на стороне сервера, вы уже указываете реализации OpenGL отображать их так быстро, как это возможно.

Это не похоже на то, что OpenGL запускается в каком-то «медленном» режиме, который вы должны отключить.

person genpfault    schedule 15.11.2013
comment
Спасибо за быстрый ответ. Таким образом, в этом случае драйвер позаботится о распределении нагрузки между процессорами. Но могут ли программисты узнать, как это сделал драйвер/графический процессор, если мы хотим оптимизировать данные (например, оптимизацию кэша вершин) для повышения производительности? - person UNCAL LEE; 16.11.2013
comment
ARB_debug_output или расширения для конкретного поставщика (если они существуют) могут раскрывать подобную информацию. Мощь. - person genpfault; 16.11.2013