【发布时间】:2015-03-14 17:18:09
【问题描述】:
是否存在一种快速的方法来检查 SIMD 向量是否为零向量(所有分量都等于 +-0)。我目前正在使用一种算法,使用移位,在 log2(N) 时间内运行,其中 N 是向量的维度。有没有更快的东西?请注意,我的问题比建议的答案更广泛(标签),它涉及所有类型的向量(整数、浮点数、双精度......)。
【问题讨论】:
-
取决于可用的说明,将neon和avx标记在一起我不知道你在做什么。
-
好吧,在最一般的情况下,您可能会遇到 log(n),如果您在 OR 树(或对一起直到你有 1 位为 0 当且仅当所有输入位都为 0 时才会是 log(n) 层深。所以,除非我们能稍微改变一下球门柱,否则这实际上是不可能的。
-
如果
N很大,那么显而易见的解决方案是处理W组中的元素,其中W是通过ORing 将它们组合在一起可以处理的最大块。到达终点后,您可以选择:1)ptest在 SSE4.1+ 上 2) 与零比较,然后在 SSE2+ 和整数类型上比较pmovmskb,或movmskps/movmskpd对于单/双精度.如果 N 特别大,最后的减少不会是你的瓶颈;这将是数据流,将被 ORed 到您的寄存器中。对于 ARMv7 上的 NEON,可以使用成对无符号maxes 完成最终缩减,直到达到 32 位字长。 -
@user1095108 事实上,我做到了,@harold 也做到了。如果向量中的唯一值是+0,则归约结果将相同为+0,如果只有+0 和-0,则OR-reduction 将生成-0。当然,您必须知道 IEEE 要求 -0 比较等于 0,因此当您在
movmskps之前对 == 0 进行比较时,您将正确地忽略零的符号。