gpt4 book ai didi

x86 - 8 个打包的 32 位 float 的水平总和

转载 作者:行者123 更新时间:2023-12-03 23:53:17 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to sum __m256 horizontally?

(2 个回答)


去年关闭。




如果我有 8 个打包的 32 位浮点数( __m256 ),提取所有 8 个元素的水平总和的最快方法是什么?同样,如何获得水平最大值和最小值?换句话说,以下 C++ 函数的最佳实现是什么?

float sum(__m256 x);  ///< returns sum of all 8 elements
float max(__m256 x); ///< returns the maximum of all 8 elements
float min(__m256 x); ///< returns the minimum of all 8 elements

最佳答案

在这里快速记下(因此未经测试):

float sum(__m256 x) {
__m128 hi = _mm256_extractf128_ps(x, 1);
__m128 lo = _mm256_extractf128_ps(x, 0);
lo = _mm_add_ps(hi, lo);
hi = _mm_movehl_ps(hi, lo);
lo = _mm_add_ps(hi, lo);
hi = _mm_shuffle_ps(lo, lo, 1);
lo = _mm_add_ss(hi, lo);
return _mm_cvtss_f32(lo);
}

对于最小值/最大值,替换 _mm_add_ps_mm_add_ss_mm_max_*_mm_min_* .

请注意,这对于一些操作来说是很多工作; AVX 并不是真的要有效地进行水平操作。如果您可以为多个向量批量处理这项工作,那么更有效的解决方案是可能的。

关于x86 - 8 个打包的 32 位 float 的水平总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879609/

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