ビット操作命令セット( BMI セット) は、IntelおよびAMDのマイクロプロセッサのx86 命令セット アーキテクチャの拡張機能です。これらの命令セットの目的は、ビット操作の速度を向上させることです。これらのセットのすべての命令は非SIMDであり、汎用レジスタでのみ動作します。
Intel が発行した命令セットには、BMI (現在は BMI1 と呼ばれる) と BMI2 の 2 つがあります。これらは両方ともHaswellマイクロアーキテクチャで導入され、BMI1 は AMD の ABM 命令セットが提供する機能と一致し、BMI2 はそれらを拡張したものです。AMD が発行した他の 2 つの命令セットは、ABM ( Advanced Bit Manipulation 、Intel がSSE4.2および BMI1の一部として実装したSSE4aのサブセットでもあります) と TBM ( Trailing Bit Manipulation 、 Piledriverベースのプロセッサで BMI1 の拡張として導入された拡張機能ですが、Zenベースのプロセッサでは再び廃止されました) です。[1]
ABM (高度なビット操作)
AMD は、現在 Intel の BMI1 を構成する命令を ABM ( Advanced Bit Manipulation ) 命令セットの一部として最初に導入し、その後 Intel の新しい BMI2 命令のサポートを追加しました。AMD は現在、Intel の BMI1 および BMI2 cpuflags を介してこれらの機能の可用性を宣伝し、プログラマーにそれに応じてターゲットを絞るよう指示しています。[2]
IntelはPOPCNTSSE4.2の一部とLZCNTBMI1の一部であると考えていますが、IntelとAMDはどちらもこれら2つの命令の存在を個別に宣伝しています。同じ名前のPOPCNT別のCPUIDフラグがあり、IntelとAMDはAMDのABMフラグを使用してLZCNTサポートを示します(LZCNTBMI1とBMI2を組み合わせると拡張ABM命令セットが完成するため)。[2] [3]
LZCNTは、ビット スキャン リバース ( BSR) 命令に関連していますが、ZF (結果がゼロの場合) フラグと CF (ソースがゼロの場合) フラグを設定するのではなく、ZF (ソースがゼロの場合) を設定します。また、ソース オペランドがゼロの場合、定義された結果 (ビット単位のソース オペランド サイズ) を生成します。非ゼロ引数の場合、LZCNTと のBSR結果の合計は、引数のビット幅から 1 を引いた値になります (たとえば、32 ビット引数が の場合 0x000f0000、LZCNT は 12 を、BSR は 19 を返します)。
のエンコードは、LZCNTABMがサポートされていない場合はBSR代わりに命令が実行されるようになっている。[4] : 227
BMI1 (ビット操作命令セット 1)
以下の命令はBMICPUIDのビットによって有効化されるものである。Intelは公式にはLZCNTBMIの一部とみなしているが、 CPUID機能フラグをLZCNT使用してサポートを宣伝しているABM。[3] BMI1はAMDのJaguar、[5] Piledriver [6]以降のプロセッサ、およびIntelのHaswell [7]以降のプロセッサで利用可能である。
TZCNTは、ビット スキャン フォワード ( BSF) 命令とほぼ同じですが、ZF (ソースがゼロの場合) を設定するのではなく、ZF (結果がゼロの場合) フラグと CF (ソースがゼロの場合) フラグを設定します。引数がゼロ以外の場合、TZCNTとの結果はBSF同じになります。
と同様にLZCNT、 のエンコードは、TZCNTBMI1がサポートされていない場合はBSF代わりに命令が実行されるようになっている。[4] : 352
BMI2 (ビット操作命令セット 2)
IntelはHaswellプロセッサのラインでBMI1とともにBMI2を導入した。BMI2なしでBMI1をサポートするプロセッサを製造したのはAMDのみであり、BMI2はAMDのExcavatorアーキテクチャ以降でサポートされている。[11]
並列ビットの挿入と抽出
命令PDEPとPEXT命令は、新しい汎用ビットレベル圧縮および展開命令です。これらは 2 つの入力を受け取ります。1 つはソース、もう 1 つはセレクタです。セレクタは、パックまたはアンパックするビットを選択するビットマップです。 は、 PEXTソースから選択されたビットを宛先の連続する下位ビットにコピーします。上位の宛先ビットはクリアされます。 は PDEP、選択されたビットに対してその逆の処理を行います。連続する下位ビットは宛先の選択されたビットにコピーされます。その他の宛先ビットはクリアされます。これを使用して、入力の任意のビットフィールドを抽出したり、以前はコストがかかった大量のビットレベルシャッフルを実行したりできます。これらの命令は、ビットレベルのギャザースキャッターSIMD 命令に似ていますが、PDEP命令PEXTは (他の BMI 命令セットと同様に) 汎用レジスタで動作します。[12]
命令は 32 ビット版と 64 ビット版で利用できます。32 ビット モードで任意のソースとセレクターを使用する例は次のとおりです。
Zen 3以前のAMDプロセッサ[13]ではPDEPとPEXTをマイクロコードで実装しており、レイテンシは(Zen 3の)3サイクル[15 ]ではなく18サイクル[14]となっている。その結果、これらのプロセッサでは他の命令を使用する方が高速になることが多い。[16]
TBM (末尾ビット操作)
TBMはBMI1で開始された命令セットを補完する命令で構成されています。補完的な性質を持つということは、必ずしも直接使用する必要はなく、サポートされている場合は最適化コンパイラによって生成できることを意味します。AMDは、BMI1とともにTBMをPiledriver [6]プロセッサラインで導入しました。その後のAMD JaguarおよびZenベースのプロセッサはTBMをサポートしていません。[5] Intelプロセッサは(少なくともAlder Lakeまでは)TBMをサポートしていません。
サポートするCPU
- インテル
- Intel Nehalemプロセッサ以降 ( Sandy Bridge、Ivy Bridgeなど) (POPCNT をサポート)
- Intel Silvermontプロセッサ (POPCNT をサポート)
- Intel Haswellプロセッサおよびそれ以降( Skylake、Broadwellなど)(ABM、BMI1、BMI2をサポート)[7]
- アム
- K10 ベースのプロセッサ (ABM 対応)
- 「Cat」低電力プロセッサ
- ボブキャットベースのプロセッサ(ABM対応)[18]
- Jaguarベースのプロセッサ以降(ABMおよびBMI1をサポート)[5]
- Pumaベースのプロセッサ以降(ABMおよびBMI1をサポート)[5]
- 「重機」プロセッサー
- Bulldozer ベースのプロセッサ (ABM 対応)
- パイルドライバーベースのプロセッサ(ABM、BMI1、TBMをサポート)[1]
- Steamroller ベースのプロセッサ (ABM、BMI1、TBM をサポート)
- 掘削機ベースのプロセッサおよびそれ以降(ABM、BMI1、BMI2、TBMをサポート、マイクロコードPEXTおよびPDEP)[11]
- Zenベース、Zen+ベース、Zen 2ベース[19]プロセッサ(ABM、BMI1、BMI2をサポート、マイクロコードPEXTおよびPDEP)
- Zen 3プロセッサ以降 (ABM、BMI1、BMI2 をサポート、完全なハードウェア実装)
命令拡張サポートとは、プロセッサがソフトウェア互換性のためにサポートされている命令を実行できることを意味します。プロセッサは、そのようにするとパフォーマンスが悪くなる可能性があります。たとえば、Excavator から Zen 2 プロセッサはマイクロコードを使用して PEXT および PDEP 命令を実装しているため、他の命令を使用して同じ動作を再現した場合よりも命令の実行速度が大幅に遅くなります。[20] (「zp7」と呼ばれるソフトウェア メソッドは、実際にはこれらのマシンでより高速です。) [21]最適なパフォーマンスを得るには、コンパイラ開発者は、拡張機能の可用性ではなく、アーキテクチャ固有のパフォーマンス プロファイルに基づいて拡張機能内の個々の命令を使用することを選択することをお勧めします。
参照
- 高度なベクトル拡張(AVX)
- AES命令セット
- CLMUL命令セット
- F16C
- FMA命令セット
- インテル ADX
- XOP命令セット
- Intel BCD オペコード(高度なビット操作技術にも使用される)
参考文献
- ^ ab 「新しい「ブルドーザー」と「パイルドライバー」の説明書」(PDF) 。 2014年1月3日閲覧。
- ^ ab 「AMD64 アーキテクチャ プログラマーズ マニュアル 第 3 巻: 汎用命令とシステム命令」(PDF) 。2022 年 7 月 20 日閲覧。
- ^ abc 「Intel Advanced Vector Extensions Programming Reference」(PDF) . intel.com . Intel . 2011年6月. 2014年1月3日閲覧。
- ^ abcd 「AMD64 アーキテクチャ プログラマーズ マニュアル、第 3 巻 :汎用命令とシステム命令」(PDF)。リビジョン 3.32。AMD。2021年 3 月。2021 年 4 月8日のオリジナルからアーカイブ(PDF) 。2021年 4 月 8 日に取得。
- ^ abcd 「ファミリー 16h AMD A シリーズ データシート」(PDF) . amd.com . AMD . 2013 年 10 月. 2014 年 1 月 2 日閲覧。
- ^ ab Hollingsworth, Brent. 「新しい「ブルドーザー」および「パイルドライバー」の説明書」(PDF)。Advanced Micro Devices, Inc. 2014 年12 月 11 日閲覧。
- ^ ab Locktyukhin, Max. 「第 4 世代 Intel® Core™ プロセッサー ファミリーでの新しい命令サポートの検出方法」www.intel.com。Intel 。 2014 年12 月 11 日閲覧。
- ^ 「GCC 4.8 の bmiintrin.h」。2014 年 3 月 17 日閲覧。
- ^ ab "sandpile.org -- x86 アーキテクチャ -- ビット" . 2014 年 3 月 17 日閲覧。
- ^ 「Abseil - C++ Common Libraries」. GitHub . 2021年11月4日.
- ^ ab 「AMD Excavator Core が劇的なパフォーマンス向上をもたらす可能性」。X-bit labs。2013 年 10 月 18 日。2013 年 10 月 23 日時点のオリジナルよりアーカイブ。2013年11 月 24 日閲覧。
- ^ Yedidya Hilewitz、Ruby B. Lee (2009 年 8 月)。 「既存および高度なビット操作のための汎用プロセッサのシフターの新しい基礎」(PDF)。palms.princeton.edu。IEEE Transactions on Computers。pp. 1035–1048。2014年 2 月 10 日に取得。
- ^ 「Zen 3 - マイクロアーキテクチャ - AMD - WikiChip」。
- ^ 「命令表」(PDF) 。 2023年9月9日閲覧。
- ^ 「AMD ファミリー 19h プロセッサー向けソフトウェア最適化ガイド」。AMD Developer Central。2022年 7 月 22 日閲覧。
- ^ 「Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7」。Twitter 。 2022年2月21日閲覧。
- ^ 「GCC 4.8 の tbmintrin.h」。2014 年 3 月 17 日閲覧。
- ^ 「AMD ファミリー 14h の BIOS およびカーネル開発者ガイド」(PDF) 。2014 年 1 月 3 日閲覧。
- ^ 「AMD Zen 3 Ryzen ディープダイブレビュー:5950X、5900X、5800X、5600Xをテスト」。2021年12月26日閲覧。
- ^ 「Dolphin Progress Report: December 2019 and January 2020」. Dolphin Emulator . 2020年2月7日. 2020年2月7日閲覧。
- ^ ウェグナー、ザック (2020 年 11 月 4 日)。 「ツウェグナー/ZP7」。GitHub。
さらに読む
- ウォーレン・ジュニア、ヘンリー・S. (2013)。Hacker 's Delight (第2版)。Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8。
外部リンク
- Intel イントリンシクス ガイド
