問題タブ [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.
c - 256i (16 ビット) ベクトルを調べて、0 より大きい要素が含まれているかどうかを確認する方法は?
ベクトル化されたコードを SSE2 組み込み関数から AVX2 組み込み関数に変換しています。256i (16 ビット) ベクトルに 0 より大きい要素が含まれているかどうかを確認する方法を知りたいです。以下は、SSE2 で使用されるコードです。
次のコードはうまくいくと思っていましたが、少しうまくいきませんでした。
どなたかアドバイスいただけると助かります
c++11 - _mm256_shuffle_epi32 の Clang 組み込み関数
Clang で AVX2 コードをコンパイルしようとしています。ただし、AVX2 の clangs 実装は、Intel の組み込みドキュメントに準拠していないようです。
このコード
結果:
シャッフルを実行しようとすると、次のようになります。
これによれば:
実行時にのみ認識されるコントロール マスクを使用してシャッフルすることは、完全に実行可能である必要があります (そうでない場合、シャッフルのポイントはあまりないでしょうか?)。Shuffle も を返す必要があります__m256i
が、clang はメソッドが何も返さないと考えているようです。
を含んでいます<immintrin.h>
。
私も並べ替えを試みましたが、同様に壊れているようです。Clangで指定されているようにシャッフルを機能させる方法はありますか?
c - ベクトル拡張を使用するときに GCC に PTEST 命令を生成させる
C の GCC ベクトル拡張を使用する場合、ベクトルのすべての値がゼロであることを確認するにはどうすればよいですか?
例えば:
SSE4.2 にはPTEST
、条件として使用されるようなテストを実行できる命令がありますfor
が、GCC によって生成されたコードはベクトルをアンパックし、単一の要素を 1 つずつチェックします。
組み込み関数の使用に戻らずに、GCC に効率的なテストを生成させる方法はありますか?
更新: 参考までに、ポータブルでない GCC ビルトインを使用するコード(V)PTEST
:
intel - AVX/SSE 値の大きな配列を作成しても問題ありませんか
AVX2/SSE 命令を使用して、特定の動的計画問題を並列化しています。
私の計算の主な反復では、各セルが AVX2 レジスタの構造体である行列の列を計算します ( _m256i
)。現在の列を計算するための入力値として、前のマトリックス列の値を使用します。列は大きくなる可能性があるため、各構造に 2 つの_m256i
要素がある構造体の配列 (スタック上) を用意します。
構造:
次に、次のような配列がありますCell prevColumn [N]
。N
通常は数百になります。
基本的に avx2 レジスタを表していることはわかっている_m256i
ので、N は 16 (avx レジスタの数) よりもはるかに大きいため、この配列についてどのように考えるべきか、どのように動作するのか疑問に思っています。_m256i
そのような配列を作成することは良い習慣ですか、それともすぐに再利用される多くの値を格納するときに使用する必要があるより良いアプローチはありますか?
また、この構造で行うべき調整はありますか? アラインメントについてはよく読んでいますが、いつ、どのように正確に行うべきかはまだわかりません。
c++11 - マスクに基づく simd を使用して大きなベクトルからベクトルをロードする
誰かがここで助けてくれることを願っています。
大きなバイト ベクトルがあり、そこから小さなバイト ベクトル (マスクに基づく) を作成し、それを simd で処理します。
現在、マスクは baseOffset + submask (byte[256]) の配列であり、 > 10^8 があるため、ストレージ用に最適化されています。maxsize サブベクトルを作成し、マスク配列をループ処理して baseOffsset を 256 倍し、マスクのビット オフセットごとに大きなベクトルから読み込み、小さなベクトルに値を順番に入れます。小さい方のベクトルは、多数の VPMADDUBSW を介して処理され、累積されます。この構造を変えることができます。たとえば、ビットを 1 回ウォークして 8K ビット配列バッファを使用し、小さなベクトルを作成します。
サブアレイを作成するより速い方法はありますか?
アプリからコードを取り出してテスト プログラムに入れましたが、元のコードは流動的な状態です (AVX2 に移行し、C# からさらに引き出しています)。
通常、一部のワークロードではマスクの使用率は 5 ~ 15% で、25 ~ 100% になります。
MASKMOVDQU は近いですが、保存する前にマスクに従って /swl を再パックする必要があります..
c++ - AVX2 Winner-Take All Disparity Search
AVX2 を使用して、視差推定アルゴリズムの「勝者総取り」部分を最適化しています。私のスカラー ルーチンは正確ですが、QVGA 解像度と 48 視差では、私のラップトップでは実行時間が 14 ミリ秒と残念なほど遅くなります。LR 視差画像と RL 視差画像の両方を作成しますが、簡単にするために、ここでは RL 検索のコードのみを含めます。
私のスカラールーチン:
AVX2 を使用する私の試み:
Disparity Space Image (DSI) のサイズは HxWxD (320x240x48) で、各行のサイズが WxD になるように、メモリ アクセスを改善するために水平に配置します。
Disparity Space Image には、ピクセルごとのマッチング コストがあります。これを単純なボックス フィルターで集約して、まったく同じサイズの別の画像を作成しましたが、合計コストは、たとえば 3x3 または 5x5 ウィンドウでした。この平滑化により、結果がより「ロバスト」になります。asPtr でアクセスしているときは、この集計コスト イメージにインデックスを付けています。
また、不要な計算を節約するために、マスク半径によってオフセットされた行で開始および終了しています。このマスク半径は、私の国勢調査マスクの半径です。派手な境界反射を行うこともできますが、この境界の不一致を気にしない方が簡単で高速です。もちろん、これは最初と最後の列にも当てはまりますが、アルゴリズム全体を列が 16 の倍数 (例: QVGA: 320x240) である画像に対してのみ実行するように強制している場合、ここでインデックスをいじるのは良くありません。単純にインデックスを作成し、すべてを SIMD でヒットします (残差スカラー処理なし)。
また、私のコードがごちゃごちゃしていると思われる場合は、高度に最適化された OpenCV ステレオ アルゴリズムを確認することをお勧めします。私はそれらを不可能だと思っており、それらをほとんどまたはまったく使用することができませんでした.
コードはコンパイルされますが、実行時に失敗します。VS 2012 Express Update 4 を使用しています。デバッガーで実行すると、洞察を得ることができません。私は組み込み関数の使用に比較的慣れていないため、デバッグ時にどのような情報が表示されるか、レジスターの数、__m256i 変数を表示する必要があるかどうかなど、よくわかりません。
以下のコメントのアドバイスに注意して、よりスマートなインデックス作成を使用して、スカラー時間を ~14 から ~8 に改善しました。私の CPU は i7-4980HQ で、同じファイルの別の場所で AVX2 組み込み関数を正常に使用しています。
c++ - __m256i ベクトルの要素をシャッフルする
__m256i ベクトルの要素をシャッフルしたい。また、組み込みの _mm256_shuffle_epi8 がありますが、これはクロス レーン シャッフルを実行しません。
AVX2 命令を使用してそれを行うにはどうすればよいですか?
c++ - CMake: Visual Studio 2013 プロジェクトで '/arch:AVX2' を有効にする
Visual Studio 2013 プロジェクトで CMake を介して AVX2 コード生成を有効にしようとしていますが、これまでのところうまくいきません。
私が試したことは次のとおりです。
CMAKE_CXX_FLAGS_*
次のように含める/arch:AVX2
ように設定します。SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:AVX2")
- 次のようにターゲット プロパティを設定します
SET_TARGET_PROPERTIES("myproject" PROPERTIES COMPILE_FLAGS "/arch:AVX2")
。、(プロジェクトの生成に失敗)および. に置き換えCOMPILE_FLAGS
てみました。COMPILE_DEFINITIONS
COMPILE_FEATURES
COMPILE_OPTIONS
プロジェクトを生成しようとするたびに、CMake キャッシュを削除して、プロジェクト ファイルの生成の邪魔にならないようにします。
私は何が欠けていますか?これを明らかにするための助けをいただければ幸いです。御時間ありがとうございます。