6
votes

Prévenir la déruisement de la boucle dans le shader de fragment

J'écris un fragment Shader pour WebGL (GLSL ES 1.0) à l'aide de la dernière version de Chrome (et Firefox), et j'ai écrit un algorithme itératif.

Donc, tout d'abord, j'ai découvert de manière difficile que la longueur de la boucle est assez restreinte (Doc affirme qu'il doit être devinable à la compilée, ce qui signifie qu'il doit être constant ou très proche).

De plus, je dois écrire un ( pour , car c'est le seul que doit être mis en œuvre conformément à la norme) potentiellement longue mais qui se casse presque tous les temps avant la fin.

Maintenant, j'ai remarqué que si je définissais un nombre maximum plus élevé, la compilation et la liaison du shader prennent beaucoup plus de temps. Donc, à moins que je me trompe, le compilateur se déroule de la boucle.

Je ne sais pas si quelque chose peut être fait, mais j'ai essayé quelques choses et le compilateur semble également aux fonctions en ligne, même lorsque cela s'appelle dans des boucles.

Je n'ai pas l'impression que c'est normal qu'un shader prend une minute complète pour compiler à peu près à une centaine d'itérations d'une boucle. Ou est-ce que je fais la mauvaise chose? Une centaine d'itérations d'un fragment de shader trop trop pour un GPU? Parce qu'il semble courir juste bien après avoir compilé.


1 commentaires

Webgl Généralement, il suffit de maintenir le shader au compilateur de votre bibliothèque OpenGL, alors qu'est-ce que cela fait et combien de temps il faut dépend de votre carte vidéo et de votre pilote ...


3 Réponses :


6
votes

C'est l'une des réalités malheureuses de GLSL. Ce serait formidable si nous pouvions faire une compilation hors ligne et envoyer en bytecode, ou si nous avions la possibilité de spécifier des indicateurs à la compilation de l'heure de la compilation, mais ce n'est que pas la façon dont la spécification fonctionne. Vous êtes entièrement à la merci du fabricant du conducteur. Si NVIDIA / ATI pense que la boucle déroulante est bonne pour vous, votre boucle va être déroulée.

Je pose des questions sur ce que vous faites cela nécessite tant de boucler. Les shaders ne sont pas vraiment le bon endroit pour faire des calculs de bouclage ou de ramification super complexes. Vous allez certainement prendre une performance frappée pour cela. Si vous n'êtes pas inquiet pour la performance en temps réel, alors peut-être qu'un grand succès de compilation au début de votre programme n'est pas si mauvais. Si vous êtes préoccupé par la vitesse de rendu de votre application, vous devez probablement réévaluer la complexité de votre shaders.


0 commentaires

5
votes

Vous mentionnez que le shader prend plus d'une minute pour compiler une boucle avec un maximum de seulement environ 100 itérations, ce qui me fait penser que votre problème pourrait être lié à angle .

L'angle est un logiciel incorporé dans des navigateurs WebBL-Capables sur le système d'exploitation Windows, qui prend votre GLSL Shader et le traduit à l'exécution dans un Shader Direct3D HLSL. La pensée est que la plupart des machines Windows disposent de nouveaux pilotes Direct3D plus récents par rapport à leurs pilotes OpenGL, de sorte que le comportement par défaut est de tout convertir en D3D. Dans mon expérience, cela peut être lent, en particulier avec de longues boucles comme vous le décrivez, bien que de nombreux utilisateurs Windows soient nécessaires, en particulier ceux avec des graphiques basés sur Intel.

Si vous exécutez Windows et que vous avez des pilotes OpenGL de bonne qualité, tels que des nouveaux nouveaux neufs de NVIDIA ou AMD, vous pouvez essayer de désactiver l'angle de voir s'il corrige votre problème. Sur Google Chrome, cela est fait en modifiant votre icône Chrome pour ajouter - Use-GL = CODECT en tant que paramètre de ligne de commande (dans le champ "cible" de l'icône) et redémarrez le navigateur. Pour Firefox, vous pouvez visiter à propos de: config et tapez Webgl dans la zone de recherche et recherchez webgl.prefer-natif-gl et défini que c'est vrai.

Essayez à nouveau votre shader avec angle désactivé et les temps de compilation peuvent être améliorés. N'oubliez pas que ce n'est qu'un problème de Windows, alors modifiant ces paramètres sur d'autres plates-formes n'a aucun effet, mais je crois que toutes les autres plates-formes utilisent directement Native OpenGL.


0 commentaires

1
votes

Malheureusement amd pourrait em> ne pas soutenir cela, mais je pense que Nvidia a une belle directive de pragne déroulement. Pour les personnes qui ont le problème opposé, vous l'invoqueriez comme «#pragma optionnv (déroulement tout)» dans GLSL, mais je pense que ce qui suit évitera dérouler. Je cite POST DE DENISR 2008 sur les forums NVIDIA :

Par défaut, le compilateur déroule de petites boucles avec un nombre de déplacement connu. La directive #pragma déroulante peut toutefois être utilisée pour contrôler le déroulement de toute boucle donnée. Il doit être placé immédiatement avant la boucle et ne s'applique qu'à cette boucle. Il est éventuellement suivi d'un nombre qui spécifie combien de fois la boucle doit être déroulée. P>

Par exemple, dans cet échantillon de code: p>

#pragma optionNV (unroll 1)


0 commentaires