問題タブ [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 投票する
3 に答える
1584 参照

sse - SIMDプログラミング

Core2Duoプロセッサー(コンパイラーgcc 4.4.1)で利用可能なSSE拡張命令を使用しています。それぞれ128ビット長の16個のレジスタが使用可能であることがわかります。これで、4つの整数値を1つのレジスタに、4つを別のレジスタに収容でき、組み込み関数を使用してそれらを1つの命令に追加できます。明らかな利点は、この方法では4つではなく1つの命令しか必要としないことです。

私の質問は「SIMDはこれで全部ですか?」です。a1、a2、a3、a4、a5、a6、a7、a8とb1、b2、b3、b4、b5、b6、b7、b8があるとします。A1、A2をベクトルレジスタとします。ここで、A1 <<<(a1、a2、a3、a4)およびB1 <<<(b1、b2、b3、b4)、およびadd(A1、B1)がベクトル加算を実行します。

A2 <<<(a5、a6、a7、a8)、B2 <<<(b5、b6、b7、b8)とします。add(A1、B1)とadd(A2、B2)を同時に実行できるadd命令はありますか。

core2duoで使用できるベクトル関数単位の数と、これらの情報はどこで入手できますか?

これらに関連するその他の情報源は高く評価されています。

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

c++ - g++ を使用した sse インライン アセンブリ

g++ インライン アセンブリと sse を試して、最初のプログラムを作成しました。セグメンテーション違反 - なぜですか?

また、gdb でアセンブリ命令をシングルステップで実行できないのはなぜですか? すべての行に asm ("..") を記述する必要がありますか?

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

gcc - Mac での SSE4.1 組み込みコンパイル エラー

SSE4.1 組み込み関数をサポートしている (と思う) ハードウェアで SSE4.1 組み込み関数を使用するのに問題があります。私が何かを逃したかどうか誰かに教えてもらえますか?

MacBookPro5,4 (Penryn) で次のコードをビルドします。

次のエラーが生成されます。

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

c - GCC での除算の SIMD (SSE) 命令

可能であれば、SSE 命令を使用して次のスニペットを最適化したい:

これはまったく可能ですか?

0 投票する
8 に答える
2830 参照

c++ - SSE Stdlib風のライブラリ?

一般的に、SSE / MMXに関連して「ネット上で」出くわすものはすべて、ベクトルとマトラシーの数学的なものとして出てきます。ただし、 Agner Fogが提供するような、SSEに最適化された「標準関数」のライブラリ、またはGCCのSSEベースの文字列スキャンアルゴリズムの一部を探しています。

簡単な一般的な要約として:これらは、memset、memcpy、strstr、memcmp BSR / BSF、つまりSSEintrsuctionsから構築されたstdlib風のものになります。

アセンブリではなく組み込み関数を使用するSSE1(正式にはMMX2)用にするのが望ましいですが、どちらでも構いません。うまくいけば、これはあまり広い範囲ではありません。

アップデート1

いくつか検索した後、私はいくつかの有望なものに出くわしました、1つのライブラリが私の目を引きました:

  • LibFreeVec:mac / IBMのみのようです(AltiVecベースであるため)、したがって(私には)ほとんど役に立ちません。さらに、直接ダウンロードリンクが見つからないようです。また、サポートされている最小のSSEバージョンも記載されていません。

また、いくつかのベクトル化された文字列関数(strlen、strstr strcmp)に関する記事に出くわしました。ただし、SSE4.2は私の手の届かないところにあります(前に述べたように、SSE1 / MMXに固執したいと思います)。

アップデート2

Paul Rは、少しベンチマークを行うように動機付けました。残念ながら、私のSSEアセンブリコーディングの経験はzipに近いため、他の誰か(http://www.mindcontrol.org/~hplus/)のベンチマークコードを使用して追加しました。完全/カスタマイズされた最適化を使用してVC9SP1でコンパイルされたすべてのテスト(元のVC6 SP5を除く)/arch:SSE

最初のテストは、SSE1でキャップされた私のホームマシン(AMD Sempron 2200+ 512mb DDR 333)の1つでした(したがって、MSVC memcpyによるベクトル化はありません):

完全なテスト

2番目のテストバッチは、大学のワークステーション(Intel E6550、2.33Ghz、2gb DDR2 800?)で実行されました。

完全なテスト

ご覧のとおり、SSEは私のホームシステムでは非常に高速ですが、Intelマシンでは機能しません(おそらくコーディングが不適切なためですか?)。私のx86アセンブリバリアントは、自宅のマシンで2番目、Intelシステムで2番目になります(ただし、結果は少し一貫性がないように見えます。1つの抱擁がSSE1バージョンを支配します)。MSVC memcpyは、手作業で行われたIntelシステムテストに勝ちます。これはSSE2のベクトル化によるものですが、私の自宅のマシンでは、ひどいものでさえも__movsdそれを打ち負かします...

落とし穴:メモリはすべて2の累乗で調整されていました。キャッシュは(うまくいけば)フラッシュされました。タイミングにはrdtscを使用しました。

興味深い点:MSVCには(どの参照にもリストされていない)__movsd組み込み関数があり、使用しているのと同じアセンブリコードを出力しますが、(インライン化されている場合でも)陰気に失敗します。それがおそらくその非公開の理由です。

VC9 memcpyは、sse 2以外のマシンで強制的にベクトル化することができますが、FPUスタックが破損しますが、バグもあるようです。

これは、私がテストに使用したものの完全なソースです(これも、オリジナルのhttp://www.mindcontrol.org/~hplus/へのクレジットを含みます)。プロジェクトファイルのバイナリは、リクエストに応じて利用できます。

結論として、MSVC crtのものと同様に、スイッチングバリアントが最適であるように思われますが、より多くのオプションと単一の1回限りのチェック(インライン関数ポインターを介して?または内部直接呼び出しのようなより悪質なものを介して)ではるかに頑丈ですパッチ)、ただし、インライン化はおそらく代わりに最良の方法を使用する必要があります

アップデート3

Eshanが尋ねた質問は、これに関連する有用なものを思い出させました。ビットセットとビット演算、BitMagicのみで、大きなビットセットに非常に役立ちますが、 SSE2(ビット)最適化に関するすばらしい記事もあります。残念ながら、これはまだCRT/stdlib風のタイプライブラリではありません。これらのプロジェクトのほとんどは、(問題の)特定の小さなセクションに専念しているようです。

これは疑問を投げかけます。オープンソースの、おそらくマルチプラットフォームのパフォーマンスcrt / stdlibプロジェクトを作成し、それぞれが特定の状況に最適化されたさまざまなバージョンの標準化された関数と「ベストケース」を作成することは価値がありますか? '/関数の汎用バリアント。スカラー/MMX/ SSE / SSE2 +(MSVC)のランタイム分岐または強制コンパイル時のスカラー/SIMDスイッチのいずれかを使用します。

これは、HPC、またはパフォーマンスのすべてのビットが重要なプロジェクト(ゲームなど)に役立つ可能性があり、プログラマーは組み込み関数の速度について心配する必要がなく、最適な最適化されたバリアントを見つけるためにわずかな調整が必要です。

アップデート4

この質問の性質を拡張して、SSE / MMXを使用して非ベクトル/マトリックスアプリケーションの最適化に適用できる手法を含める必要があると思います。これは、おそらく32/64ビットスカラーコードにも使用できます。良い例は、スカラー技術(ビット操作)、MMXおよびSSE / SIMDを使用して、特定の32/64/128/256ビットデータ型のバイトの発生を一度にチェックする方法です。

また、「ICCを使うだけ」という答えがたくさんありますが、それは良い答えです。まず、ICCは継続的に使用できるものではないため、私のような答えではありません(Intelに無料の学生版がない限り)Windowsの場合)、30回の試行のため。第二に、そしてより適切には、私はライブラリ自体だけでなく、ライブラリに含まれる関数を最適化/作成するために使用される技術を個人的な教育と改善のために使用しているので、そのような技術と原則を自分のコードに適用できます(必要に応じて)、これらのライブラリの使用と組み合わせて。うまくいけば、それはその部分をクリアします:)

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

