使用AVX2+FMA3进行复数乘法

Multiplication of complex numbers using AVX2+FMA3

我找到了一些解决方案,其中每个 AVX2 寄存器都包含复数的实部和虚部。我对每个 AVX2 寄存器保存实部或虚部的解决方案感兴趣。
假设我们有 4 个 AVX2 寄存器:R1, I1, R2, I2
寄存器 R1, I1 形成 4 个复数。同样适用于其余两个寄存器。现在我想将 R1, I1 的 4 个复数与 R2, I2 的 4 个复数相乘。最有效的方法是什么?除了AVX2,FMA3也可以使用

你说你有 AVX2,所有 Intel 和 AMD AVX2 处理器也支持 FMA3。因此,我会这样做。

// 4 FP64 complex numbers stored in 2 AVX vectors,
// de-interleaved into real and imaginary vectors
struct Complex4
{
    __m256d r, i;
};

// Multiply 4 complex numbers by another 4 numbers
Complex4 mul4( Complex4 a, Complex4 b )
{
    Complex4 prod;
    prod.r = _mm256_mul_pd( a.r, b.r );
    prod.i = _mm256_mul_pd( a.r, b.i );
    prod.r = _mm256_fnmadd_pd( a.i, b.i, prod.r );
    prod.i = _mm256_fmadd_pd( a.i, b.r, prod.i );
    return prod;
}

或者,如果您的目标是 one 没有 FMA 的 VIA 处理器,请将 FMA 内在函数替换为以下行:

prod.r = _mm256_sub_pd( prod.r, _mm256_mul_pd( a.i, b.i ) );
prod.i = _mm256_add_pd( prod.i, _mm256_mul_pd( a.i, b.r ) );