【发布时间】:2019-12-18 15:12:09
【问题描述】:
我找不到用于计算 32 位整数向量 __m128i 的 SSE 指令。
是否有执行以下伪代码的指令或函数?
__m128i power_of_two(__m128i b) {
__m128 r;
for (int i = 0; i < 4; i++)
r[i] = 1 << b[i];
return r;
}
_mm_sll_epi32 指令只计算r[i] = a[i] << b[0]。
【问题讨论】:
-
每个元素的移位计数在AVX2
_mm_sllv_epi32之前不存在。如果你不能只使用它,你必须模仿它,例如拆包和混合 (SSE2 shift by vector)。或者对于具有不同但恒定的移位计数的右移位,乘以并移位Shifting 4 integers right by different values SIMD。 -
对于要移动的值是常量
1的情况,x86 可以非常有效地处理标量(bts reg, reg给定一个归零的目标)。但是使用 SSSE3,您也许可以将pshufb构建为查找表。如果您的计数始终为<= 7(或者可能是<= 15,还有更多工作),那么pshufb是完美的。如果所有 4 个计数总是彼此靠近(前导位相同),那么您可以将计数分成低字节中pshufb的字节内位,然后是带有共同前缀的_mm_sll_epi32它们都分享。 (所以 AND / ANDN 将它们分开)。 -
这也有一个浮动黑客
-
@harold:哦,对了!偏置计数并将其填充到指数字段中,然后将该 FP 位模式转换为整数。如果您没有
count < 8之类的任何限制,这可能最适合吞吐量。
标签: c++ x86 sse simd intrinsics