В OpenGL 4.3+ вычислительный шейдер позволяет пользователю явно настраивать количество потоков в каждом блоке и количество блоков, используемых для обработки данных (glDispatchCompute). Однако в Вершинном шейдере мне не нужно указывать конфигурацию потоков/блоков. Итак, для вершинного шейдера существует ли автоматический способ распределения рабочей нагрузки между блоками/процессами? Когда у меня есть большое количество вершин для обработки, возможно ли, что я явно предоставляю конфигурацию вершинному шейдеру?
Как вершинные шейдеры OpenGL 4.X обрабатывают огромное количество вершин
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
Спасибо за быстрый ответ. Таким образом, в этом случае драйвер позаботится о распределении нагрузки между процессорами. Но могут ли программисты узнать, как это сделал драйвер/графический процессор, если мы хотим оптимизировать данные (например, оптимизацию кэша вершин) для повышения производительности?
- person UNCAL LEE; 16.11.2013
ARB_debug_output
или расширения для конкретного поставщика (если они существуют) могут раскрывать подобную информацию. Мощь.
- person genpfault; 16.11.2013