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

Gather/Extract first Bit from Integer Array

本文关键字:提取 第一个 Integer 数组      更新时间:2023-10-16

问题

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

  • 我知道内在的pext,但那不是我真正想要的。

  • 我确实有一个代码,但我想可能有一个指定的指令。

  • ints数组除了第一个比特之外为零。埃尔戈,不需要戴口罩

代码

void ints2bits(int &bits, int *ints) {
   bits = (ints[0] << 0) + (ints[1] << 1) + ... + (ints[31] << 31);
}

更新&反馈

刚刚测试了哈罗德的建议。它运行得很好,我可以达到很好的速度。

没有一条指令可以读取那么多数据,但使用_mm_movemask_ps可以快速处理4组(8组AVX2(。忽略它声称是浮点指令的事实,它只是收集并附加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之前,这需要乘法(,然后求和,当然首先是垂直的,最后保存水平和。这可能更慢,当然也更尴尬。