34

x86 SIMD 拡張に慣れる必要があると考えています。しかし、始める前に私はトラブルに遭遇しました。それらのどれがまだ関連しているかについての良い概要が見つかりません。

x86 アーキテクチャは、数十年にわたって多くの数学/マルチメディア拡張機能を蓄積してきました。

  • MMX
  • 3Dナウ!
  • SSE
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • 私は何かを忘れましたか?

新しいものは古いもののスーパーセットですか、またはその逆ですか? それとも補完的なものですか?

それらのいくつかは非推奨ですか?これらのうち、まだ関連しているのはどれですか? 「レガシー SSE」への言及を聞いたことがあります。

それらのいくつかは相互に排他的ですか?つまり、同じハードウェア部品を共有していますか?

最新の Intel / AMD CPU でハードウェアの使用率を最大化するには、どちらを併用する必要がありますか? 議論のために、命令の適切な用途を見つけることができると仮定しましょう... CPU で私の家を暖房します。

4

2 に答える 2

21

それらは補完的です。

新しい命令セット拡張ごとに新しい命令が追加され、最終的には新しいプログラミング モデル (新しいレジスタなど) が追加されます。

非推奨の命令はありません。互換性の理由から、命令を非推奨にすることはほとんど不可能です。ただし、一部のオプションの拡張機能は、新しいモデル (AMD の FMA4 など) には存在しないか、削除されている可能性があります。
一部は痕跡ですが、たとえば FPU と MMX で実行できることはすべて、SSE+ でより効率的に実行できます。

どちらか一方を使用できるという意味で、それらは相互に排他的ではありません。結局のところ、それらは操作モードではなく命令です(たとえば、リアルモードと保護モードなど)。
唯一の可能な「競合」は、MMX と FPU の間です。これらは同じレジスタ セットの下位部分を共有していますが、プログラミング モデルが異なるためです。
以前のレジスタが新しいレジスタの下位部分になるたびに、新しいベクトル レジスタは 128 ビットから 256 ビット、512 ビットに拡張されました。

これらはすべて一緒に使用でき、単純な操作を実装する特定のハードウェア サポートを提供します。

それらはレゴ ブロックのようなもので、あなたの想像力 (またはデザイナーの想像力) によってのみ制限されます。


この命令セットの拡張機能の簡単なリストを次に示します。
一部の機能のみがリストされています。完全なリファレンスについては、Intel マニュアル Vol1の第 9 章から第 14 章を参照してください。

