問題タブ [sse2]
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.
x86 - 4つの32ビット整数のSSE乗算
4つの32ビット整数に別の4つの整数を掛ける方法は?それができる命令は見つかりませんでした。
c++ - SSE2整数オーバーフローチェック
PADDD
(つまり、_mm_add_epi32
組み込み)などのSSE2命令を使用する場合、いずれかの操作がオーバーフローしたかどうかを確認する方法はありますか?
オーバーフロー後にMXCSR制御レジスタのフラグが設定されるのではないかと思いましたが、そうはいきません。たとえば、_mm_getcsr()
以下の両方の場合で同じ値を出力します(8064)。
SSE2のオーバーフローをチェックする他の方法はありますか?
c++ - 配列のすべての要素を追加する SSE 命令
SSE2命令は初めてです。_mm_add_epi8
2 つの配列要素を追加できる命令を見つけました。しかし、配列のすべての要素を追加できる SSE 命令が必要です。
私はこのコードを使用してこの概念を開発しようとしていました:
SSE2命令を使用して配列のすべての要素を追加する方法を教えてください。
どんな助けでも大歓迎です。
x86 - Intel で SSE2 を使用して、オーバーフローのない符号なしバイトの合計削減
Intel i3 プロセッサで 32 要素 (各 1 バイト データ) の合計削減を見つけようとしています。これは私がしました:
ただし、私のアプリケーションはリアルタイム アプリケーションなので、時間がかかります。最終的な合計が 255 を超える可能性があることに注意してください。
低レベルの SIMD SSE2 命令を使用してこれを実装する方法はありますか? 残念ながら、私は SSE を使用したことがありません。この目的でsse2関数を検索してみましたが、これも利用できません。このような小さなサイズの問題の計算時間を短縮することは (sse) 保証されていますか?
助言がありますか??
注: OpenCL と CUDA を使用して同様のアルゴリズムを実装しましたが、問題のサイズが大きい場合にのみうまく機能しました。小規模な問題の場合、オーバーヘッドのコストはより多くなりました。SSEでの動作がわからない
c - SSE 2 関数の実行タイミングが一定ではなく、通常より多い
Intel core2Duo で SSE 2 を使用。
sse_add() と normal_add() に費やされた時間は、複数回の実行では一定ではなく、実際、いくつかの変更後は常に 0 になります。
プログラムは基本的に、次の行列の各列の合計を見つけます。
結果を確認しましたが、両方の機能で正しくなっています。
なぜそれが起こっているのですか?それとも、時間をきちんと計っていないからでしょうか?お使いのマシンで同じコードを実行して確認していただけますか?
更新された提案に基づいて、以下に示すように for ループを配置しましたが、時間はまだ 0 になっています (明らかに、正しい値を得るには合計時間を反復回数で割る必要がありますが、なぜ合計を取得しているのか時間 0?):
}
元のプログラムは次のとおりです。
*更新:すべての printf と malloc を削除しました*
タイミング機能は、個別のプログラムで 1 つずつ機能します。
SSEバージョン
通常版
x86 - SSE2を使用したpackusdw機能のシミュレーション
Intel [pdf]で説明されているアルゴリズムに従って、 pixmanに高速のx888->565ピクセル変換関数を実装しています。彼らのコードは、私が565に変換したいのに、x888-> 555に変換します。残念ながら、565に変換すると、上位ビットが設定されます。つまり、signed-saturationpack命令を使用できません。unsigned pack命令は、SSE4.1まで追加されませんでした。SSE2でその機能を実装するか、これを行う別の方法を見つけたいと思います。packusdw
この関数は、それぞれ4つの32ビットピクセルを含む2つのXMMレジスタを受け取り、8つの変換されたRGB565ピクセルを含む1つのXMMレジスタを出力します。
私が考えたアイデア:
0x8000を減算
_mm_packs_epi32
し、各565ピクセルに0x8000を再度追加します。私はこれを試しましたが、これを機能させることができません。データをパックする代わりにシャッフルします。MMXで機能しますが、SSE 16ビットシャッフルは高または低64ビットでのみ機能するため、面倒になります。
上位ビットを保存し、それらをゼロに設定し、パックを実行し、後でそれらを復元します。かなり散らかっているようです。
これを行うことができる他の(うまくいけばより効率的な)方法はありますか?
c - SSE 組み込み関数で使用するために 16 ビット整数を整列する方法
次のように定義された 16 ビット整数の 2 次元配列を使用しています。
Max_SIZE
とは定数MAX_NODE
値です。私はプロのプログラマーではありませんが、StackOverflow の人々の助けを借りて、データに SSE 命令を展開するコードを書くことができ、大幅なスピードアップを達成しました。現在、データ アライメントを必要としない組み込み関数 (主に_mm_loadu_si128
と_mm_storeu_si128
) を使用しています。
組込み関数を整列されたデータ (つまり_mm_load_si128
と_mm_store_si128
) に対応するものに変更すると、実行時エラーが発生し、データが適切に整列されていないという仮定につながります。
私の質問は、私のデータが適切に配置されていない場合、対応する組み込み関数を使用できるように配置するにはどうすればよいですか? 整数は16ビットなので、自動的に整列されると思います。しかし、私は間違っているようです!
これに関する洞察は高く評価されます。
ありがとう!
sse - メモリから xmm レジスタに 32 ビットをロードする
インライン アセンブリ:
同等の組み込みコードは何ですか?
c++ - float4::set_wxy (およびその他の set-swizzle ops) のより良い SSE2 実装?
SSE2/AVX 組み込み関数を使用して C++ で HLSL float4 準拠の型を作成しています。現在、HLSL の float4 で使用できるすべてのセット スウィズル操作を実装しています。2 つまたは 3 つのコンポーネントの設定 (スウィズル) を含むセット スウィズル操作に対処するための最適な SSE2 実装を見つけようとしています (4 コンポーネントのセット スウィズルは 1 つの SSE シャッフル操作で実装するのは簡単なので)。たとえば、少なくとも 4/5 の SSE シャッフル ops なしで set_wxy を実装するより良い方法を理解することはできません。
SSE2以外の操作を使用せずに、より良い実装のアイデアを持っている人はいますか? SSE4/AVX で _mm_blend_ps を認識しているため、プリプロセッサ条件を介して使用できる場合に使用しますが、少なくとも SSE2 のみのコード パスをサポートしたいと考えています。前もって感謝します!
編集: この関数の動作の例は次のとおりです。
基本的に set_wxy は、x、y、z の引数をこの順序で使用して w、x、y コンポーネントを設定します。元の z 値は保持されます。
c++ - SSE2、Visual Studio 2010、およびデバッグ ビルド
最適化が無効になっている間、コンパイラは SSE2 を自動的に使用できますか?
最適化が無効になっている場合、/arch:SSE2 フラグは何か意味がありますか?
私は、ソフトウェアのパフォーマンスをさらに引き出すという任務を与えられました。残念ながら、リリース ビルドはデバッグ設定を使用して行われ、最適化のケースについて議論する試みは今のところ成功していません。
コンパイラ フラグを使用して x86 用にコンパイルし/ZI /Od /arch:SSE2 /FAs
ます。生成されたアセンブリは、コンパイラが を利用していないことを示していますSSE2
。これは、最適化が無効になっているためですか?
コードには、次のような状況がいくつかあります。
コンパイラーにこの操作をベクトル化してもらいたいのですが、そうではありません。最適化を有効にする必要があると思います。
私は 2 つのソリューションを手作業でコーディングしました。1 つはインライン__asm
ブロックを使用し、もう 1 つは で定義された SSE2 組み込み関数を使用し<emmintrin.h>
ます。これに頼らない方がいいです。
アップデート
memcpy
上記の質問に加えて、必要に応じて提供されたベクトル化されたバージョンを使用するために、ライブラリ関数の呼び出しを希望します。のアセンブリ コードを見ると、 コピーを高速化するために を使用するmemcpy
関数が呼び出されていることがわかります。このルーチンに分岐するかどうかを決定するブロックは次のとおりです。_VEC_memcpy
SSE2
私はそれが呼び出されているとは思わない_VEC_memcpy
...今まで.