web-dev-qa-db-fra.com

SSE SSE2 et SSE3 pour GNU C ++

Existe-t-il un tutoriel simple pour me mettre à jour dans SSE, SSE2 et SSE3 dans GNU C++? Comment pouvez-vous faire l'optimisation de code dans SSE?

54
yoitsfrancis

Désolé je ne connais pas de tutoriel.

Votre meilleur pari (à mon humble avis) est d'utiliser SSE via les fonctions "intrinsèques" fournies par Intel pour encapsuler (généralement) les instructions SSE. SSE $ ===. Ces informations sont disponibles via un ensemble de fichiers d'inclusion nommé * mmintrin.h, par exemple xmmintrin.h est le jeu d'instructions original SSE.

Commencez à vous familiariser avec le contenu de l'optimisation d'Intel Manuel de référence est une bonne idée (voir la section 4.3.1.2 pour un exemple d'intrinsèques) et les sections SIMD sont une lecture essentielle. Les manuels de référence du jeu d'instructions sont également très utiles, car la documentation de chaque instruction comprend la fonction "intrinsèque" à laquelle elle correspond.

Do passez un peu de temps à inspecter l'assembleur produit par le compilateur à partir d'intrinsèques (vous en apprendrez beaucoup) et sur le profilage/la mesure des performances (vous éviterez de perdre du temps en code SSE pour peu de retour) sur l'effort).

Mise à jour 2011-05-31: Il y a une très belle couverture de l'intrinsèque et de la vectorisation dans Agner Fog's PDF d'optimisation (- merci ) bien que ce soit un peu étalé (par exemple la section 12 du premier et la section 5 du deuxième ). Ce ne sont pas exactement des didacticiels (en fait, il y a un avertissement "ces manuels ne sont pas pour les débutants") mais ils traitent à juste titre SIMD (qu'ils soient utilisés via asm, intrinsèques ou vectorisation du compilateur) comme une partie de la plus grande boîte à outils d'optimisation.

Mise à jour 2012-10-04: A Joli petit article du Linux Journal sur les intrinsèques du vecteur gcc mérite une mention ici. Plus général que juste SSE (couvre PPC et ARM extensions aussi). Il y a une bonne collection de références sur le - dernière page , qui a attiré mon attention sur Intel "manuel intrinsèque" .

59
timday

L'optimisation la plus simple à utiliser est de permettre à gcc d'émettre SSE code.

Indicateurs: -msse, -msse2, -msse3, -march =, -mfpmath = sse

Pour une liste plus concise des 386 options, voir http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64- Options , une documentation plus exacte pour votre version de compilateur spécifique est disponible: http://gcc.gnu.org/onlinedocs/ .

Pour l'optimisation, consultez toujours Agner Fog: http://agner.org/optimize/ . Je pense qu'il n'a pas SSE tutoriels pour intrinsèques, mais il a des astuces std-c ++ vraiment soignées et fournit également beaucoup d'informations sur le codage SSE Assembly (qui peut souvent être transcrit en intrinsèque).

20
Sebastian Mach

Découvrez les options -mtune et -march, -msse * et -mfpmath bien sûr. Tous ces éléments permettent à GCC d'effectuer des optimisations spécifiques à SSE.

Au-delà de cela, c'est le domaine de l'assembleur, je le crains.

Manuel en ligne GCC - Options i386 et x86_64

8
DevSolar

MSDN a une assez bonne description de SSE prédéfinis du compilateur (et ces prédéfinis sont de facto standard, ils fonctionnent même dans clang/XCode).

La bonne chose à propos de cette référence est qu'elle montre un pseudocode équivalent, donc par ex. vous pouvez apprendre que l'instruction ADDPD est:

r0 := a0 + b0
r1 := a1 + b1

Et voici une bonne description d'une instruction de mélange aléatoire: http://www.songho.ca/misc/sse/sse.html

3
Kornel

Un tutoriel simple? Pas que je sache de.

Mais toute information sur l'utilisation de MMX ou d'une version de SSE sera utile pour l'apprentissage, que ce soit pour GCC ou pour ICC ou VC.

Pour en savoir plus sur les extensions vectorielles de GCC, tapez "info gcc" et accédez à Node: Vector Extensions.

1
Zan Lynx