我需要尽快计算复数数组的累积乘积。在C中,这将是:
#include <complex.h>
complex double cumprod(complex double a[], complex double s[], int n) {
complex double prod = 1;
for (int i = 0; i<n; i++) {
prod *= a[i];
s[i] = prod;
}
return prod;
}
就我而言30 < n < 50
。
使用gcc编译-O3 -march=core-avx2 -ffast-math
时,会给出:
cumprod:
test edx, edx
jle .L4
sub edx, 1
lea rax, [rdi+8]
vxorpd xmm1, xmm1, xmm1
add rsi, 8
sal rdx, 4
vmovsd xmm0, QWORD PTR .LC1[rip]
lea rdx, [rdi+24+rdx]
.L3:
vmovsd xmm2, QWORD PTR [rax]
vmovsd xmm3, QWORD PTR [rax-8]
add rax, 16
add rsi, 16
vmulsd xmm4, xmm2, xmm0
vmulsd xmm2, xmm2, xmm1
vfmadd132sd xmm1, xmm4, xmm3
vfmsub132sd xmm0, xmm2, xmm3
vmovsd QWORD PTR [rsi-16], xmm1
vmovsd QWORD PTR [rsi-24], xmm0
cmp rdx, rax
jne .L3
ret
.L4:
vxorpd xmm1, xmm1, xmm1
vmovsd xmm0, QWORD PTR .LC1[rip]
ret
可悲的是,gcc似乎无法对此进行矢量化。
是否可以使用AVX SIMD指令加快速度?或者,还有其他方法来加速这段代码吗?
为了比较,这是ICC does。