【发布时间】:2012-12-02 12:13:34
【问题描述】:
如果我有 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
【问题讨论】:
-
Here is a link 到上一个关于计算压缩
doubles 的水平总和的问题。您也应该能够使其适应您的float案例。如果您有多个要并行计算总和的__m256元素,则效率最高。 -
@JasonR 抱歉,但这无济于事:这是一个完全不同的问题。
-
有什么不同?您将需要使用水平添加和排列来排列要添加的术语,如另一个问题所示。您也可以对
min和max操作使用类似的结构。我知道这不是一个完整的答案(因此评论),但它应该让你开始。 -
@JasonR 好吧,是的,它并不是完全没用,但是有许多类似的问题都使用了随机和排列结合水平和垂直操作。顺便说一句,没有水平最小值/最大值,是吗?
-
我不知道水平最小/最大操作。一种可以同时获得最小值/最大值的方法是使用寄存器内排序网络对 SIMD 寄存器中的元素进行排序。适合在
__m128上实现的算法可以在this paper 中找到;大约需要 15 条指令。在 x86 上实现 YMM 寄存器的方式可能会使对__m256进行排序的工作变得更加困难,因为在大多数情况下您无法跨越 128 位边界。