問題タブ [avx2]
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.
assembly - 配列を回転または転置するための最適な SIMD アルゴリズム
16 個の uint64 の配列を持つデータ構造に取り組んでいます。それらはメモリ内で次のように配置されます (以下はそれぞれが単一の int64 を表します)。
望ましい結果は、配列を次のように転置することです。
配列を 90 度回転させることも、future ループの許容可能な解決策です。
これは、後で矢印をすばやく操作するために必要です (一度に 4 つずつ、別の SIMD トリップで順番にトラバースします)。
これまでのところ、A の 4 x 64 ビット ベクトルをロードし、要素をビットマスク化してシャッフルし、それを B などと OR 演算してから、C に対してそれを繰り返すことで、データを「ブレンド」しようとしました... 残念ながら、これは配列内の 4 つの要素のセグメントごとに 5 x 4 の SIMD 命令 (1 つのロード、1 つのマスク、1 つのシャッフル、1 つまたは次の要素、最後にストア)。どうやら私はもっとうまくやれるはずです。
AVX2 が利用可能で、clang でコンパイルしています。
assembly - AVX2 回転ベクトル
私のプラットフォームは MASM64、AVX2 です。次のように、YMM レジストリに対してローテーション操作を実行する必要があります。
|| A0 || A1 || A2 || A3 || = > || A1 || A2 || A3 || A0 ||
ここで、Ai は qword です。同じ問題に関するドキュメントの参照を見つけることができませんでした。
前もって感謝します!
intrinsics - _mm256_xor_si256() と _mm256_xor_ps() の違い
AVX(2)の_mm256_xor_si256と_mm256_xor_ps組み込み関数の実際の違いを見つけようとしています。
それらはそれぞれインテルの命令にマップされます。
- vpx または ymm、ymm、ymm
- vxorps ymm、ymm、ymm
インテルによって次のように定義されています。
対
しかし、率直に言って、それらの効果に違いは見られませんか? どちらも xor 256 ビットです。ただし、後者は AVX と AVX2 で使用できますが、前者は AVX2 でのみ使用できます。互換性が低い最初のものを使用する理由は何ですか?
c++ - Visual Studio 2013 での AVX2 命令割り込み
C++ コードは次のとおりです。
このコードを VS2013 で実行すると、xor操作が中断されます。
また、x と y を正常に出力できるので、私の CPU は AVX2 をサポートできると思います。
誰かがこれを修正する方法を教えてもらえますか?
c++ - __m256 値の配列を使用したこの誤ったコード生成は、clang のバグですか?
clang 3.4、3.5、および 3.6 トランクで不正なコード生成を引き起こすバグと思われるものに遭遇しました。実際に問題を引き起こしたソースは非常に複雑ですが、この自己完結型の例に減らすことができました。
上記の要約: simd_pack1 つのメンバー、1 つの__m256i値の配列を含む単純な型があります。私のアプリケーションには、これらの型を取る演算子と関数がありますが、問題は上記の例で説明できます。具体的にtest_broken()は、配列から読み取り、in1その値をout配列にコピーするだけです。したがって、memcmp()inの呼び出しmain()はゼロを返す必要があります。以下を使用して上記をコンパイルします。
-O0最適化レベルおよび-O1ではテストが成功し、レベル-O2および-O3ではテストが失敗することがわかりました。同じファイルを gcc 4.4、4.6、4.7、4.8、および Intel C++ 13.0 でコンパイルしようとしましたが、すべての最適化レベルでテストに合格しました。
生成されたコードを詳しく見てみましょう。最適化レベルで生成されたアセンブリは次の-O3とおりです。
強調するために重要な部分を再現します。
これは頭を悩ませるようなものです。ymm0最初に、私が要求したアライメントされていない移動を使用して256 ビットをロードし、次に (読み取られたデータの下位 128 ビットのみを含む) をスタックに格納し、すぐにスタックの場所からxmm0256 ビットを読み取ります。ymm0に書かれています。その結果、ymm0の上位 128 ビット (出力バッファーに書き込まれる) がガベージになり、テストが失敗します。
コンパイラのバグ以外に、これが発生する正当な理由はありますか? 型に値simd_packの配列を保持させることで、何らかの規則に違反していますか? __m256iそれは確かにそれに関連しているようです。_val配列ではなく単一の値に変更すると、生成されたコードは意図したとおりに機能します。ただし、私のアプリケーションは_val配列である必要があります (その長さは C++ テンプレート パラメーターに依存します)。
何か案は?
x86 - 32 ビット整数の 2 つのベクトルを乗算し、32 ビット結果要素のベクトルを生成します。
_mm256i2 つのレジスタの各 32 ビット エントリを互いに乗算する最良の方法は何ですか?
_mm256_mul_epu3264ビット出力を生成するため、私が探しているものではありません。32 ビットの入力要素ごとに 32 ビットの結果が必要です。
さらに、2 つの 32 ビット値の乗算はオーバーフローしないと確信しています。
ありがとう!
c++11 - 最適な uint8_t ビットマップを 8 x 32 ビット SIMD "bool" ベクトルに変換
圧縮アルゴリズムの一部として、次のことを達成するための最適な方法を探しています。
に単純なビットマップがありuint8_tます。たとえば、01010011
私が欲しいのは__m256i次の形式です: (0, maxint, 0, maxint, 0, 0, maxint, maxint)
これを実現する 1 つの方法は、8 x maxint のベクトルをゼロのベクトルにシャッフルすることです。しかし、それにはまずuint8_t、正しいシャッフル ビットマップに展開する必要があります。
より良い方法があるかどうか疑問に思っていますか?