Заголовочные файлы для встроенных SIMD x86



какие заголовочные файлы обеспечивают встроенные функции для различных расширений набора инструкций x86 SIMD (MMX, SSE, AVX,...)? Кажется, невозможно найти такой список в интернете. Поправьте меня, если я ошибаюсь.

909   5  

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

    Ничего не найдено.