Question

J'utilise énormément les mathématiques 3D dans mon application. Combien de temps puis-je atteindre en convertissant ma bibliothèque de vecteurs / matrices en SSE, AltiVec ou un code SIMD similaire?

Était-ce utile?

La solution

D'après mon expérience, je vois généralement une amélioration 3x en passant d'un algorithme de x87 à SSE, et une meilleure qu'en 5x en passant à VMX / Altivec (en raison de problèmes compliqués liés à la profondeur du pipeline, la planification, etc.). Toutefois, je ne le fais généralement que dans les cas où j’ai des centaines, voire des milliers de chiffres à traiter, et non pour ceux où je ne travaille qu’un vecteur à la fois.

Autres conseils

Ce n’est pas tout, mais il est possible d’optimiser davantage à l’aide de SIMD. Jetez un coup d’œil à la présentation de Miguel sur la mise en oeuvre des instructions SIMD avec MONO à PDC 2008 ,

 SIMD bat le double de cette configuration particulière.
(source: tirania.org )

Image de l'entrée de blog de Miguel.

Pour des chiffres très approximatifs: j'ai entendu des personnes sur ompf.org réclamer 10 accélérations rapides pour une main -optimisée des routines de lancer de rayons. J'ai aussi eu de bonnes améliorations. J’estime que j’ai quelque part entre 2x et 6x mes routines en fonction du problème, et beaucoup d’entre elles avaient quelques magasins et charges inutiles. Si votre code contient beaucoup de ramifications, oubliez-le, mais vous pouvez très bien vous en sortir pour les problèmes qui sont naturellement parallèles aux données.

Cependant, je devrais ajouter que vos algorithmes doivent être conçus pour une exécution parallèle des données. Cela signifie que si vous avez une bibliothèque mathématique générique, comme vous l'avez mentionné, elle devrait prendre des vecteurs compactés plutôt que des vecteurs individuels, sinon vous perdrez simplement votre temps.

E.g. Quelque chose comme

namespace SIMD {
class PackedVec4d
{
  __m128 x;
  __m128 y;
  __m128 z;
  __m128 w;

  //...
};
}

La plupart des problèmes où les performances comptent peuvent être mis en parallèle, car vous travaillerez probablement avec un ensemble de données volumineux. Votre problème ressemble à un cas d'optimisation prématurée pour moi.

Pour les opérations 3D, méfiez-vous des données non initialisées dans votre composant W. J'ai vu des cas où les opérations SSE (_mm_add_ps) nécessitaient 10 fois plus de temps que prévu en raison de mauvaises données en W.

La réponse dépend fortement de ce que fait la bibliothèque et de son utilisation.

Les gains peuvent aller de quelques points de pourcentage à "plusieurs fois plus rapidement", les zones les plus susceptibles de générer des gains sont celles dans lesquelles vous ne traitez pas de vecteurs ou de valeurs isolés, mais de multiples vecteurs ou valeurs devant être traité de la même manière.

Un autre domaine concerne les limites du cache ou de la mémoire, ce qui nécessite également le traitement de nombreuses valeurs / vecteurs.

Les domaines dans lesquels les gains peuvent être les plus radicaux sont probablement ceux du traitement des images et du signal, des simulations informatiques, ainsi que des opérations mathématiques générales en 3D sur des maillages (plutôt que des vecteurs isolés).

De nos jours, tous les bons compilateurs pour x86 génèrent des instructions SSE pour SP et DP float math par défaut. Il est presque toujours plus rapide d'utiliser ces instructions que les instructions natives, même pour des opérations scalaires, à condition de les planifier correctement. Cela surprendra de nombreuses personnes qui, dans le passé, trouvaient SSE «lent», et pensaient que les compilateurs ne pourraient pas générer d’instructions scalaires SSE rapides. Mais maintenant, vous devez utiliser un commutateur pour désactiver la génération SSE et utiliser x87. Notez que x87 est réellement obsolète à ce stade et peut être entièrement supprimé des futurs processeurs. Le seul inconvénient est que nous risquons de perdre la capacité de faire du transfert flottant DP 80 bits dans un registre. Mais le consensus semble être que si vous dépendez de la précision des flotteurs DP à 80 bits au lieu de 64 bits, vous devriez rechercher un algorithme plus tolérant aux pertes.

Tout ce qui précède est une surprise complète pour moi. C'est très contre-intuitif. Mais les données parlent.

Très probablement, vous ne verrez qu'une très petite accélération, le cas échéant, et le processus sera plus compliqué que prévu. Pour plus de détails, voir La classe de vecteurs SSE omniprésente , article de Fabian Giesen.

  

La classe de vecteurs SMI omniprésente: démystifier un mythe commun

     

Pas si important

     

Tout d’abord, votre classe de vecteurs n’est probablement pas aussi importante que vous le pensez pour les performances de votre programme (et si c’est le cas, c’est plus probable parce que vous faites quelque chose de mal que parce que les calculs sont inefficaces). Ne vous méprenez pas, il s'agira probablement de l'une des classes les plus utilisées dans l'ensemble de votre programme, du moins pour les graphismes 3D. Mais le fait que les opérations vectorielles soient courantes ne signifie pas automatiquement qu'elles vont dominer le temps d'exécution de votre programme.

     

Pas si chaud

     

Pas facile

     

Pas maintenant

     

Jamais

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