2016-09-12 2 views
1

Ce qui est plus rapide en GLSL:GLSL: prisonnier de guerre vs multiplication pour l'exposant entier

pow(x, 3.0f); 

ou

x*x*x; 

?

Les performances d'exponentiation dépendent-elles du fournisseur de matériel ou de la valeur de l'exposant?

+3

Cela devrait vraiment dépendre de l'optimisation du fournisseur de matériel et du shader. Mais en faisant 'x * x * x' manuellement, vous pouvez remplacer l'optimisation du compilateur – codetiger

+0

@codetiger Cela semble raisonnable, mais les compilateurs reconnaissent-ils un exposant constant? Il n'y a pas de 'pow (float, int)' dans GLSL, donc si les compilateurs ne gèrent pas ce cas particulier, l'exponentiation à la main peut être plus rapide que l'exponentiation à virgule flottante. – Sergey

+0

J'accepte le point que vous avancez, mais cela dépend totalement de votre matériel et de votre environnement. Donc, si vous le construisez pour un matériel spécifique, il vaut mieux le dérouler dans votre code sinon. Je suggère également d'optimiser votre code en utilisant le GLSL Open Source (https://github.com/aras-p/glsl-optimizer) pour voir ce qu'il fait. – codetiger

Répondre

6

Bien que cela puisse certainement dépendre du matériel/du fournisseur/du compilateur, les fonctions mathématiques avancées telles que pow() ont tendance à être considérablement plus onéreuses que les opérations de base.

La meilleure approche est bien sûr d'essayer les deux, et de comparer. Mais s'il y a un simple remplacement pour une fonction mathématique avancée, je ne pense pas que vous puissiez vous tromper en l'utilisant.

Si vous écrivez pow(x, 3.0), le mieux que vous pouvez probablement espérer est que le compilateur reconnaîtra le cas particulier, et le développera. Mais pourquoi prendre le risque, si le remplacement est tout aussi court et facile à lire? Les compilateurs C/C++ ne remplacent pas toujours pow(x, 2.0) par une simple multiplication, donc je ne compterais pas forcément sur tous les compilateurs GLSL pour le faire.