問題タブ [sse]

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 投票する
5 に答える
6785 参照

c - ダブル数値が整数であるかどうかをテストする最速の方法は何ですか(最新のIntel X86プロセッサの場合)

私たちのサーバーアプリケーションは、ホットコードパスで多くの整数テストを実行します。現在、次の関数を使用しています。

この関数は私たちのワークロードで非常にホットなので、できるだけ速くしたいと思います。また、可能であれば、「フロア」ライブラリ呼び出しを削除したいと思います。助言がありますか?

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

c - 128ビットのC変数とxmmの128ビットのasmを操作する方法は?

gccでは、asmコードを介して2つのC変数で128ビットのxorを実行したい:どのように?

しかし、セグメンテーション違反エラーがあります。これはobjdumpの出力です。

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

c++ - VC++ SSE 固有の最適化の奇妙さ

ファイルから 8 ビット データの分散読み取りを実行しています (64 チャンネルの Wave ファイルのインターリーブ解除)。次に、それらを結合して単一のバイト ストリームにします。私が抱えている問題は、書き出すデータの再構築にあります。

基本的に、私は 16 バイトを読み取り、それらを単一の __m128i 変数に構築し、_mm_stream_ps を使用して値をメモリに書き戻しています。ただし、いくつかの奇妙なパフォーマンス結果があります。

最初のスキームでは、_mm_set_epi8 組み込み関数を使用して __m128i を次のように設定します。

基本的に、最高のパフォーマンスを得るためにどのように最適化するかはコンパイラに任せています。これにより、最悪のパフォーマンスが得られます。MY テストは ~0.195 秒で実行されます。

2 番目に、4 つの _mm_set_epi32 命令を使用してマージし、それらを圧縮しようとしました。

これにより、パフォーマンスが多少向上します。私のテストは現在、約 0.15 秒で実行されます。とにかくこれがまさに _mm_set_epi8 が行っていることだと思いますので、これを行うことでパフォーマンスが向上するという直感に反するようです...

私の最後の試みは、4 つの CC を昔ながらの方法で (シフトと or を使用して) 作成し、単一の _mm_set_epi32 を使用してそれらを __m128i に配置したコードを使用することでした。

これにより、さらに優れたパフォーマンスが得られます。テストの実行に約 0.135 秒かかります。私は本当に混乱し始めています。

そこで、単純な読み取りバイト書き込みバイト システムを試してみましたが、最後の方法よりもわずかに高速です。

それで、何が起こっているのですか?これはすべて直感に反するように思えます。

データの供給が速すぎるため、_mm_stream_ps で遅延が発生しているという考えを検討しましたが、何をしてもまったく同じ結果が得られます。最初の 2 つの方法は、16 の負荷がループを介して分散されず、レイテンシが隠蔽されていないことを意味している可能性はありますか? もしそうなら、これはなぜですか?確かに、組み込み関数により、コンパイラーは好きな場所で最適化を行うことができます..それが全体のポイントだと思いました...また、16回の読み取りと16回の書き込みを実行すると、SSEジャグリングの束で16回の読み取りと1回の書き込みよりもはるかに遅くなります。命令...結局のところ、読み取りと書き込みが遅いビットです!

何が起こっているのかアイデアを持っている人なら誰でも大歓迎です!:D

編集:以下のコメントに加えて、バイトを定数としてプリロードするのをやめ、これに変更しました:

これにより、パフォーマンスが最大 0.143 秒に向上しました。そのままの C 実装ほど良くはありません ...

もう一度編集:これまでに得た最高のパフォーマンスは

これにより、約 0.095 秒で処理できます。これはかなり優れています。私はSSEに近づくことができないようですが...私はまだそれに混乱していますが..うーん。

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

c++ - x86 XMM レジスターに、別の XMM レジスター エントリから 4 つの同一の浮動小数点数を入力するにはどうすればよいですか?

