Existe-t-il un tutoriel simple pour me familiariser avec SSE, SSE2 et SSE3 dans GNU C ++? Comment pouvez-vous optimiser le code dans SSE?
Réponses
Trop de publicités?Désolé de ne pas savoir d'un tutoriel.
Votre meilleur pari (à mon humble avis) est d'utiliser de l'ESS via le "intrinsèque" des fonctions Intel à envelopper (en général), seul le jeu d'instructions SSE. Ils sont mis à disposition par l'intermédiaire d'un ensemble d'inclure des fichiers nommés *mmintrin.h e.g xmmintrin.h est l'original jeu d'instructions SSE.
Commencer familier avec le contenu de l'Intel Optimisation Manuel de Référence est une bonne idée (voir la section 4.3.1.2 pour un exemple de intrinsèques) et le SIMD sections sont indispensables à la lecture. Le jeu d'instructions, les manuels de référence sont très utile, aussi, que chaque instruction de la documentation comprend les "intrinsèque" de la fonction correspondante.
Faire passer un peu de temps à l'inspection de l'assembleur produit par le compilateur à partir de intrinsèques (vous apprendrez beaucoup de choses) et sur le profilage, de mesure du rendement (vous verrez par vous éviter de perdre du temps de l'ESS-ing code pour peu de retour sur l'effort).
Mise à jour 2011-05-31: Il y a de très belle couverture de intrinsèques et la vectorisation dans Agner le Brouillard de l' optimisation des fichiers Pdf (merci), mais il est un peu répandus sur les e.g de l'article 12 de la première et de l'article 5 de la seconde). Ce ne sont pas exactement tutoriel (en fait il y a un "ces manuels ne sont pas pour les débutants" avertissement), mais ils le font à juste titre, traiter SIMD (si utilisé par l'asm, intrinsèques ou le compilateur de vectorisation) comme une partie seulement de la plus grande optimisation de la boîte à outils.
Mise à jour 2012-10-04: Un joli petit Linux Journal article sur gcc vecteur intrinsèques mérite une mention ici. Plus général que juste de l'ESS (couvre PPC et rallonges de BRAS trop). Il y a une bonne collection de références sur la dernière page, ce qui a attiré mon attention sur Intel "intrinsèques manuel".
La plupart d'optimisation simples à utiliser est de permettre la gcc à émettre de l'ESS code.
Indicateurs: -msse, -msse2, -msse3, -march=, -mfpmath=sse
Pour une liste concise sur 386 options, voir http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options plus exacte de la documentation spécifique à votre version de compilateur est là: http://gcc.gnu.org/onlinedocs/ .
Pour l'optimisation, il faut toujours vérifier Agner de la Brume: http://agner.org/optimize/ . Je pense qu'il n'ont pas ESS de tutoriels pour intrinsèques, mais il a des vraiment sympas std-c++ astuces et fournit également de nombreuses informations sur le codage de l'ESS de l'assemblée (ce qui peut souvent être transcrit à intrinsèques).
MSDN est assez bonne description de l'ESS le compilateur construit-ins (et ceux built-ins sont standard de facto, ils ont même travail dans clang/XCode).
- http://msdn.microsoft.com/en-us/library/26td21ds.aspx
- http://msdn.microsoft.com/en-us/library/kcwz153a.aspx
La bonne chose à propos de cette référence, c'est qu'il montre l'équivalent de pseudo, donc, par exemple, vous pouvez apprendre que ADDPD instruction est:
r0 := a0 + b0
r1 := a1 + b1
Et voici une bonne description d'un énigmatique shuffle instruction: http://www.songho.ca/misc/sse/sse.html