問題タブ [avx]
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 - SSEで比較を効率的に組み合わせるには?
次のコードを SSE/AVX に変換しようとしています。
ここで、N は小さな定数です。たとえば、8 とします。if(...) ステートメントは、ほとんどの場合、false と評価されます。
最初の試み:
これは機能し、かなり高速です。問題は、これを行うためのより効率的な方法があるかどうかです。特に、float での SSE または AVX 比較の結果を含むレジスターがある場合 (そのスロットに0xffff
orを置く0x0000
)、一般に、すべての比較の結果を (たとえば) and ed または or ed にするにはどうすればよいですか? ? PMOVMSKB
(または対応する_mm_movemask
組み込み)はこれを行う標準的な方法ですか?
また、上記のコードで SSE の代わりに AVX 256 ビット レジスタを使用するにはどうすればよいですか?
編集:
以下に示すように、VPTEST (_mm_test* 組み込み関数から) を使用してバージョンをテストし、ベンチマークしました。
これも機能し、高速です。これをベンチマークすると (Intel i7-2630QM、Windows 7、cygwin 1.7、cygwin gcc 4.5.3 または mingw x86_64 gcc 4.5.3、N=8)、64 ビットで上記のコードと同じ速度 (0.1% 未満) であることが示されます。 . 内側のループのどちらのバージョンも、すべてがキャッシュにあり、比較が常に false を返すデータに対して、平均約 6.8 クロックで実行されます。
興味深いことに、32 ビットでは、_mm_test バージョンの実行速度が約 10% 遅くなります。ループのアンロール後にコンパイラがマスクをスピルし、それらを再読み取りする必要があることが判明しました。これはおそらく不要であり、手作業でコーディングされたアセンブリでは回避できます。
どの方法を選択しますか? VPTEST
よりも優先するやむを得ない理由はないようですVMOVMSKPS
。実際には、優先するわずかな理由がありますVMOVMSKPS
。つまり、そうでなければマスクによって使用される xmm レジスタが解放されます。
intel - Intel SSE および AVX の例とチュートリアル
インテル SSE および AVX 命令を学習するための優れた C/C++ チュートリアルまたは例はありますか?
Microsoft MSDN と Intel のサイトで見つけたものはほとんどありませんでしたが、基本から理解することは素晴らしいことです..
c++ - m256_f32 に相当する GCC
Visual Studio 2010 で正常にコンパイルされる、次のような AVX C++ コードがあります。
ただし、GCC では次のエラーが発生します。
私はいくつかの調査を行いましたymm0.m256_f32
が、長い AVX レジスタから個々のフロートを抽出するための Microsoft 固有の命令のようです。しかし、gcc/linux で同じことを行うには何を使用できますか?
c - AVX の SSE unpacklo_ps/unpackhi_ps に相当 (double の場合)
SSE では、4 つの float を含む 128 ビットのレジスタがある場合、つまり
と
私が望むなら
私は簡単に行うことができます:
同様に、私が望むなら
できます:
double を含む AVX レジスタがある場合、単一の命令で同じことを行うことは可能ですか?
これらの組み込み関数がどのように機能するかに基づいて_mm256_unpacklo_pd()
、 、_mm256_shuffle_pd()
、_mm256_permute2f128_pd()
またはを使用できないことがわかっています_mm256_blend_pd()
。これら以外に使用できる指示はありますか、または上記の指示を組み合わせて使用する必要がありますか?
c++ - SSE / AVX のアラインされたメモリの valarray
valarray
SSE と AVX でベクトル化できるように、アライメントされたメモリを確実に使用する方法はありますか? 私の知る限り、STL はアラインメントを保証しておらず、アロケーターを valarray に渡すことはできません。これを達成する別の方法はありますか?
よろしくお願いします!
gcc - i87、AVXを同時に使用するが、SSEも使用しないgccオプション
AVX
拡張機能をサポートするプロセッサ用にコンパイルされた場合(たとえば適用可能)、キーを同時に-m64 -march=corei7-avx -mtune=corei7-avx
使用することは理にかなっていますか?コンパイラが3セットの命令( 、、 )を同時に-mfpmath=both -mavx
使用するほどではありませんか?または、スカラー(ある意味で)とベクトルのみの場合はどうでしょうか。i87
SSE
AVX
i87
AVX
gcc - MinGW (または gcc) の mfpmath オプション
コマンド ライン オプション (または) を使用したMinGWへの-march=corei7-avx -mtune=corei7-avx
または-march=corei7 -mtune=corei7 -mavx
コマンド ライン オプションは、数学ルーチンにAVX命令を使用できるようにしますか? from hereは機能しないことに注意してください( MinGWの最近のビルドでは「認識されないオプション」です)。-mfpmath=sse
-mfpmath=both
--with-fpmath=avx
sse - __m256d のすべての要素を、たとえば別の __m256d の 3 番目の要素に設定する方法は?
4 パックfloat
( __m128
) で、SSE 組み込み関数を使用できます
のすべての要素H
を の 3 番目の要素に設定しますX
(これが最速の方法ですか?)
double
今、私は 4 パック( )で同じことをしたいです__m256d
。私は素朴にコーディングしました
しかし、これは正しいことではありません。代わりに、H={X[1],X[1],X[3],X[3]} を設定します。
それで、それを正しく行う方法は?
編集
Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz を使用
c - AVX を使用した符号付き/符号なし整数の最小値
私は AVX 命令ガイドを調べていましたが、32 ビット整数値のロード、ストア、および置換操作がありますが、最小値または最大値の決定などの他の操作、またはシャッフル操作は float と double に対してのみ存在します。
したがって、これらの演算を 32 ビット整数に使用したい場合は、それを float に型キャストしてから型キャストする必要がありますか、それとも他に不足している命令がありますか?
また、32 ビット整数で使用したい場合、シャッフル マスクはフロートの場合と同じままですか?
x86 - 8つのパックされた32ビットフロートの水平方向の合計
8つのパックされた32ビット浮動小数点数(__m256
)がある場合、8つの要素すべての水平方向の合計を抽出する最も速い方法は何ですか?同様に、水平方向の最大値と最小値を取得するにはどうすればよいですか?言い換えれば、次のC ++関数の最適な実装は何ですか?