問題タブ [sse4]

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.

0 投票する
1 に答える
641 参照

c++ - SSEで__m128iベクトルの最小ショート値を取得しますか?

この質問は、SSE で __m128i ベクトルの最大値を取得しますか? に似ているようです。ただし、整数 + 最大の代わりに、短と最小を使用します。これは私が思いついたものです:

この関数は基本的に、x の上部と下部についてhttps://stackoverflow.com/a/18616825/1500111の回答と同じことを行います。したがって、最小値は __m128i 変数 max2 の位置 0 または 4 のいずれかにあることがわかっています。以下に示すSIMD 関数なしよりははるかに高速ですが 、最後の行horizontal_min_Vec4i_Plain(__m128i x)がボトルネックになっていると思います。_mm_extract_epi16 operationより良いスピードアップのために、これを達成するためのより良い方法はありますか? Haswell を使用しているので、最新の SSE 拡張機能にアクセスできます。

0 投票する
3 に答える
1523 参照

c - 最適な SSE 符号なし 8 ビット比較

SSE (SSE 4.2 まで) を使用して 8 ビットの符号なし比較を実行する最も効率的な方法を見つけようとしています。

私が取り組んでいる最も一般的なケースは、> 0U の比較です。

(もちろん、これは非ゼロの単純なテストと見なすこともできます。)

しかし、私はより一般的なケースにも多少興味があります。

最初のケースは、0 と比較して結果を反転するなど、さまざまな方法を使用して 2 つの命令で実装できます。2 番目のケースでは通常、3 つの命令が必要です。たとえば、両方のオペランドから 128 を減算し、符号付き比較を実行します。(さまざまな 3 つの命令ソリューションについては、この質問を参照してください。)

私が理想的に探しているのは、#1 の単一命令ソリューションと #2 の 2 つの命令ソリューションです。これらのどちらも可能でない場合、最新の Intel CPU (Sandy Bridge、Ivy Bridge、Haswell) で最も効率的な 2 つまたは 3 つの命令のさまざまな実装についての考えにも興味があります。


これまでのケース #2 の最適な実装:

    1. unsigned max と等しいかどうかを比較し、結果を反転します。

#define _mm_cmpgt_epu8(v0, v1) \ _mm_andnot_si128(_mm_cmpeq_epi8(_mm_max_epu8(v0, v1), v1), \ _mm_set1_epi8(-1))

2 つの算術命令 + 1 つのビット単位 = 1.33 スループット。

    1. 両方の引数の符号ビットを反転し (== 128 を減算)、符号付き比較を使用します。

#define _mm_cmpgt_epu8(v0, v1) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_xor_si128(v1, _mm_set1_epi8(-128)))

1 つの算術命令 + 2 つのビット単位 = 1.16 スループット。


上記のケース #2 の実装から派生した、ケース #1 の最適な実装:

  • 1.

#define _mm_cmpgtz_epu8(v0) \ _mm_andnot_si128(_mm_cmpeq_epi8(v0, _mm_set1_epi8(0)), \ _mm_set1_epi8(-1))

1 つの算術命令 + 1 つのビット単位 = 0.83 スループット。

  • 2.

#define _mm_cmpgtz_epu8(v0) \ _mm_cmpgt_epi8(_mm_xor_si128(v0, _mm_set1_epi8(-128)), \ _mm_set1_epi8(-128)))

1 つの算術命令 + 1 つのビット単位 = 0.83 スループット。

0 投票する
1 に答える
480 参照

assembly - SSE: パックされた各バイトの符号ビットをパックされたレジスタに抽出する方法は?

にパックされたバイトが与えられた場合xmm0、各バイトの符号 (つまり最上位) ビットを に抽出する効率的な方法は何xmm1ですか? ANDつまり、パックされたバイトごとに 0x80 で論理を計算したいと考えています。

例えば:

0 投票する
1 に答える
1053 参照

x86 - AVX または AVX2 は 256 ビット文字列命令と unsigned short の mullo をサポートしていますか?

AVXまたはISAでサポートされている文字列命令について調べましたが、 If there is any string comparison that I can't find them?AVX2のような 256 ビットの文字列比較命令が見つかりません。SSE4.2そうでなければ、なぜ AVX/AVX2 ISA は 256 ビット文字列命令をサポートしないのですか? また、AVX2 が 16 ビットの符号なし整数としてサポートmulloしていないこともわかりましたunsigned shortが、その理由はわかりません。でサポートされているためSSE4.2です。

0 投票する
1 に答える
320 参照

c - Knights Landing CPU (Xeon Phi) はバイト/ワード整数コードを高速化しますか?

Intel Xeon Phi "Knights Landing" プロセッサは、AVX-512 をサポートする最初のプロセッサになりますが、"F" (SSE2 なしの SSE、または AVX2 なしの AVX など) のみをサポートするため、主に浮動小数点が使用されます。

組み込み関数を介して最大 SSE4.1 命令を使用して、バイトとワード (8 ビットおよび 16 ビット) で動作するソフトウェアを作成しています。

AVX-512F にすべて/大部分の SSE4.1 命令の EVEX エンコード バージョンが存在するかどうか、また、これは私の SSE コードが EVEX 拡張命令を自動的に取得し、すべての新しいレジスタにマップできることを意味するかどうかについて混乱しています。

ウィキペディアは次のように述べています。

SIMD レジスタ ファイルの幅が 256 ビットから 512 ビットに増加し、合計 32 個のレジスタ ZMM0 ~ ZMM31 が含まれます。これらのレジスターは、AVX 拡張機能の 256 ビット YMM レジスターおよびストリーミング SIMD 拡張機能の 128 ビット XMM レジスターとしてアドレス指定できます。EVEX を使用する場合、従来の AVX および SSE 命令を拡張して、16 個の追加レジスター XMM16-XMM31 および YMM16-YMM31 で動作させることができます。エンコードされたフォーム。

残念ながら、AVX512 対応の SSE4 コードをコンパイルすると、AVX2 にコンパイルした場合と同じ (驚くべき) 高速化が得られるかどうかは明確ではありません (レガシー命令の VEX コーディング)。

AVX-512F 用に SSE2/4 コード (C 組み込み関数) をコンパイルするとどうなるか知っている人はいますか? バイトおよびワード命令の AVX1 の VEX コーディングのようなスピード バンプを期待できますか?

0 投票する
1 に答える
1502 参照

assembly - バイトを xmm0 レジスタにコピーする方法

次のコードは問題なく動作しますが、xmm0 のデータのみを必要とする最終結果を考えると非効率的です。

SSE2、SSE4などを使用していると確信しています.CMDバッファを使用する必要のないより良い方法がありますが、その方法を見つけるのに苦労しています.