Fichiers d’en-tête pour insortingnsèques SIMD x86

Quels fichiers d’en-tête fournissent les éléments insortingnsèques pour les différentes extensions de jeu d’instructions SIMD x86 (MMX, SSE, AVX, …)? Il semble impossible de trouver une telle liste en ligne. Corrige moi si je me trompe.

 MMX  SSE  SSE2  SSE3  SSSE3  SSE4.1  SSE4.2  SSE4A  AES  AVX  AVX512 

Si vous utilisez juste

 #include  

il inclura tous les en-têtes SSE / AVX activés en fonction des -march=corei7 compilateur telles que -march=corei7 ou juste -march=native . De plus, certaines instructions spécifiques à x86 telles que bswap ou ror deviennent disponibles en tant qu’insortingnsèques.

Le nom de l’en-tête dépend de votre compilateur et de votre architecture cible.

  • Pour Microsoft C ++ (ciblant x86, x86-64 ou ARM) et Intel C / C ++ Comstackr pour Windows, utilisez insortingn.h
  • Pour le ciblage gcc / clang / icc x86 / x86-64, utilisez x86insortingn.h
  • Pour gcc / clang / armcc ciblant ARM avec NEON, utilisez arm_neon.h
  • Pour gcc / clang / armcc ciblant ARM avec WMMX, utilisez mminsortingn.h
  • Pour gcc / clang / xlcc ciblant PowerPC avec VMX (alias Altivec) et / ou VSX, utilisez altivec.h
  • Pour le ciblage gcc / clang PowerPC avec SPE, utilisez spe.h

Vous pouvez gérer tous ces cas avec des directives de prétraitement conditionnelles:

 #if defined(_MSC_VER) /* Microsoft C/C++-compatible comstackr */ #include  #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) /* GCC-compatible comstackr, targeting x86/x86-64 */ #include  #elif defined(__GNUC__) && defined(__ARM_NEON__) /* GCC-compatible comstackr, targeting ARM with NEON */ #include  #elif defined(__GNUC__) && defined(__IWMMXT__) /* GCC-compatible comstackr, targeting ARM with WMMX */ #include  #elif (defined(__GNUC__) || defined(__xlC__)) && (defined(__VEC__) || defined(__ALTIVEC__)) /* XLC or GCC-compatible comstackr, targeting PowerPC with VMX/VSX */ #include  #elif defined(__GNUC__) && defined(__SPE__) /* GCC-compatible comstackr, targeting PowerPC with SPE */ #include  #endif 

De cette page

 +----------------+------------------------------------------------------------------------------------------+ | Header | Purpose | +----------------+------------------------------------------------------------------------------------------+ | x86insortingn.h | Everything, including non-vector x86 instructions like _rdtsc(). | | mminsortingn.h | MMX (Pentium MMX!) | | mm3dnow.h | 3dnow! (K6-2) (deprecated) | | xmminsortingn.h | SSE + MMX (Pentium 3, Athlon XP) | | emminsortingn.h | SSE2 + SSE + MMX (Pentium 4, Athlon 64) | | pmminsortingn.h | SSE3 + SSE2 + SSE + MMX (Pentium 4 Prescott, Athlon 64 San Diego) | | tmminsortingn.h | SSSE3 + SSE3 + SSE2 + SSE + MMX (Core 2, Bulldozer) | | popcntinsortingn.h | POPCNT (Nehalem (Core i7), Phenom) | | amminsortingn.h | SSE4A + SSE3 + SSE2 + SSE + MMX (AMD-only, starting with Phenom) | | smminsortingn.h | SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Penryn, Bulldozer) | | nmminsortingn.h | SSE4_2 + SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Nehalem (aka Core i7), Bulldozer) | | wmminsortingn.h | AES (Core i7 Westmere, Bulldozer) | | imminsortingn.h | AVX, AVX2, AVX512, all SSE+MMX (except SSE4A and XOP), popcnt, BMI/BMI2, FMA | +----------------+------------------------------------------------------------------------------------------+ 