c - 古いバージョンのGCCでのDPPS

ヘイ!

cの行列乗算コードを最適化する必要があり、SSEベクトル命令を使用して実行しています。また、ドット積dppsの命令がすでにあるSSE4.1が存在することもわかりました。

問題は、このソフトウェアが動作するはずのマシンに、SSE4.1をサポートしていない古いバージョンのgcc(4.1.2)がインストールされているが、それをサポートするプロセッサがあることです(理由を聞かないでください) gccバージョンはプロセッサより古いです...)。そのため、_mm_dp_ps関数を使用できません。

cにアセンブラコードを追加して少し遊んでいました。問題は、これまでアセンブラコードを使用したことがないため、非常に混乱することです。また、アセンブラでベクトル命令を処理するすべてのコードを記述する方が効率的ですか?

だから私はここでdpps命令を使用する他の方法があるかどうか、そしてそれが使用する価値があるかどうかを尋ねていますか?

0 投票する
4 に答える
2333 参照

c - SSE 組み込み関数を使用して連続しないメモリ位置に値を格納する方法は?

私は SSE の初心者で、組み込み関数を使用してコードのセクションを最適化しました。操作自体には満足しているのですが、結果の書き方をもっとうまくできないかと模索中です。結果は 3 つの_m128i変数になります。

