问题标签 [swar]

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 投票
2 回答
1155 浏览

c++ - C++ 中 MSB ->LSB 和 LSB->MSB 的有符号 INT 转换

我检查了 SWAR 算法(S IMD W ithin A Register )以反转 s 的位顺序。有类似的东西吗?unsigned intsigned int

0 投票
1 回答
387 浏览

optimization - 这种并行处理颜色分量的颜色混合技巧如何工作?

我看到这个 Java 代码非常有效地在两种 RGB888 颜色之间进行了 50% 的完美混合:

这显然相当于单独提取和平均通道。像这样的东西:

但是第一种方法效率更高。我的问题是:这个魔法是如何工作的?我还能用它做什么?还有更多类似的技巧吗?

0 投票
4 回答
6344 浏览

c++ - 该算法如何计算 32 位整数中设置的位数?

我看过这段代码,它计算的位数等于132 位整数,我注意到它的性能优于__builtin_popcount但我无法理解它的工作方式。

有人可以详细解释这段代码是如何工作的吗?

0 投票
2 回答
213 浏览

c - 有没有一种有效的方法在 64 位数字的高 32 位部分和低 32 位部分分别进行 32 位按位旋转?

我目前正在使用 C/C++,并且我有一个uint64_t. 我需要分别对顶部 32 位和底部 32 位进行按位旋转。例如,如果我的输入是

我需要向右旋转 2 位,正确的输出是

显而易见的方法是制作一个临时的 32 位数字并分别对其进行旋转操作,但是有没有一种不同的、有效的方法呢?

0 投票
3 回答
2392 浏览

binary - 0x01010101 如何等价于 1<<24 + 1<<16 + 1<<8 + 1

这个问题解释了用于计算给定数字中 1 的数量的SWAR 算法。在解释ilmari 时写道 0x01010101 = (1 << 24) + (1 << 16) + (1 << 8) + 1。有人可以解释它是如何平等的。

0 投票
2 回答
271 浏览

c++ - 按段比较 64 位整数

我有两个 64 位整数xy. 它们每个代表5个短无符号整数:前10位代表第一个整数,接下来的13位代表第二个整数,接下来的16位代表第三个整数,接下来的14位代表第4个整数,其余位代表第 5 个整数。

x0, x1, x2, x3,x4是构成 的 5 个短整数x。让y0, y1, y2, y3,y4是构成 的 5 个短整数y。我需要知道x0 < y0AND x1 < y1AND AND x2 < y2AND x3 < y3AND x4 < y4

我认为最简单的解决方案是转移:

我知道有很多按位体操。有更快的解决方案吗?

0 投票
8 回答
5218 浏览

c++ - 并行将 64 位整数中的压缩 8 位整数减 1,没有硬件 SIMD 的 SWAR

如果我有一个 64 位整数,我将其解释为包含 8 个元素的压缩 8 位整数数组。我需要1在处理溢出时从每个压缩整数中减去常数,而一个元素的结果不会影响另一个元素的结果。

我现在有这段代码,它可以工作,但我需要一个解决方案,它可以并行地减去每个压缩的 8 位整数并且不进行内存访问。在 x86 上,我可以使用这样的 SIMD 指令psubb并行减去压缩的 8 位整数,但我正在编码的平台不支持 SIMD 指令。(在这种情况下为 RISC-V)。

因此,我正在尝试执行SWAR(寄存器中的 SIMD)来手动取消 a 字节之间的进位传播uint64_t,执行与此等效的操作:

我认为您可以使用按位运算符执行此操作,但我不确定。我正在寻找不使用 SIMD 指令的解决方案。我正在寻找一个非常便携的 C 或 C++ 解决方案,或者只是它背后的理论,以便我可以实现自己的解决方案。

0 投票
2 回答
972 浏览

assembly - 一个寄存器可以一次保存多个值吗?

在 64 位 x86 寄存器的情况下,如果一个值的大小足够小以至于多个指令可以放入一个寄存器,是否可以在同一个寄存器中一次保存多个值?例如将两个 32 位整数装入一个寄存器。如果可能,这会是一件坏事吗?我一直在阅读寄存器,我对这个概念很陌生。

0 投票
2 回答
115 浏览

c - 来自“Bit Twiddling Hacks”的 SWAR 字节计数方法——它们为什么有效?

Bit Twiddling Hacks包含以下宏,用于计算单词x中小于或大于n

但是,它并没有解释它们为什么起作用。这些宏背后的逻辑是什么?

0 投票
2 回答
91 浏览

c - 如何编写将 0xFF 置于匹配通道中的 SWAR 比较?

我正在尝试编写一个 SWAR 比较相等操作,uint64_t假装是uint8_t. 根据 Hacker's Delight 和 Bit Twiddling Hacks 中的技术,我设法达到的最接近的结果如下:

但是,这会放入0x80匹配的0x00“车道”和不匹配的“车道”,而我想要匹配的“车道”和不0xFF匹配0x00的“车道”。是否可以在没有分支的情况下编写它?