Pliki nagłówkowe dla x86 SIMD

Które pliki nagłówkowe zapewniają wewnętrzne elementy dla różnych rozszerzeń zestawów instrukcji x86 SIMD (MMX, SSE, AVX, ...)? Wydaje się niemożliwe, aby znaleźć taką listę w Internecie. Popraw mnie, jeśli się mylę.

Author: plasmacel, 2012-06-27

5 answers

<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
 139
Author: fredoverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 00:01:58

Jeśli używasz tylko

#include <x86intrin.h>

Będzie zawierać wszystkie nagłówki SSE / AVX, które są włączone zgodnie z przełącznikami kompilatora, takimi jak -march=corei7 lub po prostu -march=native. Dodatkowo niektóre instrukcje specyficzne dla x86, takie jak bswap lub ror, stają się dostępne jako wewnętrzne.

 66
Author: Gunther Piez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-27 15:59:30

Nazwa nagłówka zależy od kompilatora i architektury docelowej.

  • dla Microsoft C++ (x86, x86-64 lub ARM) i kompilatora Intel C/C++ Dla Windows intrin.h
  • do celowania gcc/clang/icc x86/x86-64 użyj x86intrin.h
  • do ramienia celującego gcc / clang / armcc z użyciem neonu arm_neon.h
  • dla ramienia celującego gcc / clang / armcc z użyciem WMMX mmintrin.h
  • W przeciwieństwie do VSX, PowerPC może być używany w wielu aplikacjach, takich jak VMX, Clang, Xlcc i VSX.]}
  • dla gcc / clang targeting PowerPC with spe use spe.h

Możesz obsłużyć wszystkie te przypadki za pomocą dyrektyw preprocesora warunkowego:

#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
 47
Author: Marat Dukhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 16:48:19

Z tej Strony

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

Więc ogólnie można po prostu dołączyć immintrin.h, Aby uzyskać wszystkie rozszerzenia Intela, lub x86intrin.h, jeśli chcesz wszystko, w tym _bit_scan_forward i _rdtsc, a także wszystkie wewnętrzne elementy vector obejmują tylko AMD. Jeśli jesteś przeciwko tym więcej, że rzeczywiście trzeba następnie można wybrać prawo obejmują patrząc na tabeli.

x86intrin.h jest zalecanym sposobem na uzyskanie intrinsików dla AMD XOP (tylko Bulldozer, nawet przyszłych procesorów AMD) , raczej niż posiadanie własnego nagłówka.

Niektóre Kompilatory nadal będą generować komunikaty o błędach, jeśli używasz intrinsics dla zestawów instrukcji, które nie zostały włączone(np. _mm_fmadd_ps bez włączania fma, nawet jeśli włączysz immintrin.h i włączysz AVX2).

 32
Author: ecerulm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 20:53:16

Jak wiele odpowiedzi i komentarzy stwierdziło, <x86intrin.h> jest obszernym nagłówkiem dla x86 [-64] SIMD. Zawiera również wewnętrzne instrukcje wspierające inne rozszerzenia ISA. gcc, clang, i icc wszyscy się z tym rozstrzygnęli. Musiałem trochę poszperać nad wersjami, które obsługują nagłówek, i pomyślałem, że przydałoby się wymienić pewne ustalenia...

  • Gcc : wsparcie dla x86intrin.h pojawia się po raz pierwszy w gcc-4.5.0. The gcc-4 release seria nie jest już utrzymywana, podczas gdy gcc-6.x jest bieżącą stabilną serią wydań. gcc-5 wprowadzono również rozszerzenie __has_include obecne we wszystkich wydaniach clang-3.x. gcc-7 jest w pre-release (testowanie regresji, itp.)i zgodnie z obecnym schematem wersjonowania, zostanie wydany jako gcc-7.1.0.

  • Clang : x86intrin.h wydaje się, że był obsługiwany przez wszystkie wydania clang-3.x. Najnowszym stabilnym wydaniem jest clang (LLVM) 3.9.1. Gałęzią rozwoju jest clang (LLVM) 5.0.0. Nie jest wyjaśnij, co się stało z serią 4.x.

  • Apple clang: irytujące, wersjonowanie Apple nie odpowiada projektom LLVM. To powiedziawszy, obecne wydanie: clang-800.0.42.1, opiera się na LLVM 3.9.0. Pierwsza LLVM 3.0 wersja bazowa wydaje się być Apple clang 2.1 z powrotem w Xcode 4.1. LLVM 3.1 po raz pierwszy pojawia się z Apple clang 3.1 (zbieżność liczbowa) w Xcode 4.3.3.

    Apple definiuje również __apple_build_version__, np. 8000042. To wydaje się najbardziej stabilny, ściśle rosnący dostępny schemat wersjonowania. Jeśli nie chcesz obsługiwać starszych kompilatorów, ustaw jedną z tych wartości jako minimalne wymagania.

Każda najnowsza wersja clang, w tym wersje Apple, nie powinna więc mieć problemu z x86intrin.h. Oczywiście, wraz z gcc-5, zawsze możesz użyć następującego:

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

Jedna sztuczka, na której nie możesz polegać, to użycie __GNUC__ wersji w clang. Wersja jest, ze względów historycznych, zablokowana na 4.2.1. Wersja, która poprzedza nagłówek x86intrin.h. Czasami jest to przydatne dla, powiedzmy, prostych rozszerzeń GNU C, które pozostały kompatybilne wstecz.

  • Icc: Z tego co wiem, nagłówek x86intrin.h jest obsługiwany od co najmniej Intel C++ 16.0. Test wersji można wykonać za pomocą: #if (__INTEL_COMPILER >= 1600). Ta wersja (i ewentualnie wcześniejsze wersje) zapewnia również wsparcie dla rozszerzenia __has_include.

  • MSVC : wygląda na to, że MSVC++ 12.0 (Visual Studio 2013) jest pierwszym wersja dostarczająca nagłówek intrin.h - Nie x86intrin.h... to sugeruje: #if (_MSC_VER >= 1800) jako test wersji. Oczywiście, jeśli próbujesz napisać kod, który jest przenośny dla wszystkich tych różnych kompilatorów, nazwa nagłówka na tej platformie będzie najmniejszym z twoich problemów.

 8
Author: Brett Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 16:08:43