2016-09-12 2 views
1

который быстрее в GLSL:GLSL: пау против умножения для целого показателя

pow(x, 3.0f); 

или

x*x*x; 

?

Выполняется ли оценка эффективности экспоненциального измерения в зависимости от поставщика оборудования или показателя экспоненты?

+3

Это должно действительно зависеть от оптимизации аппаратного поставщика и шейдера. Но, делая «x * x * x» вручную, вы можете переопределить оптимизацию компилятора – codetiger

+0

@codetiger Это звучит разумно, но компиляторы распознают постоянный целочисленный показатель? В GLSL нет 'pow (float, int)', поэтому, если компиляторы каким-то образом не обрабатывают этот особый случай, разворачивание экспоненции вручную может быть быстрее, чем возвышение с плавающей запятой. – Sergey

+0

Я согласен с тем, что вы выдвигаете, но это полностью зависит от вашего оборудования и среды. Поэтому, если вы создаете его для определенного оборудования, тогда в вашем коде стоит развернуть его иначе. Я также предложил бы оптимизировать ваш код с помощью Open Source GLSL (https://github.com/aras-p/glsl-optimizer), чтобы узнать, что он делает. – codetiger

ответ

6

Хотя это определенно зависит от оборудования/поставщика/компилятора, расширенные математические функции, такие как pow(), как правило, значительно дороже базовых операций.

Лучший подход - это, конечно, попробовать оба и контрольные. Но если есть простая замена для продвинутых математических функций, я не думаю, что вы можете пойти очень неправильно, используя ее.

Если вы пишете pow(x, 3.0), лучшее, на что вы можете надеяться, это то, что компилятор распознает специальный случай и расширит его. Но зачем рисковать, если замена столь же короткая и легко читаемая? Компиляторы C/C++ не всегда заменяют pow(x, 2.0) простым умножением, поэтому я не буду рассчитывать на все компиляторы GLSL для этого.