2016-06-28 3 views
0

В течение некоторого времени я избегал ветвления в моей шейдерной коде, вместоПрофильные графические шейдеры

float invert_value(in float value) 
{ 
if(value == 0.0) 
    return 0.0; 
else 
    return 1.0/value; 
} 

писать «умный» код, как этот

float invert_value_ifless(in float value) 
{ 
float sign_value = sign(value); 
float sign_value_squared = sign_value*sign_value; 
return sign_value_squared/(value + sign_value_squared - 1.0); 
} 

Это возвращает именно то, что первая функция имеет и не имеет ветвей, поэтому она быстрее.

Не так ли? Я сражаюсь с призраками здесь?

Как профилировать графические шейдеры для скорости? Меня больше всего интересуют последние мобильные платформы (Android), но любые советы по графическому профилированию в целом приветствуются!

+1

«Я здесь сражаюсь с призраками?» «[Да, вы.] (Http://stackoverflow.com/q/37827216/734069) –

+0

Отличный ответ там Николь. – Leszek

+0

Является ли это fighing с призраками? Вместо того, чтобы , если (а> 0) Ь = (1-а)/(2-а) еще Ь = (1 + а)/(2 + а) записи Signa = знак (а); b = (1-signA * a)/(2-signA * a); ? – Leszek

ответ

1

Часто по-прежнему по той причине, что вы, вероятно, изначально считались, - графический процессор часто реализуется как очень широкий SIMD-процессор, поэтому выполнение одних и тех же операций для каждого пикселя позволяет обрабатывать многие из них одновременно, тогда как сбор разные операции на пиксель делают это исчисление намного более проблематичным. Вот почему такие операции, как step, сохранились в GLSL. Хороший компилятор GLSL обычно может исключать возможность компиляции и может сделать ваш ветвящийся код невзаимодействующим другими средствами, но компиляторы GLSL обычно не так хороши, как обычные компиляторы автономного языка, потому что у них есть собственный бюджет производительности, чтобы беспокоиться о ,

Я профессионал iOS профессионально, поэтому я могу подробно рассказать о чудесах профайлера кадра Xcode и сделаю это для получения полного ответа, но приношу свои извинения, что я не могу много предложить о Android ,

В Xcode есть кнопка захвата кадра. Удалите его, и полный поток команд OpenGL будет захвачен для одного кадра. Оттуда вы сможете проверить все состояние и буферы, как это было до и после каждой команды OpenGL. Будет сообщено количество времени, которое будет принято в каждом звонке. Лучше этого, ваш код GLSL сам будет профилирован до уровня линии - будет сообщено μs на строку кода. И, действительно положив это на край, вы можете переписать свой код GLSL прямо там и повторно запустить фрейм, как показано, чтобы узнать, что происходит с вашими расходами. Или, как правило, в качестве среды авторского права с быстрой обратной связью, хотя для этого не предназначен этот инструмент.

0

Все основные производители графических процессоров на Android имеют свои собственные инструменты для профилирования GPU, которые делают примерно то же самое, что и захват кадра XCode. ARM, Qualcomm и PowerVR делаем.

Такие вещи необходимо измерять, и, к сожалению, из-за проблем с пользователями Android, не обновляющимися по разным причинам, качество драйверов в дикой природе является переменным.

+0

Да, я пытаюсь использовать баннер Adreno Profiler, но по какой-то причине он не может найти приложение adreno profiler enabled, когда я подключаю его к своему телефону .... Я попробую еще :) – Leszek

+0

Да, мой опыт работы с инструментами профилирования графического процессора, как правило, был результатом разочарования. Если вы ищете ярлык, я знаю, что редактор шейдеров PowerVR позволяет оценивать количество циклов для разных своих архитектур GPU без необходимости запуска шейдера на устройстве (я ожидаю, что другие производители имеют схожие функции, но я не знаю, для конечно). Этого может быть достаточно, чтобы получить представление. – Columbo