【发布时间】:2013-04-02 17:20:18
【问题描述】:
我了解到一些 Intel/AMD CPU 可以使用 SSE/AVX 进行同时乘法和加法运算:
FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2。
我想知道如何在代码中做到最好,我也想知道它是如何在 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指令还是微操作?
【问题讨论】:
标签: c sse cpu-architecture avx fma