問題タブ [bmi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 組み込みの __lzcnt64 は、さまざまなコンパイル オプションでさまざまな値を返します
次のコードがあります。
私が得るさまざまなコンパイラとオプションで実行しています(アセンブリを示しています):
クラン
-mlzcnt なしの GCC
-mlzcnt を使用した GCC
-mlzcnt なしの G++
-mlzcnt を使用した G++
違いは明らかに -mlzcnt の使用ですが、私は実際に C++ で作業しており、そのオプションがないと g++ でコンパイルされません (clang++ は問題ありません)。-mlzcnt を使用すると、結果は 63-(-mlzct なしの結果) のように見えます。gcc の -mlzcnt オプションに関するドキュメントはありますか (情報ファイルを調べましたが、何も見つかりませんでした)。lzcnt 命令を選択する以上のことはありますか?
assembly - bsr と lzcnt に関する混乱
両方の指示について少し混乱しています。最初に、スキャンされた値が 0 で、結果が undefined/bsr または bitsize/lzcnt であるという特殊なケースを破棄しましょう。この違いは明確であり、私の質問の一部ではありません。
バイナリ値を取りましょう0001 1111 1111 1111 1111 1111 1111 1111
Intelの仕様によると、結果lzcnt
は3です
Intel の仕様によると、結果bsr
は 28 です
lzcnt
カウント、bsr
インデックスまたはビット 0 (LSB) からの距離を返します。
利用可能な CPU に BMI がない場合のように、どのように両方の命令を同じにして、どのようlzcnt
にエミュレートすることができますか? それとも、msbbsr
の場合はビット 0ですか? bsr
Intel の仕様の両方の「コード操作」も異なります。1 つは左からカウントまたはインデックスを作成し、もう 1 つは右からカウントまたはインデックスを作成します。
誰かがこれに光を当てることができるかもしれません.フォールバックへのフォールバックが同じ結果で機能するBMI/lzcnt
かどうかをテストするための指示がないCPUはありません(スキャンする値0の特別なケースは決して起こらないため).bsr
gcc - Intelコンパイラ/ LLVMでの並列ビットデポジット/並列ビット抽出?
BMI2命令が付属している CPUの場合、組み込み関数を使用して、GCC で並列ビット デポジット (pdep) と並列ビット抽出 (pext) を使用できます。
unsigned int _pdep_u32 (unsigned int, unsigned int)
unsigned int _pext_u32 (unsigned int, unsigned int)
unsigned long long _pdep_u64 (unsigned long long, unsigned long long)
unsigned long long _pext_u64 (unsigned long long, unsigned long long)
Intelコンパイラで同等のものは何ですか? そしてclangで?
gcc - mulx 命令の組み込み
このmulx
命令は、Haswell プロセッサから始まる BMI2 命令セットで導入されました。
Intelのドキュメントによると、組み込みのmulx
ただし、BMI2または一般に、 Intelの組み込みガイドオンラインからそのような組み込みは見つかりません。ただし、ADX 命令セットから addcarry 組み込み関数が見つかります。
このリンクによると、本質的なものはmulx_u64
ありますが、それも見つかりません。
MSVC は MSVC 2005 に_umul128 組み込み関数を追加しましたが、それは生成するだけで生成mul
しませんmulx
(MSVC で BMI2 を有効にする方法がわかりません)。
(または) を使用して GCC でmulx
間接的に命令を生成できますが、組み込みを使用してより直接的に行うことをお勧めします。__int128
-mbmi2
-march=haswell
ADX 組み込み関数が存在するのに、 Intel のドキュメントmulx
で定義されているものがないのはなぜですか?
c++ - BMI2命令セットを検出するコンパイラマクロ
適切な解決策を見つけるために Web を検索していましたが、あまり成功しませんでした。それで、あなたの誰かがそれについて何か知っていることを願っています: " Intel Bit Manipulation Instruction Sets 2 " (BMI2) コンパイル時間を検出する方法はありますか? 入手可能性に基づいて条件付きのものを作りたいです。
c++ - セレクター ビットマップ内の 1 ビットと重複するビットマスク内のセット ビットのスパンを選択します
与えられた:
- 少なくとも 1 つのセット ( ) ビットを含むビットマスク
a
(たとえば、 )。std::uint64_t
1
- (つまり)
b
のサブセットであり、少なくとも 1 つのビット セットを持つセレクター ビットマスク。a
a & b == b
a
のビットと重複する連続した 1 ビットのスパンを選択したいb
:
が falseでc
あるため、XXXX グループは 0です。Z ビットの 1 つが設定されているb & XXXX
ため、ZZ グループがコピーされます。同じ理由 b
で YYY グループも設定されています。では、1 つのグループに複数のビットを設定できることに注意してください。c
b
a
1
したがって、 内のs の連続するグループごとに、これらの位置のいずれかにがある場合は、内a
のすべてのビットを設定します。より複雑な例:c
b
1
ビット論理命令/組み込み関数 (MMX、SSE、AVX、BMI1/BMI2)、または効率的に計算できるビット操作のトリックはありc
ます a
かb
? (つまり、ループなし)?
追加:
Denis' answer からのヒントを使用すると、ループベースのアルゴリズムしか想像できません。
c++ - Solaris 11 で Sun が提供する GCC を使用した _blsr_u64 のヘッダー?
複数のプラットフォームで実行されるコードがいくつかあります。コードは、Core i7 第 5 世代のように、利用可能な場合はBMI/BMI2組み込み関数を使用します。Solaris 11.3 で Sun が提供する GCC は と を定義__BMI__
して__BMI2__
いますが、BMI/BMI2 組み込み関数を見つけるのに問題があります。
immintrin.h をインクルードしても違いはありません。
_blsr_u64
Solaris 11.3 で GCC を使用する場合、どのヘッダーを含めますか?
GCC からの関連する定義は次のとおりです。
そしてCPUの特徴:
そしてGCCバージョン: