从整数数组中收集/提取第一个位

时间:2016-08-09 05:32:55

标签: c++ bit-manipulation intrinsics instructions

问题

是否存在收集/提取mysite.com/test的第一位并将其存储到int[32]的指令?

  • 我知道内在的int,但这不是我想要的。

  • 我确实有一个代码,但我想也许有指定的指示。

  • 除了第一位之外,pext数组为零。因此,不需要掩蔽。

代码

ints

更新&反馈

刚刚测试了哈罗德的建议。它运作良好,我可以获得很好的加速。

1 个答案:

答案 0 :(得分:2)

没有一条指令甚至可以读取那么多数据,但是使用_mm_movemask_ps可以快速处理4组(AVX2为8组)。忽略它声称是浮点指令的事实,它只是收集并附加4个顶部位。

当然,使用_mm_slli_epi32将底部位移到顶部很容易。

将它放在一起(未经测试)

int res = 0;
for (int i = 0; i < 32; i += 4) {
    __m128i x = _mm_load_si128((__m128i*)&ints[i]); // I assume it's aligned
    x = _mm_slli_epi32(x, 31);
    int bits = _mm_movemask_ps(_mm_castsi128_ps(x));
    res += bits << i;
}

AVX2的扩展非常明显。

另一种可能的方法是将每个通道移动一个可变量(前AVX2,这需要乘法)然后求和,首先垂直,当然,保存最后的水平和。这可能更慢,当然也更尴尬。