Intel のボリューム 2 (命令セット リファレンス) マニュアルの目次については、https://hjlebbink.github.io/x86doc/も参照してください。そのマニュアル エントリに命令を追加した拡張機能のリストも含まれています。

  • MMX
    8 つの 64 ビット レジスタ (MM0 ~ MM7) と、8 つの符号付き/符号なしバイト、4 つの符号付き/符号なしワード、2 つの符号付き/符号なし dword を操作する命令を導入します。

  • 3Dナウ!
    単精度浮動小数点オペランドのサポートを MMX に追加します。加算、減算、乗算など、サポートされている演算はほとんどありません。

  • SSE
    8/16 の 128 ビット レジスタ (XMM0 ~ XMM7/15) と、4 つの単精度浮動小数点オペランドを操作する命令を導入します。MMX レジスタにも整数演算を追加します。(SSE の MMX 整数部分は MMXEXT と呼ばれることもあり、xmm レジスターと SSE の浮動小数点部分を持たないいくつかの非 Intel CPU に実装されていました。)

  • SSE2
    2 つの倍精度浮動小数点オペランド、および 128 ビット xmm レジスター内のパックされたバイト/ワード/dword/qword 整数を処理する命令が導入されました。

  • SSE3 Pentium 4、同期命令、水平加算/減算でより優れ
    た特別な種類の非整列ロード ( ) を含む、いくつかのさまざまな命令 (主に浮動小数点) を追加します。lddqu

  • SSSE3
    再びさまざまな命令セットで、ほとんどが整数です。ハードコード ( ) ではなく、レジスタから制御オペランドを取得する最初のシャッフルpshufb。水平方向の処理、シャッフル、パッキング/アンパッキング、バイトの mul+add、特殊な整数の add/mul など。

  • SSE4 (SSE4.1、SSE4.2)
    多くの命令を追加: すべての整数データ型 (特に 32 ビット整数が不足していた) に対して最小値と最大値およびその他の操作を提供することで、多くのギャップを埋めます。 min は、符号なしバイトと符号付き 16 ビットでのみ使用できました。また、スケーリング、FP 丸め、ブレンディング、線形代数演算、テキスト処理、比較。また、ビデオ メモリを読み取ったり、メイン メモリにコピーしたりするための非一時的な負荷。(以前はNTストアのみ利用可能でした。)

  • AESNI
    AES 対称暗号化/復号化を高速化するためのサポートを追加します。

  • AVX 8/16 の 256 ビット レジスタ (YMM0-YMM7/15) を追加します。
    以前のすべての浮動小数点データ型をサポートします。3 つのオペランド命令。

  • FMA
    Add Fused Multiply Add および相関命令。

  • AVX2
    整数データ型のサポートを追加します。

  • AVX512F 8/32
    の 512 ビット レジスタ (ZMM0-ZMM7/31) と 8 つの 64 ビット マスク レジスタ (k0-k7) を追加します。以前のほとんどの命令を 512 ビット幅にプロモートします。AVX512 のオプション部分は、指数と逆数 (AVX512ER)、スキャッター/ギャザー プリフェッチ (AVX512PF)、スキャッター コンフリクト検出 (AVX512CD)、圧縮、展開の命令を追加します。

  • IMCI (インテル Xeon Phi)
    第 1 世代インテル Xeon Phi (Knight's Corner) コプロセッサー用の AVX512 の早期開発。

于 2015-07-18T16:12:13.897 に答える
21

最近、SSEAVX、およびx86 (およびSSE2avx2 ) のタグ wiki を更新しました。彼らはこれの多くをカバーしています。tl;dr 要約: AVX は以前の SSE バージョンをすべてロールアップし、それらの命令の 3 オペランド バージョンを提供します。また、ほとんどの FP (AVX) および int (AVX2) insn の 256b バージョン。

さまざまな SSE バージョンの概要については、wikipedia または knm241 のより詳細な回答を参照してください。

それによって SSE が時代遅れになるとは考えていません。もっと言えば、AVX は同じ古い SSE 命令の新しく改良されたバージョンと考えてください。それらは、非 AVX 名 (たとえばPSHUFB、 ではなく) の下で ref マニュアルにまだあります。 (インテル上で)。そのため、VEX 以外の SSE 命令を実行する可能性のあるライブラリを呼び出さなければならない場合や、コードで SSE FP 演算を使用しているが、CPU がサポートしている場合にのみ実行する AVX コードがある場合に対処するのは面倒です。VPSHUFBVZEROUPPER

CPU の互換性が問題にならなかった場合、ベクトル命令のレガシー SSE バージョンは、現在の MMX のように完全に時代遅れになります。AVX/AVX2 は、VEX でエンコードされた 128b バージョンを SSE ではなく AVX としてカウントする場合、あらゆる点で少なくともわずかに優れています。データがそれほど大きなチャンクでしかないため、128bレジスタを使用する場合もありますが、256bレジスタを使用して、一度に2倍のデータに対して同じ操作を実行することがよくあります。

SSE/AVX/x87-FP/integer 命令はすべて同じ実行ポートを使用します。それらを混ぜ合わせても、並行してより多くのことを行うことはできません。(Haswell を除いて、4 つの ALU ポートの 1 つが GP reg ops やブランチなどの非ベクトル insn のみを処理できます)。

于 2015-07-18T19:02:05.690 に答える