Donc, en général, vous pouvez simplement inclure imminsortingn.h pour obtenir toutes les extensions Intel, ou x86insortingn.h si vous voulez tout, y compris _bit_scan_forward et _rdtsc , et toutes les _rdtsc insortingnsèques de vecteurs incluent celles d’AMD. Si vous êtes contre l’inclusion de plus que vous avez réellement besoin, alors vous pouvez choisir la bonne inclusion en regardant la table.

x86insortingn.h est la méthode recommandée pour obtenir des éléments insortingnsèques pour AMD XOP (uniquement pour les bulldozers, pas pour les futurs processeurs AMD) , plutôt que d’avoir son propre en-tête.

Certains compilateurs généreront toujours des messages d’erreur si vous utilisez des parameters insortingnsèques pour des ensembles d’instructions que vous n’avez pas activés (par exemple, _mm_fmadd_ps sans activer fma, même si vous incluez imminsortingn.h et activez AVX2).

Comme beaucoup de réponses et de commentaires l’ont indiqué, est l’ en-tête complet pour les éléments insortingnsèques SIMD x86 [-64]. Il fournit également des instructions de support insortingnsèques pour les autres extensions ISA. gcc , clang et icc sont tous mis d’ clang dessus. J’avais besoin de faire quelques recherches sur les versions qui prennent en charge l’en-tête, et j’ai pensé qu’il serait utile de répertorier quelques résultats …

  • gcc : le support de x86insortingn.h apparaît d’abord dans gcc-4.5.0 . La série de versions de gcc-4 n’est plus maintenue, tandis que gcc-6.x est la série stable actuelle . gcc-5 également introduit l’extension __has_include présente dans toutes les clang-3.x . gcc-7 est en pré-version (test de régression, etc.) et suivant le schéma de version actuel, sera publié sous le nom de gcc-7.1.0 .

  • clang : x86insortingn.h semble avoir été supporté pour toutes les clang-3.x . La dernière version stable est clang (LLVM) 3.9.1 . La twig de développement est clang (LLVM) 5.0.0 . Ce qui est arrivé à la série 4.x n’est pas clair.

  • Apple clang : de manière agaçante, le versioning d’Apple ne correspond pas à celui des projets LLVM . Cela dit, la version actuelle: clang-800.0.42.1 , est basée sur LLVM 3.9.0 . La première version basée sur LLVM 3.0 semble être la Apple clang 2.1 dans Xcode 4.1 . LLVM 3.1 apparaît d’abord avec Apple clang 3.1 (une coïncidence numérique) dans Xcode 4.3.3 .

    Apple définit également __apple_build_version__ par exemple 8000042 . Cela semble être le système de gestion de versions le plus stable et le plus ascendant disponible. Si vous ne souhaitez pas prendre en charge les compilateurs existants, définissez l’une de ces valeurs comme une exigence minimale.

Toute version récente de clang , y compris les versions d’Apple, ne devrait donc pas x86insortingn.h problème avec x86insortingn.h . Bien sûr, avec gcc-5 , vous pouvez toujours utiliser les éléments suivants:

 #if defined (__has_include) && (__has_include()) #include  #else #error "upgrade your comstackr. it's free..." #endif 

Un truc sur __GNUC__ vous ne pouvez pas vraiment compter consiste à utiliser les versions clang dans clang . Le versionnage est, pour des raisons historiques, bloqué à 4.2.1 . Une version qui précède l’en x86insortingn.h tête x86insortingn.h . Il est parfois utile, par exemple, de simples extensions GNU C restées compatibles.

  • icc : pour autant que je x86insortingn.h , l’en x86insortingn.h tête x86insortingn.h est pris en charge depuis au moins Intel C ++ 16.0. Le test de version peut être effectué avec: #if (__INTEL_COMPILER >= 1600) . Cette version (et éventuellement les versions antérieures) prend également en charge l’extension __has_include .

  • MSVC : Il semble que MSVC++ 12.0 (Visual Studio 2013) est la première version à fournir l’en insortingn.h tête insortingn.hpas x86insortingn.h … cela suggère: #if (_MSC_VER >= 1800) comme test de version. Bien sûr, si vous essayez d’écrire du code portable sur tous ces différents compilateurs, le nom de l’en-tête sur cette plate-forme sera le moindre de vos problèmes.