さまざまな x86 SIMD 命令セット拡張機能 (MMX、SSE、AVX など) の組み込み関数を提供するヘッダー ファイルはどれですか? そのようなリストをオンラインで見つけるのは不可能のようです。私が間違っている場合は修正してください。
5 に答える
最近では、通常は<immintrin.h>
. それはすべてを含みます。
GCC と clang は、コンパイル時に有効にしていない命令 (たとえば、-march=native
orなど) に対して組み込み関数を使用することを防ぎます-mavx2 -mbmi2 -mpopcnt -mfma -mcx16 -mtune=znver1
。
MSVC と ICC では、コンパイル時に何も有効にせずに組み込み関数を使用できますが、AVX 組み込み関数を使用する前に AVX を有効にする必要があります。
歴史的に (immintrin.h
すべてを取り込む前に)、必要な組み込み関数の最高レベルのヘッダーを手動で含める必要がありました。
これは、MSVC と ICC で不要な命令セットを使用しないようにするのに役立つ場合があります。
<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, AVX2, FMA
以前のものすべてにこれらのプルの 1 つを含めます (AMD のみの SSE4A を除く:immintrin.h
プルしません) 。
一部のコンパイラには<zmmintrin.h>
、AVX512 用もあります。
GCC/clang では、単に使用する場合
#include <x86intrin.h>
-march=haswell
またはのようなコンパイラスイッチに従って有効になるすべての SSE/AVX ヘッダーが含まれます-march=native
。さらに、一部の x86 固有の命令は組み込み関数として使用できるようになりbswap
ますror
。
このヘッダーに相当する MSVC<intrin.h>
ポータブル SIMD だけが必要な場合は、#include <immintrin.h>
MSVC、ICC、および gcc/clang (および Sun のような他のコンパイラー) はすべて、Intel の唯一の組み込み関数ファインダー/検索ツールによって文書化された SIMD 組み込み関数のこのヘッダーをサポートしています: https://software.intel.com/sites/landingpage/IntrinsicsGuide /
このページから
+----------------+------------------------------------------------------------------------------------------+
| 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
を含むすべてが必要な場合は、すべてのベクトル組み込み関数に AMD のみの組み込み関数が含まれます。実際に必要なものをさらに含めることに反対する場合は、表を見て適切なインクルードを選択できます。_bit_scan_forward
_rdtsc
x86intrin.h
独自のヘッダーを持つのではなく、AMD XOP (ブルドーザーのみ、将来の AMD CPU でさえも) の組み込み関数を取得するための推奨される方法です。
一部のコンパイラは、有効にしていない命令セットに組み込み関数を使用すると、エラー メッセージを生成します (たとえば、AVX2_mm_fmadd_ps
を含めて有効にしても、fma を有効にしない場合)。immintrin.h