gpt4 book ai didi

c++ - AVX,单精度复数的水平和?

转载 作者:行者123 更新时间:2023-11-28 00:01:50 24 4
gpt4 key购买 nike

我有一个 256 位 AVX 寄存器,其中包含 4 个单精度复数,存储为实数、虚数、实数、虚数等。我目前正在将整个 256 位寄存器写回内存并在那里求和,但这似乎效率低下.

如何使用 AVX(或 AVX2)内在函数执行复数水平求和?如果没有使用内部函数具有可比效率的答案,我会接受使用汇编的答案。

编辑:澄清一下,如果寄存器包含 AR、AI、BR、BI、CR、CI、DR、DI,我想计算复数 (AR + BR + CR + DR, AI + BI + CI +迪)。如果结果在 256 位寄存器中,我可以提取 2 个单精度 float 。

Edit2:潜在的解决方案,虽然不一定是最优的......

float hsum_ps_sse3(__m128 v) {
__m128 shuf = _mm_movehdup_ps(v); // broadcast elements 3,1 to 2,0
__m128 sums = _mm_add_ps(v, shuf);
shuf = _mm_movehl_ps(shuf, sums); // high half -> low half
sums = _mm_add_ss(sums, shuf);
return _mm_cvtss_f32(sums);
}

float sumReal = 0.0;
float sumImaginary = 0.0;

__m256i mask = _mm256_set_epi32 (7, 5, 3, 1, 6, 4, 2, 0);

// Separate real and imaginary.
__m256 permutedSum = _mm256_permutevar8x32_ps(sseSum0, mask);
__m128 realSum = _mm256_extractf128_ps(permutedSum , 0);
__m128 imaginarySum = _mm256_extractf128_ps(permutedSum , 1);

// Horizontally sum real and imaginary.
sumReal = hsum_ps_sse3(realSum);
sumImaginary = hsum_ps_sse3(imaginarySum);

最佳答案

一个相当简单的解决方案,只需要 AVX(不需要 AVX2):

__m128i v0 = _mm256_castps256_ps128(v);      // get low 2 complex values
__m128i v1 = _mm256_extractf128_ps(v, 1); // get high 2 complex values
v0 = _mm_add_ps(v0, v1); // add high and low
v1 = _mm_shuffle_ps(v0, v0, _MM_SHUFFLE(1, 0, 3, 2));
v0 = _mm_add_ps(v0, v1); // combine two halves of result

结果将在 v0 中作为 { sum.re, sum.im, sum.re, sum.im }

关于c++ - AVX,单精度复数的水平和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38331750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com