问题标签 [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.
x86 - 将 32 位解压缩为 32 字节 SIMD 向量的最快方法
将 32 位存储在uint32_t
内存中,将每个位解压缩到 AVX 寄存器的单独字节元素的最快方法是什么?这些位可以位于其各自字节内的任何位置。
编辑:澄清一下,我的意思是位 0 到字节 0,位 1 到字节 1。显然,字节内的所有其他位都为零。目前我能做到的最好是 2PSHUFB
并且每个位置都有一个掩码寄存器。
如果uint32_t
是位图,则对应的向量元素应该是 0 或非 0。(即,我们可以得到一个向量掩码,其中 avpcmpeqb
反对一个全零的向量)。
x86-64 - 在函数调用之前保存 XMM 寄存器
是否需要在汇编函数调用之前将任何 XMM 寄存器保存/推送到堆栈?因为我正在使用 64 位开发的发布模式(使用 AVX2)观察我的代码中的崩溃问题。在调试模式下它工作正常。我尝试保存 XMM8 寄存器的内容并在函数调用结束时恢复它,然后它工作正常。
有什么想法或参考吗?
c++ - 我可以使用 AVX2 分散指令来加速某些负载吗?
我已经分析了我拥有的一个 AVX2-heavy 功能,瓶颈如下所示:
实际上,数组也适当地对齐(load
而不是loadu
)。但问题是,有没有更快的方法用 AVX(2) 做到这一点?具体来说,我正在查看收集说明。我可以使用它们来初始化vec
吗data
?或者其他一些说明值得在这里尝试吗?
c++ - GCC 无法向量化 64 位乘法。可以在 AVX2 上对 64 位 x 64 位 -> 128 位加宽乘法进行矢量化吗?
我尝试对使用 64 位扩展乘法的 CBRNG 进行矢量化。
这样的乘法是否以 AVX2 中的矢量化形式存在?
c++ - 从四个 __m128i 变量的 64 个高位或低位初始化 __m256i
假设我有四个__m128i
变量,其中包含一些计算产生的数据。例如,让我们说:
我想初始化两个__m256i
变量,其中第一个包含四个变量的所有高 64 位,第二个包含每个变量的低 64 位。所以我想拥有:
这样做的明显方法是使用_mm256_set_epi64x
and _mm_extract_epi64
。但是,它可能不是特别快。有没有更快的方法呢?特别是,对于访问 64 位高位,我没有看到合适的负载(SSE2 中有低 64 位的负载)或随机播放指令(似乎没有“64 位随机播放”)。
assembly - 在什么情况下,AVX2 收集指令会比单独加载数据更快?
我一直在研究 AVX2 指令集的新收集指令的使用。具体来说,我决定对一个简单的问题进行基准测试,其中一个浮点数组被置换并添加到另一个。在 c 中,这可以实现为
我用 g++ -O3 -march=native 编译这个函数。现在,我以三种方式在汇编中实现它。为简单起见,我假设数组 N 的长度可以被 4 整除。简单的非向量化实现:
没有收集指令的循环向量化:
最后,使用 vgatherdpd 的实现:
我在一台装有 Haswell cpu (Xeon E3-1245 v3) 的机器上对这些功能进行了基准测试。一些典型的结果是(以秒为单位的时间):
gcc 和非向量化汇编版本非常接近。(我还检查了 gcc 的汇编输出,这与我的手动编码版本非常相似。)矢量化对小数组有一些好处,但对大数组来说速度较慢。最大的惊喜(至少对我来说)是使用 vgatherpdp 的版本太慢了。所以,我的问题是,为什么?我在这里做傻事吗?有人可以提供一个示例,其中收集指令实际上会比仅执行多个加载操作带来性能优势吗?如果不是,那么实际上有这样的指令有什么意义?
如果有人想尝试一下,可以在https://github.com/vanhala/vectortest.git上找到测试代码,包括 g++ 和 nasm 的 makefile 。
c++ - avx浮点按位逻辑运算的原因是什么?
AVX 允许按位逻辑运算,例如和/或浮点数据类型 __m256 和 __m256d。
但是,C++ 合理地不允许对浮点数和双精度数进行按位运算。如果我是对的,则无法保证浮点数的内部表示,编译器是否会使用 IEEE754,因此程序员无法确定浮点数的位会是什么样子。
考虑这个例子:
假设使用 IEEE754,因为 -1 的表示为 0xffffffff,我希望输出为
而相反
因此,我对内部表示的假设可能是错误的(或者我犯了一些愚蠢的错误)。
所以问题是:有没有一种方法可以使用浮点逻辑并且对结果有意义的事实是安全的?
c++ - 紧凑的 AVX2 寄存器,因此所选整数根据掩码是连续的
在Optimizing Array Compaction问题中,最佳答案是:
具有最新指令集的 SSE/AVX 寄存器提供了更好的方法。我们可以直接使用 PMOVMSKB 的结果,将其转换为控制寄存器,例如 PSHUFB。
Haswell(AVX2)可以做到这一点吗?或者它是否需要 AVX512 的一种口味?
我有一个包含 int32s 的 AVX2 向量,以及一个比较结果的相应向量。我想以某种方式对其进行洗牌,以便在掩码中设置相应 msb 的元素(比较为真)在向量的低端是连续的。
我能看到的最好的方法是使用 _mm256_movemask_ps/vmovmskps 获得一个位掩码(没有 *d 变体?),然后在 256 AVX2 矢量查找表中使用它来获得跨通道 _mm256_permutevar8x32_epi32/vpermd 的随机掩码
c - AVX2 1x mm256i 32bit 到 2x mm256i 64bit
有没有一种正常的方法可以将具有 32 位整数的 1x __m256i 转换为填充有 64 位整数的 2x __m256i。我正在平均数据,我的 32 位整数溢出。所以我想将累加器寄存器分成两个 64 位寄存器。
c++ - 使用 AVX 模拟 32 字节的移位
我正在将使用 SSE2 内在函数编写的矢量化代码迁移到 AVX2 内在函数。
令我失望的是,我发现移位指令_mm256_slli_si256和_mm256_srli_si256仅分别在 AVX 寄存器的两半上运行,并且在它们之间引入了零。(这与处理整个 SSE 寄存器的_mm_slli_si128和_mm_srli_si128形成对比。)
你能给我推荐一个短的替代品吗?
更新:
_mm256_slli_si256
有效地实现了
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
或者
_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)
对于大于 16 字节的移位。
但问题仍然存在_mm256_srli_si256
。