問題タブ [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.
c++ - sseタイプの配列:セグメンテーション違反
今日、私はsseタイプ__m128dの配列を初期化しようとしました。残念ながら、それは機能しませんでした-なぜですか?sseタイプの配列を作成することは一般的に不可能ですか(レジスタタイプであるため)。次のコードは、ループ内の割り当てでsegfaultsします。
よろしく+ブーム
gcc - XMMレジスタのGCCサポートがひどく壊れていますか?
__m128iタイプを使用するコードについてGCCによって生成されたアセンブリコードを調べると、大惨事のように見えることがわかります。目的を果たさない冗長な命令がたくさんあります。
それでも、アセンブリプログラマーとしては、asm {}を使用したいのですが、GCCを使用すると、asm{}でXMMレジスタを使用できなくなります。
GCCにXMMを使用させるためのトリックはありますか、それとも将来のリリースを待つ必要がありますか?私は4.3.4を持っています。
assembly - 符号付き整数内のタプルのソート
SSE2 で 16+16 ビットのタプルを 32 ビット整数としてソートしています。比較と最小/最大の符号付き整数命令のみがあります。上位部分の順序は単なるハッシュであるため、問題はありません。しかし、負のハッシュを持つエントリは後方にソートされます (そうですか?)
- ハッシュの上位ビットをゼロにすると、精度が失われます (良くない)
- ハッシュの上位ビットが設定されている場合は位置を負に変換し、ソート後に元に戻します。
より良い方法はありますか?
optimization - 単語を並列にカウントするようにMITのビットカウントアルゴリズムを微調整しますか?
よく知られているMITビットカウントアルゴリズムのバージョンを使用して、SSE2命令を使用してコンウェイのライフゲームで隣人をカウントしたいと思います。
これがcのMITビットカウントで、63ビットを超えるビットカウントをカウントするように拡張されています。
これがPascalのバージョンです
この構造のビットを並行してカウントしようとしています。
この構造の中央に16ビットがあり、検索する必要があることに注意してください。SSE2を使用して、中央の16ビットのそれぞれのネイバーカウントを計算したいと思います。これを行うために、スライスAをXMM0ローワードワードに、スライスBをXXM0-dword1などに配置します。XMM0をXMM1にコピーし、XMM0のローワードのビットのビット
をマスクします。XMM0のワード1についても同じようにします。異なるスライスとマスクを使用して、XMM0とXMM1の各単語が異なるピクセルのネイバーを保持していることを確認します。012-456-89A
5
質問
MITビットカウントを微調整して、各XMMワードのワード/ピクセルあたりのビットカウントを取得するにはどうすればよいですか。
備考
ルックアップテーブルを使用したくないのは、すでにそのアプローチがあり、SSE2がルックアップテーブルへのメモリアクセスを必要としないことでプロセスを高速化するかどうかをテストしたいからです。
私はこれをDelphiでプログラミングしており、x86 + SSE2アセンブリコードを使用しているため、SSEアセンブリを使用した回答が最適です。
c - どちらが速いですか?
gcc 4.4.3 で SSE2 を使用しています。私のプログラムでは、128 ビット SIMD レジスタの少なくとも (0 ~ 7) 8 ビットを使用する必要があります。8 ビットをすばやく取得できる方法を提案してください。
_mm_movepi64_pi64
またはを試してみましたが_mm_extract_epi16
、どちらも私のプログラムで同様のパフォーマンスを発揮します。ユニオンアプローチも試していました。union{__m128i a1, int a2[4]}
. テストケースでは良い結果が得られましたが、私のプログラムでは、このアプローチはあまり良くありませんでした。
任意のアイデア.. (上記の 3 つの方法のどれを使用する必要がありますか?)
c++ - 厳密なエイリアシングと__m128iタイプ
SSE2組み込み関数を使用してビット単位の演算を行う場合、からint*
へのポインタをキャストする必要があり__m128i*
ます。このコードは厳密なエイリアシングルールに違反していますか?
ありがとうございました!
optimization - ベクトルの最適化されたビットシフトのためのアセンブリコード
BYTE-> BYTE、WORD-> WORD、DWORD->DWORDおよびWORD-> BYTE(結果に8ビットのみが存在すると仮定)。プロセッサのタイプに応じて、タイプごとに3つのルーチンが必要です(SSE2がサポートされ、MMXのみがサポートされ、標準の命令のみがサポートされます)。したがって、合計12個の関数が必要です。
必要なレジスタをバックアップおよび復元する方法、ループを作成する方法、データを通常のレジスタまたはMMXレジスタにコピーする方法、および論理的に1桁シフトする方法をすでに自分で見つけました。
私はそれについてのアセンブリ言語に精通していないので。各命令セットにどのレジスタを使用する必要がありますか?L1キャッシュ内の大きなベクター(画像)の可用性はどのように最適化されますか?ベクトルの次の要素(ポインターのようなもの)を見つけるにはどうすればよいですか?アドレスで移動できることはわかっていますが、データの種類に応じてアドレスを1、2、または4ずつインクリメントする必要があると思いますか?
私はすべてのアイデアを持っていますが、この時点でコードを書くのは少し難しいです。
ありがとうございました。
アルノー。
編集:これは、DWORDで1シフトするためにMMXに対して実行しようとしていることです。
c++ - SSE2の二重乗算は標準の乗算よりも遅い
SSE2命令を含む次のコードが、標準のC++実装よりも乗算の実行速度が遅いのはなぜか疑問に思います。コードは次のとおりです。
のメモリm_output.data
とinput().data
は_aligned_mallocで割り当てられています。
ただし、2 ^ 25アレイの場合、このコードを実行する時間は、このコードの時間(350ms)と同じです。
そんなことがあるものか?理論的には50%の時間しかかからないはずですよね?または、SIMDレジスタからm_output.data配列へのメモリ転送のオーバーヘッドは非常に高価ですか?
最初のスニペットの行を置き換えると
に
ここで__m128d tmp;
、コードは非常に高速に実行され、タイマー関数の解像度よりも低くなります。それは、すべてがメモリではなくレジスタに格納されているためですか?
さらに驚くべきことに、デバッグモードでコンパイルすると、SSEコードは93ミリ秒しかかかりませんが、標準の乗算は309ミリ秒かかります。
- デバッグ:93ms(SSE2)/ 309ms(標準乗算)
- リリース:350ms(SSE2)/ 350(標準乗算)
何が起きてる???
QtCreator2.2.1でMSVC2008をリリースモードで使用しています。RELEASE用のコンパイラスイッチは次のとおりです。
これらはDEBUG用です:
RELEASE vs DEBUGの問題に関する編集:コードのプロファイルを作成したところ、リリースモードでは SSEコードの速度が実際に遅くなっていることに注意してください。 これは、VS2008がオプティマイザで組み込み関数を適切に処理できないという仮説をどういうわけか確認するだけです。Intel VTuneは、DEBUGのSSEループで289ミリ秒、RELEASEモードで504ミリ秒を提供します。うわー...ただすごい...
c++ - Visual Studio 2010 および SSE 4.2
SSE 4.2 を有効にするには、Visual Studio 2010 で何を設定する必要がありますか? POPCNTが最適化されているので使いたいのですが...
すべての設定が問題ない場合、どうすればテストできますか?
ありがとう
さて、私はあなたのソリューションを使用しようとしまし<nmmintric.h>
たが、vstudio2010には含まれておらず、標準では:(の代わりに__popcnt
必要ですint
std::bitset<>
何か案が?
正しいヘッダーを持つヒントの Thx。ただし、次のようです: error C3861: '_mm_popcnt_u64': identifier not found
、 しか見つかりませんでしたが、 で使用する方法、または だけを使用する必要が_mm_popcnt_u32
あるかどうかはわかりません。コンパイラの z 設定がないと動かないですよね?bitset
bitset<>.count
誰も知らない ?
visual-studio - Visual Studio は、コンパイル済みコードの SSE2 レジスタ スピル カウントを教えてくれますか?
私は実際のコンパイラの知識がなく、選択したコードの部分に対して SSE2 関数を手作業でコーディングしていました。生成された機械語コードの読み方は知っていますが、コンパイラーによって可能になったクレイジーな最適化についてはほとんど知りません。私の作業はすべて Visual Studio を使用して行われます。
関数の一部の SSE2 レジスタ スピル カウントを Visual Studio が教えてくれる方法はありますか? その理由は、SSE2 ライクなコード (テンプレート) をすぐに大量生産できるようになり、それらのそれぞれを適切な品質のマシン コードにコンパイルしたいと考えているからです。それらのそれぞれを手動で確認することはおそらくできません。私が得たいと思っているのは、コンパイルされたコードが受け入れられ、簡潔であるというある種の保証です。最後の一滴まで搾る必要はありません。
__forceinline
または、 「__forcenospill」のように、コンパイラに SSE2 レジスタをスピルさせないようにするキーワードはありますか? (スピルが発生する必要がある場合、コンパイルは失敗するため、問題を認識して SSE2 コードをリファクタリングしようとします。)
一部の計算を高度に登録する必要があるため (「単純な操作」の 1 つのステップで 6 つ以上のオペランドを使用する必要があるため (注 #1)、既存のベクトル ライブラリまたはブリッターを使用することは論外です。中間値は 16 ビットに昇格されます)。または32ビットオンザフライで変換して戻すなど)一般的なベクトルライブラリで言い換えると、ランタイムが2倍または3倍になることを意味します(そこにいて、それを行いました)。
商用ツールも問題ありません。プロジェクトの性質を考えると、私は確かにそれを買う余裕があります。
そのようなツールがない場合は、プロファイリングに頼ります。この投稿に反対票を投じて、そのようなものが存在しないことを知らせてください。
ありがとう!
(注 #1) これは適応しきい値アルゴリズムです。