インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
新しい命令は、2 つのグループに分けることができ、インテル® AVX-512 基本命令を強化します。1 つ目は、バイトおよびワード命令と呼ばれる、整数演算を強化するバイトとワード (8 ビットと 16 ビット) 操作で、AVX512BW および AVX512VBMI CPUID フラグが含まれます。 2 つ目は、ダブルワードおよびクワッドワード命令と呼ばれる、整数および浮動小数点演算を強化するダブルワードとクワッドワード (32 ビットと 64 ビット) 操作で、AVX512DQ および AVX512IFMA52 CPUID フラグが含まれます。
さらに、これら 2 つとは独立した追加機能として、ベクトル長の拡張があります。これにより、ほとんどのインテル® AVX-512 命令は、512 ビットだけでなく 128 ビットまたは 256 ビットの操作が可能となります。現在では、ほとんどの基本命令、競合検出命令に加えて、新しいバイト、ワード、ダブルワード、クワッドワード命令にも適用できます。インテル® AVX-512 のベクトル長の拡張には、AVX512VL CPUID フラグが含まれます。ベクトル長の拡張により、ほとんどのインテル® AVX-512 操作で XMM (128 ビット、インテル® SSE 用) レジスターと YMM (256 ビット、インテル® AVX 用) レジスターも利用することができます。また、マスクレジスターや、レジスター 16..31 へのアクセスを含む EVEX エンコーディング機能を ZMM レジスターだけでなく XMM および YMM レジスターに適用できます。
バイトおよびワード命令 (AVX512BW CPUID フラグを含む) は、書き込みマスクとゼロマスクを拡張して小さな要素サイズをサポートします。オリジナルのインテル® AVX-512 基本命令は、32 ビットと 64 ビットのベクトル要素でそれぞれのマスクをサポートしていました。512 ビットのベクトルレジスターで保持できる 32 ビット要素は最大 16 個なので、書き込みマスクは 16 ビットで足りていました。
AVX512BW CPUID フラグを含む命令では、512 ビット・ベクトルは 64 個の 8 ビット要素または 32 個の 16 ビット要素を保持できるため、64 ビットの書き込みマスクが必要になります。これに対応するため、2 つのマスクタイプ __mmask32 と __mmask64 に加えて、8 ビットと 16 ビット・ベクトル要素を操作するマスク付き組込み関数が追加されました。 次に例を示します。
__m512i _mm512_mask_abs_epi8(__m512i src, __mmask64 k, __m512i a);
この組込み関数は、a の 8 ビット要素の絶対値を計算し、書き込みマスク k を使用して結果を戻り値に格納します (k の対応するビットが設定されていない場合は src の要素がコピーされます)。
ダブルワードおよびクワッドワード命令 (AVX512DQ CPUID フラグを含む) は、AVX512F CPUID フラグを含むインテル® AVX512 基本命令を強化するもので、16 個の 32 ビット要素または 8 個の 64 ビット要素で構成される 512 ビット・ベクトルを操作します。浮動小数点から 64 ビット整数への変換などの新しい機能を提供するものと、既存の命令 (vxorps など) を 512 ビット・レジスター対応に拡張したものがあります。
AVX512VL CPUID フラグを含むベクトル長の拡張は、128 ビットと 256 ビットのベクトル長に書き込みマスク、ゼロマスク、組込みブロードキャスト機能を追加します。次に例を示します。
__m256 _mm256_maskz_add_ps(__mmask8 k, __m256 a, __m256 b);
この組込み関数は、a と b の対応する float32 要素を加算し、ゼロマスク k を使用して結果を返します (k の対応するビットが設定されていない場合は要素が 0 に設定されます)。