SSE を利用するために、(C/C++ コードで) インライン アセンブラを実装しようとしています。値を (XMM レジスターまたはメモリから) 別の XMM レジスターにコピーおよび複製したいと考えています。たとえば、メモリに値 {1, 2, 3, 4} があるとします。これらの値をコピーして、xmm1 に {1, 1, 1, 1}、xmm2 に {2, 2, 2, 2} などを入力するようにします。

Intel のリファレンス マニュアルを調べたところ、これを行うための説明が見つかりませんでした。繰り返される MOVSS とローテーションの組み合わせを (PSHUFD 経由で) 使用する必要がありますか?

0 投票する
2 に答える
2701 参照

arm - 一般的な SIMD 手法

一般的な SIMD トリックに関する情報はどこにありますか? 私は命令セットを持っており、トリッキーでない SIMD コードの書き方を知っていますが、SIMD は今でははるかに強力です。複雑な条件分岐のないコードを保持できます。
たとえば ( ARMv6)、次の一連の命令は、Rd の各バイトを Ra と Rb の対応するバイトの符号なし最小値に等しく設定します。

チュートリアルへのリンク / 珍しい SIMD テクニックも良いです :) ARMv6は私にとって最も興味深いものですが、x86 (SSE、...)/ Neon (ARMv7)/その他も良いです。

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

gcc - GCC 拡張 ASM 構文: 128 ビットのメモリ位置をソースとしてロード

GCC は、以下の shuffle() に対してこのコードを生成します。

理想的には、これは次のようにする必要があります。

この単一の命令を生成するための拡張 ASM 構文は何ですか?

どうもありがとう、アダム

PS: コメントアウトされた組み込み関数は、この例に最適なコードを生成します。これは一般的には機能しません (GCC は、グローバル レジスタ変数が存在する場合、不要なレジスタ コピーを生成する可能性があります)。

$ gcc -Os -std=gnu99 -msse4.1 -flax-vector-conversions pshufb_128bit_constant.c && objdump -d -m i386:x86-64:intel a.out |less

0 投票する
2 に答える
3549 参照

assembly - 2 つの x86 32 ビット レジスタを 128 ビット xmm レジスタに格納する

2 つの x86 32 ビット レジスタを 1 つの 128 ビット xmm レジスタに格納するより高速な方法はありますか?

したがって、EAX が0x12345678で EDX が0x87654321の場合、xmm0 の結果は でなければなりません0x8765432112345678

0 投票する
5 に答える
1184 参照

x86 - myNum + = a [b [i]] *c[i];をベクトル化することは可能ですか。x86_64で?

x86_64で以下をベクトル化するためにどの組み込み関数を使用しますか(ベクトル化が可能である場合)?

0 投票する
2 に答える
6049 参照

qt - Qt、GCC、SSE、およびスタックの配置

GCCでコンパイルされ、QtとSSEの組み込み関数を使用してプログラムを作成しようとしています。私の関数の1つがQtによって呼び出された場合、スタックの配置が保持されないようです。これが私が何を意味するかを説明するための短い例です:

出力は次のとおりです。

構成:

  • Intel Core2
  • WinXP、SP3
  • GCC 4.4(Qt SDK 2010.01に含まれるMing​​w)

Qtmakefileで見たものと同じオプションを使用してサンプルプログラムをコンパイルしようとしました。

、リンクオプション:

今、私はどの方向に検索するべきかわかりません。ヒントをいただければ幸いです。ありがとう!

ファビアン

0 投票する
2 に答える
1077 参照

assembly - SSE でプレフィックスを組み合わせる

SSE では、接頭部066h(オペランド・サイズのオーバーライド) 0F2H(REPNE) および0F3h(REPE) はオペコードの一部です。

非 SSE066hでは、32 ビット (または 64 ビット) と 16 ビットの操作を切り替えます。 文字列操作に使用されます0F2h。と(または) を同じ命令で使用できる0F3hように、それらを組み合わせることができます。これは意味があるためです。SSE 命令の動作は何ですか? たとえば、次のようになります (ここでは mod/rm を無視します)。066h0F2h0F3h

しかし、これは何ですか?

そしてどうですか?

競合する 2 つの REP プレフィックスを持つ次のものは言うまでもありません。

これらの仕様は何ですか?