私がやろうとしているのは、結果値から特定のバイトを連続しないメモリ位置に保存することです。私は現在これをやっています:

ここyで、、、cbおよびcrはバイト ( unsigned char) 配列です。私が定義できない理由から、これは私には間違っているようです。より良い方法について何か提案はありますか?

ありがとう!

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

f# - F# での SSE3 命令

SSE3 命令セットを使用して F# プログラムを並列化するにはどうすればよいですか? F# コンパイラはそれをサポートしていますか?

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

c++ - 私のコンパイラは何をしていますか?(memcpyの最適化)

VC ++ 2010の次の設定を使用して、少しコードをコンパイルしています:/ O2 / Ob2 / Oi / Ot

ただし、生成されたアセンブリの一部を理解するのに問題があります。コードにコメントとしていくつかの質問を入れました。

また、現代のCPUで一般的に推奨されるプリフェッチ距離はどれくらいですか?私は自分のCPUでテストすることができますが、より広い範囲のCPUでうまく機能する値を期待していました。たぶん、動的なプリフェッチ距離を​​使用できますか?

<-編集:

私が驚いたもう1つのことは、コンパイラーがmovdqa命令とmovntdq命令を何らかの形でインターリーブしないことです。これらの命令はある意味で私の理解から非同期であるため。

このコードは、プリフェッチ時に32バイトのキャッシュラインも想定していますが、ハイエンドCPUには64バイトのキャッシュラインがあるように見えるため、プリフェッチのうち2つを削除できる可能性があります。

->

元のコード:

0 投票する
4 に答える
1196 参照

algorithm - SIMD 最適化パズル

SIMD(SSE2など)を使用して次の関数を最適化したい:

これは、必要な命令がそこにないことを除いて、非常にベクトル化可能なタスクのように思えます...

N は非常に大きく (10^12 から 10^18)、size~sqrt(N) であると仮定できます。また、p は -1、0、および 1 の値しかとれないと仮定することもできます。したがって、実際の乗算は必要ありません。(N/i)*p[i] は、何らかの方法で N/i を計算できれば、4 つの命令 (pcmpgt、pxor、psub、pand) で実行できます。