Переключение контекста графического процессора

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

Я читал в руководстве по программированию nVidia для вычислительных шейдеров, что каждый раз, когда вы запускаете вычислительный шейдер, он инициирует переключение контекста устройства графического процессора, что не следует делать довольно часто.

Я очень смущен прямо сейчас. Насколько я понимаю, в моем конвейере рендеринга GPU дважды переключает контексты. Правильно? Один раз во время первого диспетчерского вызова, в следующий раз, когда я нормально отрисовываю свой полноэкранный квадроцикл.

Если это правильно, то я могу избежать одного переключения, реорганизовав свой код следующим образом. Во-первых, визуализируйте текстуру. Во-вторых, выполните обработку в вычислительном шейдере. Затем, В СЛЕДУЮЩЕМ КАДРЕ, визуализируйте результат, затем (все еще в следующем кадре) визуализируйте все обновления текстуры, выполните обработку в вычислительном шейдере... Таким образом, в основном в каждом начале кадра я визуализирую результаты последнего кадра (в следующем кадре). первый кадр будет исключением). Тогда будет только одно переключение контекста, верно?

Но тогда GPU все равно придется делать переключение контекста между кадрами, верно? Таким образом, две версии моего конвейера рендеринга имеют два переключателя контекста. Разницы в производительности не будет. Я прав?

Любая помощь будет оценена.


person l3utterfly    schedule 06.10.2012    source источник


Ответы (1)


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

Во многих современных играх в одном конвейере используется более двух переключателей (графический конвейер для рендеринга, вычислительный шейдер для света, пиксельный шейдер для fxaa...), и они по-прежнему работают нормально.

person mrvux    schedule 03.11.2012
comment
Спасибо. Это развеяло мои опасения по поводу производительности. Однако как насчет двух версий моего кода, они одинаковы? - person l3utterfly; 04.11.2012
comment
С точки зрения производительности они будут почти одинаковыми, вам все равно нужно будет переключаться, это в основном сделает ваш конвейер более сложным для минимальной выгоды imo (также помните, что контекстные вызовы устройства не блокируются, поэтому ваши команды, скорее всего, будут выполняться когда вы вызываете настоящий метод, а не когда вы вызываете диспетчеризацию или отрисовку) - person mrvux; 04.11.2012