Fichiers d'en-tête pour les architectures x86 SIMD intrinsèques
Qui fichiers d'en-tête fournir la intrinsèques pour les différents x86 jeu d'instructions SIMD extensions (MMX, SSE, AVX, ...)? Il semble impossible de trouver une telle liste en ligne. Corrigez-moi si je me trompe.
Vous devez vous connecter pour publier un commentaire.
ammintrin.h
a aussi le XOP instructions.#include <x86intrin.h>
qui tire de tout ce dont vous avez besoin.<zmmintrin.h>
directement; gcc n'a même pas le fournir. suffit d'utiliser<immintrin.h>
ou encore plus complet<x86intrin.h>
. Cette réponse est en gros obsolète, sauf si vous êtes volontairement en évitant notamment intrinsèques pour les versions plus récentes de l'ESS, car le compilateur ne se plaint pas lorsque vous utilisez un SSE4.1 l'instruction lors de la compilation pour SSE2. (gcc/clang ne se plaindre, de sorte que vous devriez utiliser immintrin.h pour eux. IDK sur les autres.)<x86intrin.h>
?<emmintrin.h>
(SSE2), bien que dans la v10.3 le intrinsèques des en-têtes sont vieux et inutilisable en raison de faire usage de la retraite Clang les builtins.Si vous utilisez seulement
il comprendra tous SSE/AVX-têtes qui sont activées selon le compilateur commutateurs comme
-march=corei7
ou tout simplement-march=native
. De plus, certains x86 instructions spécifiques commebswap
ouror
deviennent disponibles intrinsèques.<x86intrin.h>
, mais<intrin.h>
réalise un effet similaire. Vous avez encore besoin de compilation conditionnelle, bien sûr. 🙁#include <immintrin.h>
. Utilisez-le pour SIMD intrinsèques. Vous avez seulement besoin de la plus grande (et un peu plus lent à compiler)x86intrin.h
ouintrin.h
si vous avez besoin de trucs comme entier rotation / bit-numérisation intrinsèques (bien qu'Intel documents, ceux-ci étant disponibles dansimmintrin.h
dans leur intrinsèques guide).x86intrin.h
/intrin.h
mais pas dansimmintrin.h
.Le nom d'en-tête dépend du compilateur et de l'architecture cible.
intrin.h
x86intrin.h
arm_neon.h
mmintrin.h
altivec.h
spe.h
Vous pouvez gérer tous ces cas conditionnelle de prétraitement directives:
De cette page
Donc, en général, vous pouvez simplement inclure
immintrin.h
pour obtenir toutes les cartes des extensions, oux86intrin.h
si vous voulez tout, y compris_bit_scan_forward
et_rdtsc
, ainsi que tous les vecteurs intrinsèques inclure AMD-seuls. Si vous êtes contre, y compris de plus que vous avez réellement besoin, alors vous pouvez choisir le droit en regardant la table.x86intrin.h
est la méthode recommandée pour obtenir intrinsèques pour AMD XOP (Bulldozer seule, pas même les futurs Processeurs AMD), plutôt que d'avoir son propre en-tête.Certains compilateurs continue de générer des messages d'erreur si vous utilisez intrinsèques pour l'enseignement-ensembles vous n'avez pas activé (par exemple,
_mm_fmadd_ps
sans l'activation de fma, même si vous incluezimmintrin.h
et permettre AVX2).smmintrin
(SSE4.1) est Penryn (45nm Core2), pas Nehalem ("i7"). Pouvons-nous nous arrêter à l'aide de "i7" comme un nom de l'architecture? It est vide de sens maintenant que Intel a gardé l'utiliser pour la banque nationale, de la famille.Que beaucoup de réponses et de commentaires ont déclaré,
<x86intrin.h>
est la complet d'en-tête pour les architectures x86[-64] SIMD intrinsèques. Il fournit également intrinsèques soutenir les instructions pour d'autres ISA extensions.gcc
,clang
, eticc
ont tous se sont installés sur ce. J'avais besoin de faire quelques recherches sur les versions qui prennent en charge l'en-tête, et pensé qu'il pourrait être utile de faire la liste des résultats...gcc : support pour
x86intrin.h
apparaît d'abord dansgcc-4.5.0
. Legcc-4
version de la série n'est plus maintenu, tout engcc-6.x
est le actuel version stable de la série.gcc-5
a également introduit le__has_include
extension présente dans tous lesclang-3.x
versions.gcc-7
est en pre-release (tests de régression, etc.) et à la suite de l'actuel schéma de contrôle de version, sera publié en tant quegcc-7.1.0
.clang :
x86intrin.h
semble avoir été pris en charge pour tous lesclang-3.x
versions. La dernière version stable estclang (LLVM) 3.9.1
. La branche de développement estclang (LLVM) 5.0.0
. Il n'est pas clair ce qui s'est passé à la4.x
de la série.Apple clang : fâcheusement, Apple gestion des versions ne correspondent pas à celle de la
LLVM
projets. Cela dit, la version actuelle:clang-800.0.42.1
, est basé surLLVM 3.9.0
. La premièreLLVM 3.0
version semble êtreApple clang 2.1
de retour dansXcode 4.1
.LLVM 3.1
apparaît d'abord avecApple clang 3.1
(une coïncidence numérique) dansXcode 4.3.3
.Apple définit également
__apple_build_version__
par exemple,8000042
. Ce qui semble le plus stable, strictement croissant schéma de gestion des versions disponibles. Si vous ne voulez pas de support de l'héritage des compilateurs, faire un de ces valeurs une exigence minimale.Toute récente version de
clang
, y compris Apple versions, devrait donc avoir aucun problème avecx86intrin.h
. Bien sûr, avecgcc-5
, vous pouvez toujours utiliser les éléments suivants:Un truc, vous ne pouvez pas vraiment compter sur l'aide de la
__GNUC__
versions dansclang
. La gestion des versions est, pour des raisons historiques, coincé à4.2.1
. Une version qui précède lex86intrin.h
en-tête. Il est parfois utile, par exemple pour la simple C de GNU extensions qui sont restés en arrière compatible.cpi : aussi loin que je peux dire, le
x86intrin.h
en-tête est prise en charge depuis au moins Intel C++ 16.0. La version d'essai peuvent par réalisé avec:#if (__INTEL_COMPILER >= 1600)
. Cette version (et versions antérieures) fournit également un soutien pour la__has_include
extension.MSVC : Il semble que
MSVC++ 12.0 (Visual Studio 2013)
est la première version de laintrin.h
tête de pasx86intrin.h
... ceci suggère:#if (_MSC_VER >= 1800)
comme une version de test. Bien sûr, si vous essayez d'écrire du code portable à travers tous ces différents compilateurs, le nom d'en-tête sur cette plate-forme sera le moindre de vos problèmes.