web-dev-qa-db-ja.com

異なるmmx、sse、avxバージョンは互いに補完的ですか、それともスーパーセットですか?

X86SIMD拡張命令に慣れるべきだと思っています。しかし、始める前に私は問題にぶつかりました。それらのどれがまだ関連しているのかについての良い概要を見つけることができません。

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

  • MMX
  • 3DNow!
  • SSE
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • 何か忘れましたか?

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

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

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

最新のIntel/AMD CPUでハードウェア使用率を最大化するには、どちらを一緒に使用する必要がありますか?議論のために、私が指示の適切な使用法を見つけることができると仮定しましょう...他に何もないとしてもCPUで私の家を暖めます。

22
snoukkis

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

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

SSEが廃止されたとは、実際には考えていません。たとえば、AVXを、同じ古いSSE命令の新しいより良いバージョンと考えてください。 'AVX以外の名前(たとえば、PSHUFBではなくVPSHUFB)でrefマニュアルに残っています。AVXとSSE code、パフォーマンスの問題がVEXと非VEXinsns(Intelの場合)を混合することを回避するために必要なときにVZEROUPPERを使用する限り、実行される可能性のあるライブラリを呼び出さなければならない場合に対処するのは面倒です。非VEX SSE命令、またはコードでSSE FP mathが使用されているが、AVXコードもいくつかあるCPUがサポートしている場合にのみ実行します。

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

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

15
Peter Cordes

それらは補完的です。

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

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

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

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

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


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

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

  • [〜#〜] mmx [〜#〜]
    8つの64ビットレジスタ(MM0〜MM7)と、8つの符号付き/符号なしバイト、4つの符号付き/符号なしワード、2つの符号付き/符号なしdwordを処理する命令を導入します。

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

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

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

  • [〜#〜] fma [〜#〜]
    Fused MultiplyAddおよび相関命令を追加します。

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

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

  • IMCI(Intel Xeon Phi)
    第1世代IntelXeon Phi(Knight's Corner)コプロセッサー用のAVX512の初期開発。

13
user781847