問題タブ [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.
algorithm - SSE/AVXで一意/重複排除を選択します
問題
x86SIMD命令を使用して、整数のセットのレジスタ内重複排除に計算上実行可能なアプローチはありますか?
例
4タプルレジスタR1={3、9、2、9}があり、レジスタR2 = {3、9、2、NULL}を取得したいとします。
制限
安定性。入力順序の保持は重要ではありません。
出力。ただし、削除された値/ NULLは、レジスタの最初または最後、あるいはその両方にある必要があります。
- {null、1、2、3}-OK
- {1、2、null、null}-OK
- {null、2、null、null}-OK
- {null、2、null、1}-無効な順序
- {null、null、null、null}-無効な出力
ある特定の出力フォーマットを生成することがわかっている場合、それは明らかにボーナスです。事実上0(ゼロ)を意味するNULLを想定してください。
一般性。重複がないことを許容できる必要があり、この場合、入力レジスタと同等の出力を生成します。
命令セット。次のいずれかまたはすべてのソリューションを探しています。SSE2-SSSE3; SSE4.x; AVX-AVX2
.net - .NET Framework 4.5 は SSE4/AVX をサポートしていますか?
聞いたことはあると思いますが、場所がわかりません。
更新:JiTについて話しました
sum - AVX を使用して一度に 4 つの水平方向の倍精度和を計算
この問題は次のように説明できます。
入力
出力
今までやってきた仕事
簡単そうに思えた: 2 つの VHADD の間にいくつかのシャッフルがあるが、実際には、AVX によって特徴付けられるすべての順列を組み合わせても、その目標を達成するために必要な順列そのものを生成することはできない。説明させてください:
x と y を同じ方法で並べ替えて取得できましたか?
それから
これは私が望んでいた結果です。
したがって、実行する方法を見つける必要があります
残念ながら、VSHUFPD、VBLENDPD、VPERMILPD、VPERM2F128、VUNPCKHPD、VUNPCKLPD の任意の組み合わせを使用しても、これはおそらく不可能であるという結論に達しました。問題の核心は、__m256d のインスタンス u で u[1] と u[2] を入れ替えることができないということです。
質問
これは本当に行き止まりですか?または、置換命令を見逃しましたか?
x86 - QWORD は、SIMD SSE...AVX を使用して順次 7 ビットをバイト境界にシャッフルします。
SIMD ファミリーの命令のいずれかで以下が可能かどうかを知りたいです。
有効ビット数が 63 の qword 入力があります (決して負ではありません)。LSB から始まる一連の 7 ビットはそれぞれ、バイトにシャッフル整列され、左パディングは 1 です (ゼロ以外の最上位バイトを除く)。説明のために、わかりやすくするために文字を使用します。
結果は、バイト配列に変換される 0 から 9 のサイズの有効なバイトのみです。
サイズ = 9
サイズ = 2
パディングが別であることは理解しています。シャッフル調整は私の質問です。これは可能ですか?
編集2
これが私の更新されたコードです。シングル スレッド Core 2 Duo 2 GHz、64 ビットでランダムな長さの入力に対して持続的な 46 M/秒を取得します。
assembly - 従来のSSEエンコードされた命令とVEXエンコードされた命令を同じコードパスに混在させても大丈夫ですか?
AVXの導入に伴い、IntelはVEXエンコーディングスキームをIntel64およびIA-32アーキテクチャに導入しました。このエンコード方式は、主にAVX命令で使用されます。VEXでエンコードされた命令と現在「レガシーSSE」命令と呼ばれている命令を混在させても大丈夫かどうか疑問に思いました。
私がこの質問をする主な理由は、コードサイズです。次の2つの手順を検討してください。
私は通常、最初のものを使用して、XMMレジスタ内のすべての場所にスカラー値を「ブロードキャスト」します。ここで、命令セットは、これら2つ(この場合)の唯一の違いは、VEXでエンコードされたものがYMMレジスタの上位(> = 128)ビットをクリアすることです。私がそれを必要としないと仮定すると、この場合、VEXでエンコードされたバージョンを使用する利点は何ですか?最初の命令は4バイト(0FC6C000
)、2番目の命令は-5(C5F8C6C000
)を取ります。
事前にすべての回答をありがとう。
c - SSE/AVX ベクター型の違い
_m256i
と_m256d
とはどう違い_m256
ますか?ととは
どう違いますか?_m128i
_m128d
_m128
c - 2 つの __m128 値を __m256 に結合する方法は?
__m128
2 つの値を 1 つに結合したいと思います__m256
。
このようなもの:
次のようなものに:
これを行うために使用できる組み込み関数はありますか?
c - __m128iで要素ごとの左シフトを実行する方法は?
私が見つけた SSE シフト命令は、すべての要素で同じ量だけシフトできます。
_mm_sll_epi32()
_mm_slli_epi32()
異なる要素に異なるシフトを適用する方法はありますか? このようなもの:
c - SSE/AVXベクトルを回転させる方法
できるだけ少ないクロックサイクルで回転操作を実行する必要があります。__m128i
最初のケースでは、sourceおよびdestタイプとして次のように想定します。
今、私はAVX組み込み関数で同じことをしたいと思います。したがって、今回__m256i
はsourceおよびdestタイプとして想定します。
AVX組み込み関数には、対応するSSE整数演算のほとんどがありません。おそらく、浮動小数点バージョンで目的の出力を機能させる方法があります。
私は試しました:
しかし、私が得るものは次のとおりです。
これを効率的な方法で解決する方法についてのアイデアはありますか?(SSEとAVXの操作を混合せず、「手動で」反転せずA0
、A1
前もって感謝します!
macos - g ++:AVXではそのような命令はありません
C ++で書いていたプログラム(もちろんAVX命令セットをサポートする最新のMacbook pro用)をコンパイルすると、次のエラーが発生しました。Macportsから入手したg++の最新リリースを使用しています。コンパイラが利用できる命令セットを制限せずにエラーを修正するために私ができることについて何かアイデアはありますか?特に更新してみるべきパッケージはありますか?
助けてくれてありがとう!