问题标签 [bmi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
101 浏览

c++ - 将 uint64_t 的位复制到特定位置的两个 uint64_t

我有一个输入 uint64_tXN要写入目标的最低有效位的数量YZuint64_t 值从. 不受影响的部分,不应更改。我如何在 C++ 中为最新的英特尔 CPU 有效地实现它?MZYZ

在循环中执行应该是有效的。我猜它不需要分支:使用的指令的数量应该是恒定的并且尽可能的小。

M并且N在编译时不固定。M 可以取 0 到 63 之间的任何值(Z 中的目标偏移量),N 的范围是 0 到 64(要复制的位数)。

插图:

插图

0 投票
0 回答
89 浏览

c - 位图解包和生成稀疏矩阵

我正在尝试将二进制文件加载到内存中。它具有特定的编码和有限的字母表,我的意思是每两位代表一个整数值(00 -> 0、01 -> 1、10 -> 2 和 11 -> 3),仅此而已。

现在 11 或基本上 3 代表缺失值。我可以使用 BMI2 解包并将缺失设置为零并填充主矩阵(完整数据没有缺失),但想创建一个映射或基本上是稀疏数组来存储缺失值的索引。

下面是我目前如何做的演示代码(使用 BMI2),因为与 2 字节解包相比,我没有发现 avx2 或其他方法有益。如果您不同意,请告诉我!

所以真正的问题是:如何result_and_mask在不使用简单循环的情况下使用此处的变量将字节索引存储在数组中?

只是为了添加更多上下文,这是在一个循环中发生的,该循环使用 memmap 读取一组数据并进行解包和存储。

示例输出:

更新:进一步说明

  • 所需的输出是索引的左压缩列表。在上面的例子中,我需要 0,7。基本上,我有一个指向数组中下一个空点的指针来存储缺失值的索引,比如说指向元素 100(到目前为止找到了 99 个缺失值),现在我正在读取索引 1000 处的 col 元素,所以我想做的是将 (1000 + 7, 1000 + 0, 顺序无关紧要) 添加到缺少的数组中。现在指针将指向 102。
  • 该平台将具有最低 avx2,这是一个科学程序,主要用于云和/或 HPC,CPU 主要是英特尔和 Skylake 向上(avx-512 很常见),所以我假设 avx2 至少存在。

更新:用于解包的 AVX2 演示

这是我第一次尝试使用 avx2 进行解包:

输出:

我正在使用结果而不会丢失来存储完整的数组。现在我想使用“缺少值的字节 (11)”来获取左压缩索引以将索引存储到稀疏数组中。

0 投票
1 回答
88 浏览

assembly - BLSI 指令 - 隔离最低设置位

位操作集包含BLSI - 该指令Extracts the lowest set bit from the source operand and set the corresponding bit in the destination register

您能否举一个例子来说明the lowest set bit(操作数的二进制表示中的最后一位?)所指的内容,执行的操作是什么,以及该操作在哪个上下文或哪种应用程序中使用?

0 投票
0 回答
127 浏览

assembly - PEXT 之类的汇编指令实际用于什么用途?

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

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

我希望这个问题适合stackoverflow。

0 投票
0 回答
157 浏览

performance - 如何提取具有不同开始的循环不变大小的位域?

我需要做一些位操作:从64 位寄存器中的i -th 获取k位,其中 9 ≤ k ≤ 12。k可能会根据我们读取的值而变化,i从 MSB 开始计数并以k递增每次阅读后。(ik只需要描述任务,它们都不必在最终解决方案中)

我想出的最简单的解决方案在 C 语言中是这样的:

我想知道是否有更好的方法(尤其是在性能方面)来做同样的事情。例如,我发现 BEXTR 汇编指令可以完全满足我的需要。

它会工作得更快吗?或者也许有更好的方法来完成所有这些?

我不确定将它放在我的单个处理器上是否就足够了,因此问题更多的是关于在微码中优化了多少指令

更新。1 Nate Eldredge给出了精彩的参考:uops.info

更新。2 JesterPeter Cordes提出了使用shrx+bzhi