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

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

Ответы на вопрос(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
 29 июн. 2016 г., 00:31
Не включать<zmmintrin.h> непосредственно; GCC даже не предоставляет его.Just use <immintrin.h> или даже более полный<x86intrin.h>, Этот ответ в основном устарел, если вы не намеренно избегаете включения встроенных функций для более новых версий SSE, поскольку ваш компилятор не жалуется, когда вы используете инструкцию SSE4.1 при компиляции для SSE2. (GCC / лязгdo пожаловаться, так что вы должны просто использовать immintrin.h для них. ИДК о других.)
 27 июн. 2012 г., 17:19
Или ты можешь просто#include <x86intrin.h> который тянет во всем, что вам нужно.
 29 окт. 2014 г., 17:01
zmmintrin.h имеет встроенную функцию AVX-512.
 08 июн. 2015 г., 01:11
@ L & # x1B0; uV & # x129; nhPh & # xFA; c SSE3 = новые инструкции Prescott, SSSE3 = новые инструкции Tejas. Я думаю, что SSE4.2 и AES относятся к семейству процессоров, на котором они были представлены (Nehalem и Westmere)
 16 янв. 2015 г., 18:48
Почему p, t, s и n для SSE3 / SSSE3 / SSE4.1 и 4.2? Что представляют эти персонажи?

Как многие из ответов и комментариев заявили,<x86intrin.h> являетсяthe всеобъемлющий заголовок для встроенных функций x86 [-64] SIMD. Он также предоставляет встроенные инструкции поддержки для других расширений ISA.gcc, clang, а такжеicc все остановились на этом. Мне нужно было покопаться в версиях, которые поддерживают заголовок, и подумал, что было бы полезно перечислить некоторые выводы ...

gcc : support for x86intrin.h first appears in gcc-4.5.0. The gcc-4 release series is no longer being maintained, while gcc-6.x is the current stable release series. gcc-5 also introduced the __has_include extension present in all clang-3.x releases. gcc-7 is in pre-release (regression testing, etc.) and following the current versioning scheme, will be released as gcc-7.1.0.

clang : x86intrin.h appears to have been supported for all clang-3.x releases. The latest stable release is clang (LLVM) 3.9.1. The development branch is clang (LLVM) 5.0.0. It's not clear what's happened to the 4.x series.

Apple clang : annoyingly, Apple's versioning doesn't correspond with that of the LLVM projects. That said, the current release: clang-800.0.42.1, is based on LLVM 3.9.0. The first LLVM 3.0 based version appears to be Apple clang 2.1 back in Xcode 4.1. LLVM 3.1 first appears with Apple clang 3.1 (a numeric coincidence) in Xcode 4.3.3.

Apple also defines __apple_build_version__ e.g., 8000042. This seems about the most stable, strictly ascending versioning scheme available. If you don't want to support legacy compilers, make one of these values a minimum requirement.

Любая недавняя версияclang, в том числе версии Apple, поэтому не должно иметь проблем сx86intrin.h, Конечно, наряду сgcc-5, вы всегда можете использовать следующее:

#if defined (__has_include) && (__has_include(<x86intrin.h>))
#include <x86intrin.h>
#else
#error "upgrade your compiler. it's free..."
#endif

Один трюк, на который вы действительно не можете положиться, - это использование__GNUC__ версии вclang, Версионирование по историческим причинам застряло в4.2.1, Версия, предшествующаяx86intrin.h заголовок. Это иногда полезно, скажем, для простых расширений GNU C, которые остались обратно совместимыми.

icc : as far as I can tell, the x86intrin.h header is supported since at least Intel C++ 16.0. The version test can by performed with: #if (__INTEL_COMPILER >= 1600). This version (and possibly earlier versions) also provides support for the __has_include extension.

MSVC : It appears that MSVC++ 12.0 (Visual Studio 2013) is the first version to provide the intrin.h header - not x86intrin.h... this suggests: #if (_MSC_VER >= 1800) as a version test. Of course, if you're trying to write code that's portable across all these different compilers, the header name on this platform will be the least of your problems.

Из этогостраница

+----------------+------------------------------------------------------------------------------------------+
|     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).

 03 июн. 2016 г., 22:05
smmintrin (SSE4.1) - это Penryn (45-нм Core2), а не Nehalem («i7»). Можем ли мы прекратить использовать «i7»? как имя архитектуры?It's meaningless now that Intel has kept using it for SnB-family.

Имя заголовка зависит от вашего компилятора и целевой архитектуры.

For Microsoft C++ (targeting x86, x86-64 or ARM) and Intel C/C++ Compiler for Windows use intrin.h For gcc/clang/icc targeting x86/x86-64 use x86intrin.h For gcc/clang/armcc targeting ARM with NEON use arm_neon.h For gcc/clang/armcc targeting ARM with WMMX use mmintrin.h For gcc/clang/xlcc targeting PowerPC with VMX (aka Altivec) and/or VSX use altivec.h For gcc/clang targeting PowerPC with SPE use 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
 29 окт. 2014 г., 16:37
Вот еще что добавить в ваш список: На UltraSPARC + VIS с gcc используйте visintrin.h; если у вас есть VSDK от Sun, vis.h предлагает другой набор встроенных функций. Документация может быть найдена здесь:GCC VIS builtins, Sun VIS user's guide.

Если вы используете только

#include <x86intrin.h>

он будет включать все заголовки SSE / AVX, которые включены в соответствии с переключателями компилятора, такими как-march=corei7 или просто-march=native, Кроме того, некоторые конкретные инструкции для x86, такие какbswap или жеror становятся доступными как встроенные.

 27 июн. 2012 г., 18:04
Я не был уверен, что если новые версии могут ... Во всяком случае, если они есть у gcc, icc и clang, я думаю, что это нормально для использования :-)
 01 июн. 2014 г., 15:21
MSVC не имеет<x86intrin.h>, но<intrin.h> достигается аналогичный эффект. Конечно, вам все еще нужна условная компиляция. :-(
 27 июн. 2012 г., 18:02
+1, я также отмечу, что Visual C ++ не имеет этого заголовка.
 16 апр. 2018 г., 00:15
IIRC, есть некоторые не-SIMD встроенные функции, которые Intel документирует как находящиеся в immintrin.h, но которые gcc, clang и / или MSVC имеют толькоx86intrin.h / intrin.h ноnot вimmintrin.h.
 16 апр. 2018 г., 00:13
Все основные компиляторы x86 имеют#include <immintrin.h>, Используйте это для внутренних SIMD. Вам нужен только еще больший (и немного медленнее компилятор)x86intrin.h или жеintrin.h если вам нужны такие вещи, как встроенные функции целочисленного вращения / битового сканирования (хотя Intel документирует некоторые из них как доступные вimmintrin.h in their intrinsics guide).

Ваш ответ на вопрос