Question

Je travaille dans Visual Studio 2008 et dans les paramètres du projet que je vois l'option « activer ensemble d'instructions étendu » que je peux à None, ESS ou SSE2

Alors le compilateur essaiera d'instructions de traitement par lots ensemble pour faire usage d'instructions SIMD?

Y a-t-il des règles, on peut suivre dans la façon dont le code d'optimisation tel que le compilateur peut faire assembleur effiecient en utilisant ces extensions?

Par exemple, je travaille actuellement sur un raytracer. Un shader prend une certaine entrée et calcule à partir de l'entrée une couleur de sortie, comme suit:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

serait-il par exemple être bénéfique pour écrire la shadercode telle qu'elle serait l'ombre 4 différents pixels dans un appel de l'instruction? quelque chose comme ceci:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

pour traiter plusieurs dataUnits à la fois. Serait-ce bénéfique pour faire l'utilisation du compilateur d'instructions SSE?

merci!

Était-ce utile?

La solution

  

Je travaille dans Visual Studio 2008 et dans les paramètres du projet que je vois l'option « activer ensemble d'instructions étendu » que je peux à None, ESS ou SSE2

     

Alors le compilateur essaiera d'instructions de traitement par lots ensemble pour faire usage d'instructions SIMD?

Non, le compilateur ne sera pas utiliser des instructions vectorielles lui-même. Il utilisera les instructions SSE scalaires au lieu de x87 les.

Ce que vous décrivez est appelé « vectorisation automatique ». compilateurs Microsoft ne le font pas, compilateurs Intel font.

Microsoft compilateur vous pouvez utiliser intrinsics pour effectuer des optimisations SSE manuelles .

Autres conseils

Trois observations.

  1. Les meilleurs speedups ne viennent pas d'optimisations mais de bons algorithmes . Donc, assurez-vous que partie droite d'abord. Souvent, cela signifie simplement en utilisant les bonnes librairies pour votre domaine spécifique.

  2. Une fois que vous obtenez vos algorithmes droite, il est temps de Mesure . Souvent, il y a une règle 80/20 au travail. 20% de votre code prendra 80% du temps d'exécution. Mais afin de localiser cette partie, vous avez besoin d'un bon profileur. Intel VTune peut vous donner le profil d'échantillonnage de chaque fonction et agréable rapports qui identifier les tueurs de performance. si vous avez un processeur AMD Une autre alternative est gratuit AMD CodeAnalyst .

  3. La capacité de autovectorization du compilateur n'est pas une balle d'argent. Bien qu'il essayera vraiment difficile (surtout Intel C ++ ), vous souvent besoin de l'aider en réécrivant les algorithmes sous forme vectorielle. Vous pouvez souvent obtenir de bien meilleurs résultats par handcrafting petites portions du code de goulot d'étranglement d'utiliser des instructions SIMD. Vous pouvez le faire dans le code C (voir le lien ci-dessus de VJO) à l'aide ou de l'utilisation intrinsics assembleur en ligne.

de parties cours 2 et 3 forment un processus itératif. Si vous êtes vraiment sérieux à ce sujet alors il y a sur le sujet quelques bons livres par des gens tels que Intel Le logiciel d'optimisation livre de recettes et les manuels de référence du processeur.

Le compilateur n'est pas tout puissant, et il a quelques limites. Si elle peut (et si les drapeaux droit sont passés à), il utilisera les instructions SSE. La seule façon de voir ce qu'il a fait est d'examiner le code assembleur généré par le compilateur.

Une autre option consiste à utiliser des instructions C SSE / SSE2. Pour les fenêtres, vous pouvez les trouver ici:

http://msdn.microsoft.com/ fr-fr / bibliothèque / y0dh78ez% 28VS.80% 29.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top