使用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 ) );
我找到了一些解决方案,其中每个 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 ) );