繁体   English   中英

使用 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;
}

或者,如果您的目标是一个没有 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 ) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM