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.
insortingn.h
x86insortingn.h
arm_neon.h
mminsortingn.h
altivec.h
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.h
– pas 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.