一部の Intel/AMD CPU は、SSE/AVX で同時に乗算と加算を実行できることを知りまし
た。
コードでこれを行う方法を知りたいのですが、CPU の内部でどのように行われるかも知りたいです。つまり、スーパースカラー アーキテクチャのことです。SSEで次のような長い金額をやりたいとしましょう:
//sum = a1*b1 + a2*b2 + a3*b3 +... where a is a scalar and b is a SIMD vector (e.g. from matrix multiplication)
sum = _mm_set1_ps(0.0f);
a1 = _mm_set1_ps(a[0]);
b1 = _mm_load_ps(&b[0]);
sum = _mm_add_ps(sum, _mm_mul_ps(a1, b1));
a2 = _mm_set1_ps(a[1]);
b2 = _mm_load_ps(&b[4]);
sum = _mm_add_ps(sum, _mm_mul_ps(a2, b2));
a3 = _mm_set1_ps(a[2]);
b3 = _mm_load_ps(&b[8]);
sum = _mm_add_ps(sum, _mm_mul_ps(a3, b3));
...
私の質問は、これをどのようにして同時乗算と加算に変換するのですか? データは依存できますか? つまり、CPUは_mm_add_ps(sum, _mm_mul_ps(a1, b1))
同時に実行できますか、それとも乗算と加算に使用されるレジスタは独立している必要がありますか?
最後に、これは FMA (Haswell) にどのように適用されますか? _mm_add_ps(sum, _mm_mul_ps(a1, b1))
単一の FMA 命令またはマイクロ操作に自動的に変換されますか?