Existe-t-il une bonne bibliothèque SIMD à masortingce double double précision pour x86?

Je recherche une bibliothèque SIMD axée sur de petites opérations masortingcielles (4×4) pour les graphiques. Il y a beaucoup de solutions à simple précision, mais je dois prendre en charge à la fois la simple et la double précision.

J’ai consulté la bibliothèque IPP MX d’Intel, mais je préférerais quelque chose avec le code source. Je suis très intéressé par les implémentations SSE3 + de ces opérations particulières:

  1. Mat4 * Mat4
  2. Mat4 * Vec4
  3. Mat4 * Tableau de Mat4
  4. Mat4 * Tableau de Vec4
  5. Inversion Mat4 (agréable d’avoir)

EDIT: Pas de réponse “optimisation prématurée” s’il vous plait. Quiconque a travaillé avec de petites masortingces sait que GCC ne les vectorise pas, pas plus que les insortingnsèques ou ASM optimisés manuellement. Et dans ce cas, c’est important, sinon je ne le demanderais pas.

Peut-être la bibliothèque Eigen ?

Il prend en charge les instructions SSE 2/3/4, ARM NEON et AltiVec.

Eigen supporte les masortingces de taille fixe. De petites masortingces de taille fixe peuvent être allouées sur la stack pour de meilleures performances. 4×4 est bon pour SSE, puisque la taille du vecteur SSE est de 128 bits. Une ligne ou une colonne de 4 nombres en double précision s’intégrerait parfaitement dans les vecteurs SSE 2×128 bits. Cela facilite la mise en œuvre de SIMD.

Une autre option consiste à coder vous-même. Étant donné que vos masortingces sont petites et qu’elles tiennent dans le cache L1, vous n’avez pas à vous soucier de titrer la mémoire nécessaire aux grandes masortingces. Vous pouvez utiliser AVX pour des performances encore meilleures. Les versions plus récentes de GCC et Visual C ++ 2010 prennent en charge les composants insortingnsèques AVX. La taille du vecteur AVX est de 256 bits et peut contenir exactement 4 nombres en double précision.

Pas encore complètement terminé, mais je voulais créer ma propre bibliothèque – glsl-sse2 .

Il y a une implémentation AVX 4×4 ici . Il est écrit à titre d’exemple, mais je suis certain qu’il ne serait pas difficile pour quiconque d’extraire les parties intéressantes dans une bibliothèque partagée. Je pensais poster ceci malgré l’âge de la question initiale pour quiconque se poserait ici dans le futur.

Si vous utilisez un compilateur moderne, vous n’avez probablement pas besoin de vous embêter. La vectorisation automatique de la plupart des compilateurs devrait pouvoir facilement transformer for boucles avec des limites fixes dans le code SIMD. Cela fait longtemps que GCC l’a déjà fait , et c’est l’un des principaux arguments de vente du compilateur d’Intel (vous devez toutefois faire attention à l’utilisation du compilateur d’Intel si vous souhaitez utiliser des puces AMD).