インテル® C++ コンパイラー 15.0 ユーザー・リファレンス・ガイド
インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) 命令の組込み関数は、インテル® AVX とインテル® AVX2 の 256 ビット SIMD 命令のほとんどを 512 ビットの数値処理に対応するように拡張します。
インテル® AVX-512 命令のプログラミング・モデルは、インテル® AVX2 命令と同じです。ブロードキャストの拡張、組込みマスクによる予測、組込みの浮動小数点丸め制御、組込みの浮動小数点フォルトの抑止、分散 (Scatter) 命令、高速な算術命令、大きな変位値の簡易表現を提供します。インテル® SSE とインテル® AVX の混在使用ではパフォーマンス・ペナルティーが発生しますが、インテル® AVX とインテル® AVX-512 命令を混在させてもペナルティーは発生しません。
インテル® AVX-512 組込み関数は、32nm テクノロジーの IA-32 およびインテル® 64 アーキテクチャーでサポートされ、インテル® AVX-512 の新しい命令およびその他の 128 ビット/256 ビットの SIMD 拡張命令に直接対応付けられます。
512 ビットのレジスターステートは、45nm テクノロジーのインテル® 64 プロセッサーで追加された XSAVE/XRSTOR/XSAVEOPT 命令を使用してオペレーティング・システムにより管理されます (詳細は、『Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2B』 (英語) と『Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A』 (英語) を参照してください)。
インテル® SSE レジスターからインテル® AVX レジスターへのマップと同様に、インテル® AVX レジスター YMM0 ~ YMM15 は、インテル® AVX-512 レジスター ZMM0 ~ ZMM15 にマップされます。 インテル® AVX-512 対応プロセッサーで、インテル® AVX およびインテル® AVX2 命令は、最初の 16 個の ZMM レジスターの下位 128 ビットまたは下位 256 ビットを操作します。
新しいエンコード・プリフィクス (EVEX) は、最大 512 ビットのベクトルをサポートします。EVEX プリフィクスは VEX プリフィクスをベースにしており、VEX エンコードで利用可能な機能を簡単かつ効率良くエンコードする一方で、ベクトル機能を拡張します。
インテル® AVX-512 組込み関数は、3 つの C データ型をオペランドとして使用します。3 つのデータ型は、組込み関数に対するオペランドとして使用される新しいレジスターを表しています。__m512、__m512d、__m512i のデータ型があります。 __m512 データ型は、インテル® AVX-512 組込み関数で使用される拡張 SSE レジスター (ZMM レジスター) の内容を表します。 __m512 データ型は、16 個の 32 ビット倍精度浮動小数点値を保持できます。 __m512d データ型は、8 個の 64 ビット倍精度浮動小数点値を保持できます。 __m512i データ型は、64 個の 8 ビット整数値、32 個の 16 ビット整数値、16 個の 32 ビット整数値、または 8 個の 64 ビット整数値を保持できます。
コンパイラーは、__m512、__m512d、および __m512i 型のローカルデータとグローバルデータのアライメントを、スタック上の 64 バイト境界に合わせます。 integer 型、float 型、または double 型の配列のアライメントを合わせるには、__declspec(align) 文を使用します。
インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) 組込み関数のプロトタイプは、zmmintrin.h ヘッダーファイルで定義されていますが、 実際にヘッダーをコードにインクルードする場合は、immintrin.h を使用します。
インテル® AVX-512 組込み関数には、__m128、__m128i、__m128d、__m256、__m256i、__m256d、__m512、__m512i、および __m512d データ型を使用するバージョンがあります。
ほとんどのインテル® AVX-512 の組込み関数名は、次の表記規則に従います。
_mm512_<intrin_op>_<suffix>(<data type> <parameter1>, <data type> <parameter2>, <data type> <parameter3>)
次の表は、構文の各項目について説明したものです。
_mm512 | プリフィクスは結果のサイズを表します。通常はインテル® AVX-512 ベクトルレジスターのサイズである 512 ビットですが、一部の組込み関数では 512 ビットよりも小さくなります。 |
<intrin_op> | 組込み関数の基本操作を示します。例えば、加算の場合は add、減算の場合は sub になります。 |
<suffix> | 命令の操作対象となるデータの型を示します。各サフィックスの最初の 1 文字または 2 文字は、データがパックドデータ (p)、拡張パックドデータ (ep)、またはスカラーデータ (s) であることを示します。その他の文字は、次のデータ型を示します。
|
<data type> | パラメーターのデータ型 __m512、__m512d、__m512i、__m256、__m256d、__m256i、__m128、__m128d、__m128i、const、int など。 |
<parameter1> | 1 つ目のソース・ベクトル・レジスター: m1/s1/v1/a |
<parameter2> | 2 つ目のソース・ベクトル・レジスター: m2/s2/v2/b |
<parameter3> | 整数値: mask/select/offset 3 つ目のパラメーターのビットは、組込み関数が操作を実行する条件を示します。 |
プログラムは、512 ビットのベクトルに 8 個の倍精度浮動小数点値、16 個の単精度浮動小数点値、8 個の 64 ビット整数値、または 16 個の 32 ビット整数値をパックできます。そのため、1 つの命令でインテル® AVX やインテル® AVX2 の 2 倍、あるいはインテル® SSE の 4 倍のデータ要素を処理することができます。