从Integer数组中收集/提取第一个位
Gather/Extract first Bit from Integer Array
问题
是否存在收集/提取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之前,这需要乘法(,然后求和,当然首先是垂直的,最后保存水平和。这可能更慢,当然也更尴尬。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 无法使我的第一个Windows OpenGL窗口抬起并运行
- 将参数初始化为构造函数,而不是第一个
- 从 std::string 中提取(第一个)UTF-8 字符