如何有效地交错来自 8 个 __int16 数字的位?

Posted

技术标签:

【中文标题】如何有效地交错来自 8 个 __int16 数字的位?【英文标题】:How to efficiently interleave bits from 8 __int16 numbers? 【发布时间】:2017-11-17 11:14:26 【问题描述】:

我正在为空间索引构建 Morton 数,我有 8 个无符号 16 位数,它们将变成 __int128 数。效率至关重要,因此天真的解决方案(循环遍历所有内容)或构建单独的 8 个 128 位数字太昂贵了。

我使用的是 GCC,目标机器是 64 位但不支持 BMI2。

如何加快计算速度?

【问题讨论】:

This 可能有一些兴趣。 @MatteoItalia 谢谢。是的,我知道这一点,不幸的是没有 BMI2,我没有 PDEP 或 PEXT 指令,我正在寻找一次计算更多代码。 【参考方案1】:

如果您的机器是 x86 并且支持 SSE2,那么使用 movmsk 指令可以得到一个聪明的答案。谷歌SSE2 bit matrix transpose获取完整代码。

【讨论】:

是的,确实如此,x86_64。这是一个聪明的主意。如果没有更快的出现,我会等待一段时间然后接受。我假设this SSE2 code 是你的?谢谢。 是的。抱歉,我是通过电话发帖,因此重定向到该文章。即使对于您狭窄的“矩阵”,该代码也将是高效的。

以上是关于如何有效地交错来自 8 个 __int16 数字的位?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用缩放有效地将 16 位无符号短转换为 8 位无符号字符?

如何有效地去交错位(逆莫顿)

平面,半平面和交错格式有什么区别。

在 arm neon 中有效地累积符号位

2 个 AVX-512 向量元素的交错合并 - C 内在

变量和基本类型C++