4

はい、SIMD コードの実行速度はスカラー コードよりも遅いと読みました。いいえ、それは実際には複製ではありません。

私はしばらくの間 2D 数学を使用しており、コードベースを C から C++ に移植する過程にあります。私が C でぶつかった壁はいくつかありますが、それは本当にポリモーフィズムが必要であることを意味しますが、それはまた別の話です。とにかく、私はこれを少し前に検討しましたが、一般的な数学演算の SSE 実装を含む 2D ベクトル クラスを使用する絶好の機会を提供しました。はい、そこにライブラリがあることは知っていますが、何が起こっているのかを理解するために自分で試してみたかったので、より複雑なものは使用しません+=.

私の実装は経由<immintrin.h>で、

union {
    __m128d ss;
    struct {
        double x;
        double y;
    }
}

SSE は遅いように見えたので、生成された ASM 出力を調べました。ばかげたポインターを修正した後、次の一連の命令を作成し、ループで 10 億回実行しました: (プロセッサは 3.7 GHz の AMD Phenom II です)

SSE 有効: 1.1 ~ 1.8 秒 (さまざま)

add      $0x1, %eax
addpd    %xmm0, %xmm1
cmp      $0x3b9aca00, %eax
jne      4006c8

SSE 無効: 1.0 秒 (ほぼ一定)

add      $0x1, %eax
addsd    %xmm0, %xmm3
cmp      $0x3b9aca00, %eax
addsd    %xmm2, %xmm1
jne      400630

このことから導き出せる唯一の結論は、addsdは よりも高速でaddpdあり、パイプライン処理は、部分的にオーバーラップするより高速な処理を実行する機能によって、追加の命令が補償されることを意味します。

だから私の質問は次のとおりです。これは価値がありますか、実際には実際に役立ちますか、それとも愚かな最適化を気にせずにコンパイラーにスカラーモードで処理させるべきですか?

4

3 に答える 3

7

これには、より多くのループのアンロールと、場合によってはキャッシュのプリフェッチが必要です。あなたの算術密度は非常に低いです.2つのメモリ操作に対して1つの操作なので、パイプラインでこれらをできるだけ多く詰め込む必要があります。

また、共用体ではなく __m128d を直接使用し、_mm_load_pd を使用してデータから __m128 を埋めます。ユニオン内の _m128 は、すべての要素が有害なスタック-レジスタ-スタック ダンスを実行している悪いコードを生成します。

于 2012-06-21T20:43:06.743 に答える
2

記録のために、Agner Fog の命令テーブルは、K10 が実行addpdされaddsd、同じパフォーマンスで実行されることを確認します。FADD ユニットの m-op は 1、レイテンシは 4 サイクルです。以前の K8 には 64 ビットの実行ユニットしかなく、addpd2 つの m-op に分割されていました。

したがって、両方のループには、4 サイクルのループ運搬依存関係チェーンがあります。スカラー ループには 2 つの別個の 4c dep チェーンがありますが、それでも FADD ユニットの占有時間は半分 (1/4 ではなく) です。

パイプラインの他の部分、おそらくコードのアライメントや単に命令の順序付けが機能し始めているに違いありません。AMDは、Intel、IIRCよりも敏感です。K10 パイプラインを調べて、Agner Fog のドキュメントに説明があるかどうかを調べるほど興味はありません。

K10 は cmp/jcc を単一の操作に融合しないため、それらを分割しても実際には問題になりません。(ブルドーザー ファミリーの CPU はそうですし、もちろん Intel もそうです)。

于 2015-12-24T12:21:02.367 に答える
1

2D の計算は (3D の計算と比較して) それほどプロセッサを集中的に使用するわけではないので、それほど多くの時間を費やす価値があるとは思えません。次の場合は最適化する価値があります

  1. あなたのプロファイラーは、コードがホット スポットであると言っています。
  2. コードの実行が遅い。(これはゲーム用だと思いますか?)
  3. 高レベルのアルゴリズムは既に最適化されています。

私はリグ (AMD APU @ 3GHz x 4; 古い Intel CPU @ 1.8Ghz x 2) でいくつかの SSE テストを行い、テストしたほとんどのケースで SSE が有益であることを発見しました。ただし、これは 2D ではなく 3D 操作用でした。

スカラー コードには、並列処理 iirc の可能性がより多くあります。2 つではなく 4 つのレジスタを使用。依存関係が少ない。レジスターの競合が大きくなると、ベクトル化されたコードがより適切に実行される可能性があります。ただし、それを一粒の塩で取ってください。私はそれをテストしていません。

于 2012-06-21T20:21:58.507 に答える