x86 命令セットは、 SIMD (単一命令、複数データ) 命令セット拡張によって何度も拡張されてきました。1997 年にPentium MMXで導入されたMMX命令セット拡張から始まるこれらの拡張は、通常、一連のワイド レジスタと、これらのレジスタを固定サイズのレーンに分割し、各レーンの計算を並列に実行する命令を定義します。
SIMD拡張の概要
x86 に導入された主な SIMD 命令セット拡張は次のとおりです。
- ^ SSE3 の 13 個の命令には、非 SIMD 命令
MONITORと、MWAIT「Prescott New Industries」の一部として導入されたものも含まれます。これらの 2 つの命令は、Intel では SSE3 命令とみなされていますが、AMD ではそうではありません。
MMX説明書
MMX 命令は、64 ビット幅の mm レジスタで動作します。これらは FPU レジスタと共有されます。
オリジナルのMMX説明書
Pentium MMXで追加
特定のプロセッサに追加されたMMX命令
MMX命令が追加されたMMX+およびSSE
次の MMX 命令は SSE で追加されました。これらは、MMX+ という名前で Athlonでも使用できます。
SSE2で追加されたMMX命令
SSE2 では次の MMX 命令が追加されました。
SSSE3で追加されたMMX命令
南東説明書
Pentium IIIで追加
SSE 命令は、128 ビット幅の xmm レジスタで動作します。
SSE は、次の SSE SIMD 浮動小数点命令で構成されています。
* 浮動小数点の単ビット演算ANDPS、ANDNPS、ORPS、XORPSは、SSE2の整数(PAND、PANDN、POR、PXOR)および倍精度浮動小数点演算(ANDPD、ANDNPD、ORPD、XORPD)と同じ結果を生成しますが、間違った型の値を適用すると、ドメイン変更に余分な遅延が発生する可能性があります。[1]
SSE2説明書
Pentium 4で追加
SSE2 SIMD浮動小数点命令
SSE2データ移動命令
SSE2 パック演算命令
SSE2論理命令
SSE2 比較命令
SSE2 シャッフルおよびアンパック命令
SSE2変換手順
- CMPSDとMOVSD は、文字列命令ニーモニックCMPSD (CMPS)とMOVSD (MOVS)と同じ名前ですが、前者はスカラー倍精度浮動小数点数を参照するのに対し、後者はダブルワード文字列を参照します。アセンブラは、オペランドの有無に基づいてこれらを区別します。
SSE2 SIMD整数命令
SSE2 MMXのような命令がSSEレジスタに拡張されました
SSE2 では、SSE レジスタ上で MMX 命令を実行できるため、一度に 2 倍のデータ量を処理できます。
SSEレジスタ専用のSSE2整数命令
以下の命令は、その性質上MMXレジスタでは動作しないため、SSEレジスタでのみ使用できます。
SSE3説明書
SSE3をサポートするPentium 4で追加されました
SSE3 SIMD浮動小数点命令
SSE3 SIMD整数命令
SSSE3説明書
SSSE3では、SSEレジスタに拡張された以下のMMXライクな命令が追加されました。
SSE4説明書
SSE4.1 SIMD浮動小数点命令
SSE4.1 SIMD整数命令
Phenomプロセッサを追加
Nehalemプロセッサを追加
半精度浮動小数点変換。
AVX は、最初に Intel の Sandy Bridge と AMD のBulldozerでサポートされました。
256 ビット レジスタでのベクトル演算。
Intel のHaswell マイクロアーキテクチャと AMD のExcavatorで導入されました。
ほとんどのベクトル整数SSEおよびAVX命令を256ビットに拡張
FMA3およびFMA4の指示
浮動小数点融合乗算加算命令は、x86 で「FMA3」と「FMA4」という 2 つの命令セット拡張として導入されました。どちらもAVX上に構築され、xmm/ymm/zmm ベクトル レジスタを使用するスカラー/ベクトル命令のセットを提供します。FMA3 は、3 つの入力オペランドを受け取り、その結果を最初のオペランドに書き戻す 3 オペランド融合乗算加算命令のセットを定義します。FMA4 は、宛先オペランドと 3 つのソース オペランドの 4 つの入力オペランドを受け取る 4 オペランド融合乗算加算命令のセットを定義します。
FMA3 は、 Haswell以降の Intel CPU 、 Piledriver以降の AMD CPU 、およびYongFeng 以降のZhaoxin CPU でサポートされています。FMA4 は AMD Family 15h (Bulldozer) CPU でのみサポートされており、 AMD Zen以降では廃止されています。FMA3/FMA4 拡張機能は AVX または AVX2 の本質的な部分とは見なされていませんが、AVX2 をサポートするすべての Intel および AMD (Zhaoxin は除く) プロセッサは FMA3 もサポートしています。ただし、FMA3 命令 (EVEX エンコード形式) はAVX-512基本命令です。FMA3
および FMA4 命令セットはどちらも 10 個の融合積和演算のセットを定義し、すべて FP32 および FP64 バリアントで使用できます。これらのバリアントごとに、FMA3 は 3 つのオペランド順序を定義し、FMA4 は 2 つのオペランド順序を定義します。
FMA3 エンコーディング
FMA3 命令は、または の形式でVEXまたはEVEX プレフィックスを使用してエンコードされます。VEX.W/EVEX.W ビットは浮動小数点形式を選択します (W=0 はFP32、W=1 はFP64を意味します)。オペコード バイトは2 つのニブルで構成され、上位ニブルはオペランドの順序 ( ='132'、='213'、='231') を選択し、下位ニブル(値 6..F) は 10 個の融合乗算加算演算のどれを実行するかを選択します。 (指定された範囲外の場合は、FMA3 命令ではないものになります。)
アセンブリ言語レベルでは、オペランドの順序は命令のニーモニックで指定されます。
VEX.66.0F38 xy /rEVEX.66.0F38 xy /rxyx9AByxy
vfmadd132sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm1*xmm3)+xmm2vfmadd213sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm2*xmm1)+xmm3vfmadd231sd xmm1,xmm2,xmm3実行するxmm1 ← (xmm2*xmm3)+xmm1
すべての FMA3 バリアントでは、最初の 2 つの引数は xmm/ymm/zmm ベクトル レジスタ引数である必要があり、最後の引数はベクトル レジスタまたはメモリ引数のいずれかになります。AVX-512 および AVX10 では、EVEX エンコード バリアントは、EVEX プレフィックス エンコード ブロードキャスト、オペマスク、および丸め制御をサポートします。Sapphire
Rapids
で導入された AVX512-FP16 拡張は、FMA3 命令のFP16バリアントを追加します。これらはすべて、FP32/FP64 バリアントと同じように機能するオペコード バイトの形式を取ります。2024 年に公開された AVX10.2 拡張[4]は、同様に、パックされた (ただしスカラーではない) FMA3 命令のBF16バリアントを追加します。これらはすべて、FP32/FP64 バリアントと同様に機能するオペコード バイトの形式を取ります。 (FMA4 命令の場合、FP16 または BF16 のバリアントは定義されていません。)
FMA4 エンコーディング
FMA4 命令は、フォームの VEX プレフィックスを使用してエンコードされます(EVEX エンコーディングは定義されていません)。オペコード バイトは、最下位ビットを使用して浮動小数点形式 (0 = FP32、1 = FP64) を選択し、残りのビットを使用して実行する 10 個の融合乗算加算演算の 1 つを選択します。
EVEX.66.MAP6.W0 xy /rEVEX.NP.MAP6.W0 xy /r
VEX.66.0F3A xx /r ibxx
FMA4 の場合、オペランドの順序は VEX.W ビットによって制御されます。VEX.W=0 の場合、3 番目のオペランドは命令のModR/Mバイトで指定される r/m オペランドであり、4 番目のオペランドは命令のib (8 ビット即値) 部分のビット 7:4 で指定されるレジスタ オペランドです。VEX.W=1 の場合、これら 2 つのオペランドは入れ替えられます。例:
vfmaddsd xmm1,xmm2,[mem],xmm3実行されxmm1 ← (xmm2*[mem])+xmm3、W=0 エンコーディングが必要になります。vfmaddsd xmm1,xmm2,xmm3,[mem]実行されxmm1 ← (xmm2*xmm3)+[mem]、W=1 エンコーディングが必要になります。vfmaddsd xmm1,xmm2,xmm3,xmm4実行されxmm1 ← (xmm2*xmm3)+xmm4、W=0 または W=1 のいずれかでエンコードできます。
オペコード テーブル
10 個の融合積和演算と、それによって生成される 122 個の命令バリアントについては、次の表で説明します。FMA4 命令は * と黄色のセルで強調表示され、FMA3 命令は強調表示されていません。
- ^ベクトル レジスタ レーンは、 リトルエンディアン方式で 0 から順にカウントされます。つまり、ベクトルの最初のバイトを含むレーンは偶数であるとみなされます。
AVX-512
2014年に導入されたAVX-512では、512ビット幅のベクターレジスタ(新しいレジスタの下位半分となる256ビットレジスタを拡張)が追加され、その数は2倍の32になった。そのため、新しいレジスタはzmm0からzmm31と名付けられた。また、k0からk7までの名前が付いた8つのマスクレジスタが追加され、これを使用してベクターレジスタの特定の部分に操作を制限できる。以前の命令セット拡張とは異なり、AVX-512は複数のグループで実装されており、必須なのは基礎(「AVX-512F」)拡張のみである。[5] 追加された命令のほとんどは、256ビットおよび128ビットレジスタでも使用できる。
アムクス
Intel AMX は、8 つの新しいタイル レジスタtmm0( ~ )を追加しますtmm7。各タイルレジスタには、最大 16 行 (タイル レジスタあたり 64 バイト) の行列が保持されます。また、8 つのタイル レジスタのそれぞれに保持される実際の行列のサイズを構成するレジスタと、これらのレジスタで行列乗算をTILECFG実行するための一連の命令も追加されます。
- ^ の場合
TILEZERO、クリアするタイルレジスタは、命令のModR/Mバイトのビット 5:3 によって指定されます。ビット 7:6 は 11b に設定し、ビット 2:0 は 000b に設定する必要があります。 - ^ abc 、および命令の場合、メモリ引数は SIB バイトによるメモリ アドレッシング モードを使用する必要があります。このアドレッシング モードでは、ベース レジスタと変位を使用して、メモリからロード/メモリへストアするタイルの最初の行の開始アドレスを指定します。スケールとインデックスを使用して行ごとのストライドを指定します。これらの命令はすべて割り込み可能です。これらの命令の途中で割り込みまたはメモリ例外が発生すると、進捗状況の追跡情報が に書き込まれるため、割り込み後も部分的にロード/ストアされたタイルで命令を続行できます。
TILELOADDTILELOADDT1TILESTOREDTILECFG.start_row - ^ abcdefgh すべての AMX 行列乗算命令では、3 つの引数が 3 つの異なるタイル レジスタである必要があります。そうでない場合、命令は #UD になります。
参照
参考文献
- ^ Intel、Intel® 64 および IA-32 アーキテクチャ最適化リファレンス マニュアル (注文番号 248966-044、2021 年 6 月) セクション 3.5.2.3
- ^ 「Intel、AMD、VIA CPU のマイクロアーキテクチャ: アセンブリ プログラマとコンパイラ メーカー向けの最適化ガイド」(PDF) 。2016年10 月 17 日閲覧。
- ^ 「Chess programming AVX2」。2017年7月10日時点のオリジナルよりアーカイブ。2016年10月17日閲覧。
- ^ Intel、Advanced Vector Extensions 10.2 アーキテクチャ仕様、注文番号 361050-001、改訂 1.0、2024 年 7 月。2024 年 8 月 1 日にアーカイブ。
- ^ 「Intel AVX-512 命令」。Intel 。 2022年6月21日閲覧。
外部リンク
- Intel 組み込み関数ガイド - Intel MMX/SSE/AVX/AVX512 SIMD組み込み関数の検索可能なリファレンス
