はい、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
あり、パイプライン処理は、部分的にオーバーラップするより高速な処理を実行する機能によって、追加の命令が補償されることを意味します。
だから私の質問は次のとおりです。これは価値がありますか、実際には実際に役立ちますか、それとも愚かな最適化を気にせずにコンパイラーにスカラーモードで処理させるべきですか?