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ę.
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
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.
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
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).
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 wgcc-4.5.0
. Thegcc-4
release seria nie jest już utrzymywana, podczas gdygcc-6.x
jest bieżącą stabilną serią wydań.gcc-5
wprowadzono również rozszerzenie__has_include
obecne we wszystkich wydaniachclang-3.x
.gcc-7
jest w pre-release (testowanie regresji, itp.)i zgodnie z obecnym schematem wersjonowania, zostanie wydany jakogcc-7.1.0
.Clang :
x86intrin.h
wydaje się, że był obsługiwany przez wszystkie wydaniaclang-3.x
. Najnowszym stabilnym wydaniem jestclang (LLVM) 3.9.1
. Gałęzią rozwoju jestclang (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ę naLLVM 3.9.0
. PierwszaLLVM 3.0
wersja bazowa wydaje się byćApple clang 2.1
z powrotem wXcode 4.1
.LLVM 3.1
po raz pierwszy pojawia się zApple clang 3.1
(zbieżność liczbowa) wXcode 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łówekintrin.h
- Niex86intrin.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.
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