问题标签 [avx2]

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 投票
3 回答
4247 浏览

x86 - _mm_alignr_epi8 (PALIGNR) 等效于 AVX2

在 SSE3 中,PAligNR 指令执行以下操作:

PARIGNR 将目标操作数(第一个操作数)和源操作数(第二个操作数)连接成一个中间组合,将组合以字节粒度向右移动一个常量立即数,并将右对齐的结果提取到目标中。

我目前正在移植我的 SSE4 代码以使用 AVX2 指令并使用 256 位寄存器而不是 128 位。天真地,我相信内在函数(VALIGNR)执行与仅在 256 位寄存器上_mm256_alignr_epi8相同的操作。_mm_alignr_epi8然而可悲的是,情况并非如此。实际上,_mm256_alignr_epi8将 256bit 寄存器视为 2 个 128bit 寄存器,对相邻的两个 128bit 寄存器执行 2 次“对齐”操作。_mm_alignr_epi8一次有效地执行与 2 个寄存器相同的操作。在这里最清楚地说明了这一点:_mm256_alignr_epi8

目前我的解决方案是_mm_alignr_epi8通过将 ymm(256 位)寄存器分成两个 xmm(128 位)寄存器(高和低)来继续使用,如下所示:

这行得通,但必须有更好的方法,对吧?是否应该使用更“通用”的 AVX2 指令来获得相同的结果?

0 投票
3 回答
9062 浏览

x86 - 如何在 256 位 AVX 向量中找到水平最大值

我有一个包含四个 64 位浮点值的 __m256d 向量。
我需要找到向量元素的水平最大值并将结果存储在双精度标量值中;

我的尝试最终都使用了大量的向量元素洗牌,使得代码不是很优雅也不是很高效。另外,我发现不可能只停留在 AVX 域中。在某些时候,我不得不使用 SSE 128 位指令来提取最终的 64 位值。但是,我想在最后一个陈述中被证明是错误的。

所以理想的解决方案是:
1)只使用 AVX 指令。
2)尽量减少指令数量。(我希望不超过 3-4 条指令)

话虽如此,任何优雅/高效的解决方案都将被接受,即使它不遵守上述准则。

谢谢你的帮助。

-路易吉

0 投票
2 回答
5956 浏览

intrinsics - AVX 中的分散函数

我在 Intel Intrinsic Guide v2.7 中找不到它们。你知道 AVX 或 AVX2 指令集是否支持它们吗?

0 投票
1 回答
3357 浏览

x86 - 如何像 SSE movlps/movhps 一样将 AVX/AVX2(YMM) 寄存器中的较低或较高值存储到内存中?

是否有任何现有指令可以将 256 位 AVX/AVX2(YMM) 寄存器中的较低或较高值存储到内存地址,就像 SSE 指令 movlps/movhps 一样?

或者还有其他方法可以实现吗?

任何帮助将不胜感激,谢谢!

0 投票
5 回答
2871 浏览

cpu-architecture - 在 AVX2 Haswell 处理器中加载 256 位向量寄存器

我想加载一个256 bit YMM具有 32 个值的寄存器,每个值长度为 1 个字节。我研究的所有内在函数要么加载double word,即4 byte整数,要么加载,quad word8 byte值。如何加载小于这些大小的数据?是否有任何助记符可以做到这一点但没有等效的内在函数?

0 投票
3 回答
4944 浏览

x86 - 使用 AVX2 收集指令时的加载地址计算

查看 AVX2 内在文档,收集了加载指令,例如VPGATHERDD

从文档中我不清楚的是计算的加载地址是 元素地址还是字节地址,即 element 的加载地址i

或者:

英特尔文档看来,它可能是 (2),但考虑到收集负载的最小元素大小是 32 位,这没有多大意义 - 为什么要从未对齐的地址加载(即使用 scale < 4 ) ?

0 投票
1 回答
502 浏览

c++ - 你能调试自动矢量化循环吗?

我正在开发一个包含大量 SIMD 内在代码的代码库。现在我们有了 AVX2,我们仍然需要在不支持 AVX2 的处理器上运行 SIMD 代码,这将大大增加工作量。再加上 AVX2 shuffle 的 128 位车道交叉限制也使事情变得复杂。由于这些原因,现在是更多依赖自动矢量化的好时机。让我害怕的主要事情是一个简单的更改会杀死并行性的前景,以及在出现问题时调试自动矢量化代码的前景。

我已经用 g++ -O1 -g -ftree-vectorize 编译了以下内容,并尝试使用 GDB 逐步完成(有谁知道为什么 -ftree-vectorize 不适用于 -O0 ?)

但没有得到任何有意义的结果。例如,有时 i 的值表示 <optimized out>,而有时它会跳出 20。

似乎主要问题是很难将 SIMD 状态映射到原始 C 状态以进行调试。但实际上,能做到吗?

0 投票
2 回答
976 浏览

performance - Is there any data on the latency of an AVX2 gather instruction?

Is there any data on AVX2 gather latency?

(for instance a _mm256_i32gather_ps instruction accessing a single cache line)

0 投票
1 回答
1392 浏览

c - 优化未对齐的 SSE2/AVX2 XOR

在我的代码中,我必须处理 websocket 数据包的“取消屏蔽”,这本质上意味着对任意长度的未对齐数据进行异或。多亏了 SO(Websocket data unmasking / multi byte xor),我已经找到了如何(希望)使用 SSE2/AVX2 扩展来加快速度,但是现在看,在我看来,我对未对齐数据的处理完全是次要的-最佳。有什么方法可以优化我的代码,或者至少在相同性能的情况下使其更简单,还是我的代码已经是性能最好的?

这是代码的重要部分(对于这个问题,我假设数据总是至少足以运行一次 AVX2 循环,但同时它最多只能运行几次):

PS:请忽略使用#ifdef 代替cpuid 等进行cpu 标志检测。

0 投票
3 回答
2457 浏览

c++ - 使用 SIMD (AVX2) 的稀疏数组压缩

我有一个稀疏数组a(大部分为零):

我想创建一个索引数组,以在带有 AVX2 的英特尔 x64 架构上使用 SIMD 指令b的非零元素。a我正在寻找如何有效地做到这一点的提示。具体来说,是否有 SIMD 指令来获取 SIMD 寄存器中连续非零元素的位置,并连续排列?