问题标签 [avx]
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.
algorithm - 在 SSE/AVX 中选择唯一/重复数据删除
问题
是否有任何计算上可行的方法来使用 x86 SIMD 指令对一组整数进行寄存器内重复数据删除?
示例
我们有一个 4 元组寄存器 R1 = {3, 9, 2, 9},并希望获得寄存器 R2 = {3, 9, 2, NULL}。
限制
稳定性。保留输入顺序没有意义。
输出。但是,任何删除的值/NULL 必须位于寄存器的开头和/或结尾:
- {null, 1, 2, 3} - 好的
- {1, 2, null, null} - 好的
- {null, 2, null, null} - 好的
- {null, 2, null, 1} - 无效的顺序
- {null, null, null, null} - 无效输出
如果已知它会产生一种特定的输出格式,这显然是一种奖励。请假设 NULL 有效地表示 0(零)。
一般性。必须能够容忍不存在重复,并且在这种情况下产生与输入寄存器等效的输出。
指令集。我正在寻找以下任何或全部的解决方案:SSE2-SSSE3;SSE4.x; AVX-AVX2
.net - .NET Framework 4.5 是否提供 SSE4/AVX 支持?
我想,我听说过,但不知道在哪里。
upd:我讲过JiT
sum - 使用 AVX 一次性完成 4 个水平双精度求和
问题可以描述如下。
输入
输出
到目前为止我所做的工作
这似乎很容易:两个 VHADD 之间有一些改组,但实际上结合 AVX 的所有排列不能生成实现该目标所需的排列。让我解释:
我是否能够以相同的方式排列 x 和 y 以获得
然后
这就是我想要的结果。
因此我只需要找到如何执行
不幸的是,我得出的结论是,使用 VSHUFPD、VBLENDPD、VPERMILPD、VPERM2F128、VUNPCKHPD、VUNPCKLPD 的任何组合都证明是不可能的。问题的关键在于,在 __m256d 的实例 u 中交换 u[1] 和 u[2] 是不可能的。
问题
这真的是死胡同吗?还是我错过了排列指令?
x86 - QWORD 使用 SIMD SSE...AVX 将顺序 7 位混洗到字节对齐
我想知道在任何 SIMD 指令系列中是否可以执行以下操作。
我有一个 63 位有效位(从不为负)的 qword 输入。从 LSB 开始的每个连续 7 位都随机对齐到一个字节,左填充为 1(除了最重要的非零字节)。为了说明,为了清楚起见,我将使用字母。
结果只有重要字节,因此大小为 0 - 9,它被转换为字节数组。
尺寸 = 9
大小 = 2
我明白填充是分开的。洗牌对齐是我的问题。这可能吗?
编辑 2
这是我更新的代码。在单线程 Core 2 Duo 2 GHz,64 位上获得持续 46 M / sec 的随机长度输入。
assembly - 可以在同一代码路径中混合旧版 SSE 编码指令和 VEX 编码指令吗?
随着 AVX 的推出,Intel 将 VEX 编码方案引入了 Intel 64 和 IA-32 架构。这种编码方案主要用于 AVX 指令。我想知道混合 VEX 编码指令和现在称为“旧 SSE”指令是否可以。
我问这个问题的主要原因是代码大小。考虑这两个指令:
我通常使用第一个将标量值“广播”到 XMM 寄存器中的所有位置。现在,指令集说这两者(在这种情况下)之间的唯一区别是 VEX 编码的指令清除了 YMM 寄存器的较高(>=128)位。假设我不需要那个,在这种情况下使用 VEX 编码的版本有什么好处?第一条指令占用 4 个字节 ( 0FC6C000
),第二条指令占用 5 个字节 ( C5F8C6C000
)。
提前感谢所有答案。
c - SSE/AVX 向量类型的差异
_m256i
和 和_m256d
和有什么不一样_m256
?和 和 和有什么
区别?_m128i
_m128d
_m128
c - 如何将两个 __m128 值组合到 __m256?
我想将两个__m128
值合并为一个__m256
。
像这样的东西:
类似于:
有什么内在函数可以用来做到这一点吗?
c - 如何使用 __m128i 执行逐元素左移?
我发现的 SSE 移位指令只能在所有元素上移位相同的量:
_mm_sll_epi32()
_mm_slli_epi32()
有没有办法对不同的元素应用不同的转变?像这样的东西:
c - 如何旋转 SSE/AVX 矢量
我需要以尽可能少的时钟周期执行旋转操作。在第一种情况下,让我们假设__m128i
源和目标类型:
现在我想对 AVX 内在函数做同样的事情。所以让我们假设这次__m256i
是 source 和 dest 类型:
AVX 内在函数缺少大多数相应的 SSE 整数运算。也许有一些方法可以使用浮点版本获得所需的输出。
我试过:
但我得到的是:
关于如何以有效方式解决这个问题的任何想法?(没有混合 SSE 和 AVX 操作,也没有“手动”反转A0
和A1
提前致谢!
macos - g++:AVX 没有这样的指令
当我编译一个我用 C++ 编写的程序时(对于最新的 Macbook pro,它当然支持 AVX 指令集),我得到了以下错误。我正在使用从 Macports 获得的最新版本的 g++。您对我可以做些什么来修复错误而不限制编译器可用的指令集有任何想法吗?有什么特别值得我尝试更新的软件包吗?
谢谢您的帮助!