快速SIMD用于复杂双倍的累积产品

时间:2017-08-03 09:42:12

标签: c simd complex-numbers avx

我需要尽快计算复数数组的累积乘积。在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

0 个答案:

没有答案