Bon, une fois n’est pas coutume, j’ai un petit soucis avec la mise en place du SSE dans un projet perso (un raytracer temps réel).
Je vous explique mon problème : j’ai des classes mathématiques de base (CVector, CPoint, CHPoint, CMatrix3x3, CMatrix4x4, etc.) Ces classes sont à la base implémentées en C++ tout bête, donc utilisent la FPU classique & tout & tout. Jusque la, tout va bien.
Maintenant, l’idée c’est d’exploiter le SSE qu’il est bien (et rapide, en théorie) pour accélérer tous ces calculs. Donc j’ai écris une version de la plupart de ces classes (pas toutes encore, ça prends du temps quand même) en SSE, via les intrinsics de Visual Studio .NET (rulez). Du coup, la plupart des opérations se font en SSE (addition/soustraction/multiplication/dot products, etc.), ce qui est bien.
Le problème, c’est que quand je compile le raytracer avec ces classes (avec tout l’alignement qui va bien, puisqu’il faut aligner sur 16 octets les éléments accédés par le SSE), celui-ci est plus lent qu’en FPU. Oui, plus lent. Sur mon Athlon 1600+ XP, je passe de 50 FPS à 45 FPS pour une scène donnée. Et la même scène, sur un Celeron 2Ghz, passe de 30 FPS à 10 FPS. Quand même
Je ne comprends pas d’où peut venir le problème. Ok je n’ai pas toutes les opérations en SSE encore, mais une grosse partie quand même.
Si l’un d’entre vous sait d’où peut venir le problème, ça m’intéresse. D’autant que je me suis basé sur le principe de la “Math Lib 2” de Intel, qui fait pareil que moi : faire des classes mathématiques en SSE. Et eux disent que ça accélérent.
(Petite note : sur mes tests “hors contexte” des opérateurs de mes classes, le SSE semble plus rapide d’un facteur 1.5 à 3 suivant les opérateurs et les cas, alors que quand je le met en condition, il apparait comme étant plus lent.)
(Note 2 : c0unt0, pas la peine de te foutre de ma gueule hein… )