который быстрее в GLSL:GLSL: пау против умножения для целого показателя
pow(x, 3.0f);
или
x*x*x;
?
Выполняется ли оценка эффективности экспоненциального измерения в зависимости от поставщика оборудования или показателя экспоненты?
который быстрее в GLSL:GLSL: пау против умножения для целого показателя
pow(x, 3.0f);
или
x*x*x;
?
Выполняется ли оценка эффективности экспоненциального измерения в зависимости от поставщика оборудования или показателя экспоненты?
Хотя это определенно зависит от оборудования/поставщика/компилятора, расширенные математические функции, такие как pow()
, как правило, значительно дороже базовых операций.
Лучший подход - это, конечно, попробовать оба и контрольные. Но если есть простая замена для продвинутых математических функций, я не думаю, что вы можете пойти очень неправильно, используя ее.
Если вы пишете pow(x, 3.0)
, лучшее, на что вы можете надеяться, это то, что компилятор распознает специальный случай и расширит его. Но зачем рисковать, если замена столь же короткая и легко читаемая? Компиляторы C/C++ не всегда заменяют pow(x, 2.0)
простым умножением, поэтому я не буду рассчитывать на все компиляторы GLSL для этого.
Это должно действительно зависеть от оптимизации аппаратного поставщика и шейдера. Но, делая «x * x * x» вручную, вы можете переопределить оптимизацию компилятора – codetiger
@codetiger Это звучит разумно, но компиляторы распознают постоянный целочисленный показатель? В GLSL нет 'pow (float, int)', поэтому, если компиляторы каким-то образом не обрабатывают этот особый случай, разворачивание экспоненции вручную может быть быстрее, чем возвышение с плавающей запятой. – Sergey
Я согласен с тем, что вы выдвигаете, но это полностью зависит от вашего оборудования и среды. Поэтому, если вы создаете его для определенного оборудования, тогда в вашем коде стоит развернуть его иначе. Я также предложил бы оптимизировать ваш код с помощью Open Source GLSL (https://github.com/aras-p/glsl-optimizer), чтобы узнать, что он делает. – codetiger