2009-06-11 6 views
20

quelqu'un peut-il recommander la bibliothèque SIMD portable qui fournit une API c/C++, fonctionne sur les extensions Intel et AMD et Visual Studio, compatible GCC. Je cherche à accélérer des choses comme la mise à l'échelle d'une gamme de doubles 512x512. Jusqu'à présent, le seul que j'ai trouvé est: http://simdx86.sourceforge.net/ mais comme la toute première page dit qu'il ne compile pas sur visual studio.Bonne bibliothèque SIMD portable

Il ya aussi Intel IPP qui ne fonctionne pas sur AMD d'après ce que je comprends. Et il y a Framewave d'AMD, mais j'avais quelques problèmes pour compiler et relier leur bibliothèque et leurs forums sont complètement morts. Quelqu'un a-t-il réussi à utiliser Framewave n'importe où?

Merci.

+0

J'ai vu une fois la thèse de maîtrise de someones sur ce sujet. Ne peut pas pour la vie de moi rappeler quels termes l'amèneraient dans une recherche. – dmckee

+8

Extrayez la bibliothèque [libsimdpp] (https://github.com/p12tic/libsimdpp) - elle fournit une interface commune pour les intrinsèques SSE2-SSE4.1, AVX, AVX2, NEON, FMA3/4 et XOP.En prime, un mécanisme de répartition dynamique pratique est fourni: le même code source peut être compilé plusieurs fois avec différentes options de compilation (les espaces de noms prennent en charge ODR), lié au même exécutable et la bibliothèque sélectionne automatiquement la meilleure implémentation pour le processeur cible . (avertissement: je suis l'auteur) – user12

+0

Il serait préférable de migrer cette question à http://softwarerecs.stackexchange.com – Eonil

Répondre

8

Puisque vous font état d'opérations de haut niveau sur des matrices et des vecteurs, ATLAS, Intel's MKL, PLASMA et FLAME peut être intéressant.

Certaines bibliothèques mathématiques de matrice C++ comprennent uBLAS de Boost, Armadillo, Eigen, IT ++ et Newmat. La bibliothèque POOMA inclut probablement certaines de ces choses. This question fait également référence à MTL.

Si vous recherchez des primitives de portabilité de niveau inférieur, un de mes collègues a développé un wrapper autour des opérations vectorielles SSE2, Altivec, VSX, Larrabee et Cell SPE. Il peut être trouvé dans notre source repository, mais sa licence (académique) peut ne pas convenir si vous voulez le distribuer dans le cadre de votre travail. Il est également encore en développement important pour couvrir l'éventail des besoins d'applications ciblés.

2

Si cela ne vous dérange pas de vous salir avec l'assembleur, vous pouvez toujours utiliser les fonctions intrinsèques pour toutes les instructions SIMD. Ils seront spécifiques au processeur, c'est-à-dire que les intrinsèques SSE4 ne fonctionneront que sur les processeurs compatibles SSE4 et que c'est à vous de vous assurer que les extensions sont là.

Il existe un bon article here sur l'application de SIMD.

Vous pouvez cependant utiliser un compilateur qui génère du code SIMD pour vous sans bibliothèques externes. VectorC est censé être bon même si je ne l'ai jamais utilisé personnellement. Il ne nécessite pas de bibliothèques spéciales pour autant que je sache, il repère simplement les bits de code source qui peuvent bénéficier de SIMD et compile à n'importe quel niveau de SSE que vous spécifiez.

+0

Merci, échapper à l'assemblage spécifique du processeur est mon objectif principal. Je ne veux pas avoir à se soucier de savoir si la CPU supporte SSE ou SSE2 et écrire 2 versions différentes du code dans certains cas. J'espérais que quelqu'un l'a déjà fait dans une bibliothèque =). Idem pour les extensions spécifiques au compilateur, etc. – Budric

3

Essayez liboil ou le ORC associé. Surtout ORC est intéressant; Il implémente un langage d'assemblage de haut niveau qui est compilé en code spécifique à l'architecture. Assez sophistiqué, beaucoup plus qu'une simple bibliothèque de wrapper.

10

Eigen est un en-tête MPL2 seule -licensed bibliothèque C++ qui a mathématiques vecteur/matrice qui est optimisé pour SSE, Enseigne lumineuse, et Altivec. Ils ont des opérations mathématiques plus sophistiquées dans leurs modules complémentaires.

+2

Eigen a été reconfiguré en MPL2 http://eigen.tuxfamily.org/index.php?title=News:Relicensed_to_MPL2, ce qui est une bonne étape. –

+0

Merci. J'ai mis à jour ma réponse pour refléter cela. –

Questions connexes