5 ответов:
<mmintrin.h> MMX <xmmintrin.h> SSE <emmintrin.h> SSE2 <pmmintrin.h> SSE3 <tmmintrin.h> SSSE3 <smmintrin.h> SSE4.1 <nmmintrin.h> SSE4.2 <ammintrin.h> SSE4A <wmmintrin.h> AES <immintrin.h> AVX <zmmintrin.h> AVX512
если вы используете только
#include <x86intrin.h>он будет включать все заголовки SSE / AVX, которые включены в соответствии с переключателями компилятора, такими как
-march=corei7или просто-march=native. Кроме того, некоторые x86 конкретные инструкции, такие какbswapилиrorстановятся доступными в качестве встроенных.
название заголовка зависит от вашего компилятора и целевой архитектуры.
- для Microsoft C++ (таргетинг x86, x86-64 или ARM) и компилятора Intel C/C++ для Windows используйте
intrin.h- для GCC/clang / icc таргетинга x86 / x86-64 используйте
x86intrin.h- для GCC/clang / armcc пристреливая рукоятку с неоновой пользой
arm_neon.h- для GCC/clang / armcc пристреливая рукоятку с пользой WMMX
mmintrin.h- для GCC/clang / xlcc таргетинг PowerPC с VMX (ака Altivec) и / или VSX использовать
altivec.h- для GCC / clang таргетинга PowerPC с использованием SPE
spe.hвы можете обрабатывать все эти случаи с помощью условных директив предварительной обработки:
#if defined(_MSC_VER) /* Microsoft C/C++-compatible compiler */ #include <intrin.h> #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) /* GCC-compatible compiler, targeting x86/x86-64 */ #include <x86intrin.h> #elif defined(__GNUC__) && defined(__ARM_NEON__) /* GCC-compatible compiler, targeting ARM with NEON */ #include <arm_neon.h> #elif defined(__GNUC__) && defined(__IWMMXT__) /* GCC-compatible compiler, targeting ARM with WMMX */ #include <mmintrin.h> #elif (defined(__GNUC__) || defined(__xlC__)) && (defined(__VEC__) || defined(__ALTIVEC__)) /* XLC or GCC-compatible compiler, targeting PowerPC with VMX/VSX */ #include <altivec.h> #elif defined(__GNUC__) && defined(__SPE__) /* GCC-compatible compiler, targeting PowerPC with SPE */ #include <spe.h> #endif
отсюда страница
+----------------+------------------------------------------------------------------------------------------+ | Header | Purpose | +----------------+------------------------------------------------------------------------------------------+ | x86intrin.h | Everything, including non-vector x86 instructions like _rdtsc(). | | mmintrin.h | MMX (Pentium MMX!) | | mm3dnow.h | 3dnow! (K6-2) (deprecated) | | xmmintrin.h | SSE + MMX (Pentium 3, Athlon XP) | | emmintrin.h | SSE2 + SSE + MMX (Pentium 4, Athlon 64) | | pmmintrin.h | SSE3 + SSE2 + SSE + MMX (Pentium 4 Prescott, Athlon 64 San Diego) | | tmmintrin.h | SSSE3 + SSE3 + SSE2 + SSE + MMX (Core 2, Bulldozer) | | popcntintrin.h | POPCNT (Nehalem (Core i7), Phenom) | | ammintrin.h | SSE4A + SSE3 + SSE2 + SSE + MMX (AMD-only, starting with Phenom) | | smmintrin.h | SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Penryn, Bulldozer) | | nmmintrin.h | SSE4_2 + SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Nehalem (aka Core i7), Bulldozer) | | wmmintrin.h | AES (Core i7 Westmere, Bulldozer) | | immintrin.h | AVX, AVX2, AVX512, all SSE+MMX (except SSE4A and XOP), popcnt, BMI/BMI2, FMA | +----------------+------------------------------------------------------------------------------------------+так что в целом вы можете просто включить
immintrin.hчтобы получить все расширения Intel, илиx86intrin.hЕсли вы хотите, чтобы все, в том числе_bit_scan_forwardи_rdtsc, а также все векторные встроенные функции включают только AMD. Если вы против включения больше, что вам на самом деле нужно, то вы можете выбрать правильный включить, глядя на таблицу.
x86intrin.hрекомендуемый способ получить встроенные функции для AMD XOP (только бульдозер, даже не будущие процессоры AMD), а не иметь свой собственный заголовок.некоторые компиляторы по-прежнему будут генерировать сообщения об ошибках, если вы используете встроенные функции для наборов инструкций, которые вы не включили (например,
_mm_fmadd_psбез включения fma, даже если вы включаетеimmintrin.hи включить AVX2).
как многие из ответов и комментариев заявили,
<x86intrin.h>и the полный заголовок для x86 [-64] SIMD встроенных. Он также предоставляет встроенные инструкции поддержки для других расширений ISA.gcc,clangиiccна этом все и остановились. Мне нужно покопаться в версиях, которые поддерживают заголовок, и подумал, что было бы полезно перечислить некоторые выводы...
gcc : поддержка
x86intrin.hвпервые появляется вgcc-4.5.0. Элементgcc-4серии релиз больше не поддерживается, в то время какgcc-6.x- это настоящее стабильный выпуск серии.gcc-5также представил - неx86intrin.h... это предполагает:#if (_MSC_VER >= 1800)как тест версии. Конечно, если вы пытаетесь написать код, который переносится через все эти разные составители, название заголовка на этой платформе будет наименьшей из ваших проблем.
Comments