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

assembly - アセンブリの学習を開始するのに適した場所はどこですか?

SSE命令を使用してアセンブリを学習し、ASMコードをcコードにリンクするためにgccが必要です。

私はどこから始めればいいのかわからず、グーグルは助けてくれませんでした。

0 投票する
6 に答える
45761 参照

performance - SSE スカラー sqrt(x) が rsqrt(x) * x よりも遅いのはなぜですか?

Intel Core Duo でコア数学の一部をプロファイリングしてきましたが、平方根へのさまざまなアプローチを見ていると、奇妙なことに気付きました: SSE スカラー演算を使用すると、逆数の平方根を取得して乗算する方が高速ですネイティブの sqrt オペコードを使用するよりも、sqrt を取得するには!

次のようなループでテストしています:

TestSqrtFunction のいくつかの異なるボディでこれを試してみましたが、本当に頭を悩ませているタイミングがいくつかありました。何よりも最悪だったのは、ネイティブの sqrt() 関数を使用し、「スマート」コンパイラに「最適化」させたことです。24ns/float で、x87 FPU を使用すると、これは非常に悪かった:

次に試したのは、組み込み関数を使用して、コンパイラに SSE のスカラー sqrt オペコードを使用させることでした。

これは 11.9ns/float で、より優れていました。また、 Carmack の風変わりな Newton-Raphson 近似手法も試しました。これはハードウェアよりもさらに優れた 4.3ns/float で実行されましたが、誤差は 2 10分の 1 でした (これは私の目的には多すぎます)。

逆数平方根の SSE 演算を試した後、乗算を使用して平方根 ( x * 1/√x = √x ) を取得したとき、おかしなことになりました。これには 2 つの依存する操作が必要ですが、1.24ns/float で 2 -14の正確さで、群を抜いて最速のソリューションでした。

私の質問は基本的に何を与えるのですか?SSE の組み込みのハードウェア平方根オペコードが、他の 2 つの数学演算から合成するよりも遅いのはなぜですか?

私が確認したので、これは実際には操作自体のコストであると確信しています:

  • すべてのデータはキャッシュに収まり、アクセスはシーケンシャルです
  • 関数はインライン化されています
  • ループを展開しても違いはありません
  • コンパイラフラグは完全最適化に設定されています(アセンブリは良好です、私はチェックしました)

(編集: stephentyrone は、数値の長い文字列に対する演算は、ベクトル化 SIMD パック演算を使用する必要があることを正しく指摘していますrsqrtps— しかし、ここでの配列データ構造はテスト目的のみです: 私が実際に測定しようとしているのは、コードで使用するためのスカラーパフォーマンスですこれはベクトル化できません)。

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

c - SSEを無効にした状態でのSSEレジスタの戻り

私は次の状況にあります:

  • SSE命令を許可しないカーネルのコードを書いています
  • 浮動小数点演算を行う必要があります
  • x86_64プラットフォーム用にコンパイルしています

問題を説明するコードサンプルを次に示します。

そして、これがmakefileの関連行です。

ビルドを実行すると、次のエラーが発生します。

(エラーは、dとbase_valueを乗算する行を指します)

これを修正するために私ができることはありますか?-mno-sseを削除することはオプションではありませんが、コンパイラーは乗算を行うために非sseコードを生成できるはずです。

ありがとうネイサン

0 投票する
9 に答える
4765 参照

java - 数値アルゴリズムにおける Java のパフォーマンス

Java 数値アルゴリズムのパフォーマンスについて興味があります。たとえば、最新の JIT マシンを使用して、手動で調整された SSE C++/アセンブラーまたは Fortran の対応するものと比較して、マトリックス マトリックスの倍精度乗算などです。

私は Web を見てきましたが、ほとんどの結果はほぼ 10 年前のものであり、それ以来 Java がかなり進歩したことを理解しています。

数値集約型のアプリケーションに Java を使用した経験がある場合は、その経験を共有していただけますか。また、ループが比較的短く、メモリアクセスがあまり均一ではないが、L1 キャッシュの制限内にあるカーネルで、Java はどの程度うまく機能するでしょうか? そのようなカーネルが連続して複数回実行される場合、JVM は実行時にそれを最適化できますか?

ありがとう

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

sse - SSE2: _m128 を単語に減らす方法

_m128 (4 単語 abcd) を 1 単語に減らす最善の方法 ( s​​se2 ) は何ですか? 各 _m128 コンポーネントの下部が必要です。

そのための組み込み関数はありますか? ありがとう !

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

gcc - SSE命令のベンチマーク

同じことを行う従来の C コードに対して、いくつかのSSEコード (4 つの float を 4 つの float で乗算する) のベンチマークを行っています。非 SSE コードは SSE よりも 2 ~ 3 倍高速であると思われるため、私のベンチマーク コードは何らかの形で間違っているに違いないと思います。

以下のベンチマーク コードの何が問題なのか教えてもらえますか? そしておそらく、SSE コードと非 SSE コードの両方の速度を正確に示す別のアプローチを提案してください。

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

gcc - C - GCC SSE ベクトル拡張を使用してベクトルの要素にアクセスする方法

通常、次のタイプを使用して 3D ベクトルを操作します。

smth を使用してベクトルを初期化します。お気に入り:

smth を使用してそれらにアクセスします。お気に入り:

ここで、SSE 命令を使用したベクトル演算が必要です。私は次のコードを持っています:

GCC はそのような方法をサポートしています。しかし...まず、結果として0.00000が得られます。次に、そのようなベクトルの要素にアクセスできません。私の質問は、そのようなベクトルの要素にどのようにアクセスできますか? 私はスマートが必要です。X 要素にアクセスするには a[0]、Y 要素にアクセスするには a[1] など。

PS: 次を使用してこのコードをコンパイルします。

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

gcc - SSE命令を使用した高速画像操作?

私はCでグラフィックライブラリを書いていますが、SSE命令を利用していくつかの機能を高速化したいと思います。どうすればこれを行うことができますか?私はGCCコンパイラーを使用しているので、コンパイラーの組み込み関数に頼ることができます。また、画像データの保存方法を変更する必要があるかどうかも知りたいです(現在はfloatの配列を使用しています)-タイプの配列を使用する必要がありfloat __attribute__ ((vector_size (16)))ますか?

編集:私が興味を持っている画像操作/処理のタイプには、アフィン変換、ジオメトリ、および周波数領域フィルタリングが含まれます(フーリエ解析)

Cでの画像操作にSSEを使用する方法についての参考資料やヒントをいただければ幸いです。

ありがとう

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

x86 - SSE に対する x87 の利点

x87 の方が内部精度が高いことはわかっています。これは、おそらく x87 と SSE 操作の最大の違いです。しかし、x87 を使用する利点は他にあるのでしょうか? 私はどのプロジェクトでも自動的に入力する習慣があり-mfpmath=sse、x87 FPU が提供する他の機能が欠けているのではないかと考えています。

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

c - メモリが整列しているかどうかを判断する方法は?

私は SSE/SSE2 命令を使用してコードを最適化するのは初めてで、今まであまりうまくいっていませんでした。私の知る限り、一般的な SSE 最適化関数は次のようになります。

ptrただし、メモリポイントが 16 バイトなどでアラインされているかどうかを正しく判断するにはどうすればよいでしょうか。この関数に渡されるすべてのメモリが整列されていることを確認できないため、整列されていないメモリの通常の C コード パスを含める必要があると思います。また、組込み関数を使用してアライメントされていないメモリから SSE レジスタにデータをロードするのは、非常に遅いようです (通常の C コードよりもさらに遅い)。

前もって感謝します...