GPU Context Switch

Имам програма, която изобразява първо текстура, след това предава текстурата на изчислителния шейдър за обработка, след което изобразява изходния резултат на екрана чрез текстуриран четворен екран на цял екран.

Прочетох в ръководството за програмиране на nVidia за изчислителни шейдъри, че всеки път, когато изпратите изчислителен шейдър, той инициира превключване на контекста на GPU устройство, което не трябва да се прави много често.

В момента съм много объркан. Начинът, по който го виждам, в моя конвейер за изобразяване графичният процесор превключва контекстите два пъти. нали Веднъж по време на първото диспечерско повикване, следващия път, когато изобразя нормално четириъгълника си на цял екран.

Ако това е правилно, тогава мога да избегна едно превключване, като реорганизирам кода си по този начин. Първо рендирайте до текстура. Второ, направете обработката в компютърния шейдър. След това, В СЛЕДВАЩИЯ КАДЪР изобразете резултата, след това (все още в следващия кадър) изобразете всички актуализации на текстурата, извършете обработка в изчислителен шейдър... Така че по принцип всяко начало на кадъра изобразявам резултатите от последния кадър ( първият кадър ще бъде изключение). Тогава ще има само едно превключване на контекста, нали?

Но тогава GPU пак ще трябва да превключва контекста между кадрите, нали? Така че двете версии на моя тръбопровод за изобразяване имат два контекстни превключвателя. Няма да има разлика в производителността. Прав ли съм?

Всяка помощ ще бъде оценена.


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


Отговори (1)


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

В много съвременни игри има повече от 2 превключвателя в един и същ конвейер (графичен конвейер за рендиране, изчислителен шейдър за светлина, пикселен шейдър за fxaa...) и те все още работят добре.

person mrvux    schedule 03.11.2012
comment
Благодаря. Това изчисти притесненията ми относно представянето. Какво ще кажете обаче за двете версии на моя код, еднакви ли са? - person l3utterfly; 04.11.2012
comment
По отношение на производителността те ще бъдат почти еднакви, все пак ще трябва да превключвате, това най-вече ще направи вашия тръбопровод по-сложен за минимална печалба imo (също така не забравяйте, че извикванията на контекста на устройството не блокират, така че вашите команди вероятно ще бъдат изпълнени когато извиквате настоящия метод, а не когато извиквате dispatch или draw) - person mrvux; 04.11.2012