問題タブ [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.
performance - SIMD/SSE 初心者: シンプルな画像フィルタリング
私は SIMD/SSE が初めてで、簡単な画像フィルタリング (ぼかし) をしようとしています。以下のコードは、水平方向の単純な [1 2 1] 重み付けを使用して、8 ビット グレー ビットマップの各ピクセルをフィルター処理します。一度に 16 ピクセルの合計を作成しています。
少なくとも私にとって、このコードの非常に悪い点は、挿入/抽出が多く含まれていることです。これはあまりエレガントではなく、おそらくすべてを遅くすることにもなります。シフト時にデータを 1 つの reg から別の reg にラップするより良い方法はありますか?
buf は、16 バイトでアラインされたイメージ データです。w/h は幅と高さで、16 の倍数です。
c++ - _mm_extract_ps SSE GCC instrinc 関数を使用して C/C++ で 16 進浮動小数点数を浮動小数点数に変換する方法
私は SSE コードを 2D 畳み込みに書いていますが、SSE のドキュメントは非常にまばらです。_mm_dp_ps でドット積を計算し、_mm_extract_ps を使用してドット積の結果を取得していますが、_mm_extract_ps はフロートを表す 16 進数を返し、この 16 進フロートを通常のフロートに変換する方法がわかりません。float を返す __builtin_ia32_vec_ext_v4sf を使用できますが、他のコンパイラとの互換性を維持したいと考えています。
私が見逃しているポイントは何ですか?
少し助けていただければ幸いです、ありがとう。
OpenSUSE 11.2
GCC 4.4.1
C++
コンパイラ オプション
-fopenmp -Wall -O3 -msse4.1 -march=core2
リンカ オプション
-lgomp -Wall -O3 -msse4.1 -march=core2
x86 - sse 命令を使用した複雑な Mul および Div
複雑な乗算と除算を SSE 命令で実行することは有益ですか? SSE を使用すると、足し算と引き算のパフォーマンスが向上することがわかっています。SSE を使用して複雑な乗算を実行し、パフォーマンスを向上させる方法を誰かに教えてもらえますか?
c++ - クラスとのSSEの調整
いくつかの本当に奇妙な問題があり、C++の初心者として私は理由がわかりません。
何らかの理由でDeviceSettingsを宣言すると、アプリがクラッシュし、DXSize変数が正しく配置されません。
ただし、これは32ビットモードでコンパイルされた場合のみです。64ビットモードで正常に動作します...
手がかりはありますか?明らかな何かが欠けていますか?
c - コンパイラが常に SSE sqrt 命令を使用するようにする
計算集約型の科学アプリケーションの数学ライブラリ関数の代わりに、GCC (または clang) が一貫して sqrt に SSE 命令を使用するようにしようとしています。さまざまな 32 ビットおよび 64 ビット OS X および Linux システムでさまざまな GCC を試しました。-mfpmath=sse (および -march=core2 で sse を有効にして、32 ビットで -mfpmath=sse を使用するという GCC の要件を満たすようにしています)。-O3 も使用しています。GCC または clang のバージョンによっては、生成されたアセンブリで SSE の sqrtss が一貫して使用されません。GCC の一部のバージョンでは、すべての sqrt がこの命令を使用します。他の例では、sqrtss と数学ライブラリ関数の呼び出しが混在しています。ヒントを与える方法や、コンパイラに SSE 命令のみを使用させる方法はありますか?
optimization - SSE2 組み込み関数: メモリーに直接アクセス
多くの SSE 命令では、ソース オペランドを 16 バイト アラインされたメモリ アドレスにすることができます。たとえば、さまざまな (un) pack 命令。PUNCKLBW には次の署名があります。
PUNPCKLBW xmm1, xmm2/m128
現在、これは組み込み関数ではまったく可能ではないようです。_mm_load* 組み込み関数を使用してメモリ内の何かを読み取ることが必須のようです。これは、PUNPCKLBW の組み込みです。
__m128i _mm_unpacklo_epi8 (__m128i a、__m128i b);
(私の知る限り、__m128i 型は常に XMM レジスタを参照します。)
さて、これはなぜですか?メモリを直接アドレス指定することで最適化の可能性が見られるので、かなり悲しいです...
c - パックされたSSEフロートの反転サイン
SSEレジスターにパックされた4つのフロートすべてのサインを反転させる最も効率的な方法を探しています。
Intelアーキテクチャソフトウェア開発マニュアルでこれを行うための本質を見つけていません。以下は私がすでに試したことです。
いずれの場合も、コードを100億回ループして、実時間を示しました。単項マイナス演算子のみを使用する非SIMDアプローチでは、少なくとも4秒を一致させようとしています。
[48秒]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9秒]
コンパイラは-O3を含むgcc4.2です。CPUはIntelCore2Duoです。
c++ - SSE を使用して符号なし整数間の絶対差を計算する
C では、2 つの unsigned int 間の絶対差を計算するブランチレス手法はありますか? たとえば、変数 a と b が与えられた場合、a=3、b=5、または b=3、a=5 の場合は値 2 が必要です。理想的には、SSE レジスターを使用して計算をベクトル化できるようにしたいと考えています。
x86 - SSEアクセス違反
私はコードを持っています:
これから私は得ます:
プログラムを実行すると、_mm_add_ps行でエラーが発生します。
オリジナルは_aligned_malloc(...、16);を使用して割り当てられます。同様に関数に渡されるので、sseについての私の理解では、それが整列されていないということではありません。
理由がわからないので、なぜこれがクラッシュするのか誰かがわかるのだろうか。
編集:幅と列は常に4の倍数です。列は0または4ですが、幅は常に4の倍数です。
EDIT2:元の配列が整列されていないようです。しません:
オリジナルが関数内で整列されていることを確認しますか?
Edit3:これは実際には本当に奇妙です。私がする時:
アサートは失敗します
x86-64 - movlpsのNASM64ビットイミディエートアドレスは「dwordデータが境界を超えています」
64ビット幅のイミディエートアドレスを持つ命令movlpsが必要です。これは、Intelのマニュアルによると完全に可能であるはずです。だから、このようなもの:
しかし、私が得たのは、NASMがオペランドサイズを32ビットに切り捨て、対応する警告を出力することだけです。
さまざまな形式のqwordプレフィックスを試しましたが、成功しませんでした。