像 PEXT 这样的汇编指令实际上有什么用途?

wes*_*mlr 6 x86 assembly bit-manipulation bmi

我观看了有关十大最疯狂汇编语言指令的 YouTube 视频,其中一些指令对我来说没有明显的应用。像这样的东西有什么意义PEXT,它只取第二个参数中与第一个参数中的 1 索引相匹配的位?编译器如何知道何时使用该指令?关于无进位乘法的相同/相似问题。

免责声明:我对汇编语言知之甚少甚至一无所知。也许我应该读一下它!

我希望这个问题适合 stackoverflow。

phu*_*clv 12

您可以在有关 PDEP/PEXT 硬件单元的论文中找到一些应用程序

许多新兴应用,例如密码学、成像和生物识别,都需要更先进的位操作操作。虽然这些可以通过更简单的逻辑和移位操作构建,但如果处理器可以支持更强大的位操作指令,则使用这些高级位操作操作的应用程序将显着加快。此类操作包括任意位排列、并行执行多个位字段提取操作以及并行执行多个位字段存储操作。我们分别将这些操作称为排列 (perm)、并行提取 (pex) 或位收集、以及并行存款 (pdep) 或位分散操作。

在通用处理器中高效执行高级位操作

位排列在位板中极为常见,例如反向字节/字或镜像位数组。其中有很多算法需要大量的位操作,在 PEXT/PDEP 时代之前,人们必须发挥创造力才能做到这一点。后来许多纸牌游戏引擎也使用该技术来处理仅在一个或几个寄存器中设置的单个游戏

PDEP/PEXT还用于极大地提高比特交织性能,这在Morton码等算法中很常见。这方面的一些例子:

为位板发明的乘法技术也常用于Bit Twiddling Hacks中的许多算法中,例如将位与 64 位乘法交织。当 PDEP/PEXT 可用时,不再需要此技术

您可以在位排列黑客的乐趣中找到更多详细信息

PDEP/PEXT 的另一个用途是提取/组合位不在连续位置的字段,例如汇编立即数分散的 RISC-V 指令,以使硬件设计更简单,但也使其在软件上使用时变得有点混乱。 PDEP/PEXT

其他一些应用:

我认为 pext / pdep 指令对 4 着色问题、3-SAT、约束求解器等有巨大的影响。更多的研究人员可能应该研究这两个指令。

只要看看二元决策图和其他此类组合数据结构,您就一定可以看到 PEXT / PDEP 的潜在用途。

https://news.ycombinator.com/item?id=19137260


编译器如何知道何时使用该指令?

编译器可以识别常见模式并优化指令序列,但对于像这样的高级事情,程序员通常需要从高级代码中显式调用内在函数


Dom*_*324 5

PDEP(并行存储)和 PEXT(并行提取)旨在成为提取和存储位字段的便捷方法。我敢打赌它们有很好的低级用例。

对于实际用途 - 我编写了一个数独解算器,它在几个函数中使用 PEXT 来提取位值。感谢 PEXT,我能够在一条指令中提取 4 个元素(普通方法提取 1 个元素)。真的很方便。如果您确实愿意,我可以在编译器资源管理器上放置一个代码片段来显示差异。