问题标签 [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 投票
1 回答
192 浏览

c++ - 出于某种原因,串行代码比 SIMD 代码运行得更快

出于某种原因运行简单的串行代码

运行速度比矢量化等效速度快或相同;

在我的带有英特尔编译器 XE 15.0 的英特尔 i7-4578U 上,前者运行时间为 1.507 毫秒,而后者运行时间为 1.513 毫秒,运行时间为 10000。

我的经验是 avx2 内在函数的显着加速,但由于某种原因,这条线决定让我失望。请问我做错了什么?

0 投票
1 回答
1095 浏览

c++ - SSE - 从 double 到 char 的 AVX 转换

我想将双精度值的向量转换为 char。我必须采用两种不同的方法,一种用于 SSE2,另一种用于 AVX2。

我从 AVX2 开始。

在该算法结束时,输出包含:

我的第一次调查告诉我,如果proc我改变了函数:

至:

然后输出包含:

我还没有弄清楚如何洗牌的低和高部分in2_si

有没有更好(更快、更有效)的方法来使用 SIMD 将双精度数转换为 char ?

0 投票
3 回答
1958 浏览

c++ - Is it really efficient to use Karatsuba algorithm in 64-bit x 64-bit multiplication?

I work on AVX2 and need to calculate 64-bit x64-bit -> 128-bit widening multiplication and got 64-bit high part in the fastest manner. Since AVX2 has not such an instruction, is it reasonable for me to use Karatsuba algorithm for efficiency and gaining speed?

0 投票
2 回答
10720 浏览

gcc - 使用 AVX/AVX2 内部函数的对齐和非对齐内存访问

根据英特尔的软件开发人员手册(第 14.9 节),AVX 放宽了内存访问的对齐要求。如果数据直接加载到处理指令中,例如

加载地址不必对齐。但是,如果使用专用的对齐加载指令,例如

加载地址必须对齐(到 32 的倍数),否则会引发异常。

让我感到困惑的是内在函数的自动代码生成,在我的例子中是 gcc/g++(4.6.3,Linux)。请看下面的测试代码:

(是的,我知道代码有问题,因为我在未对齐的地址上使用了对齐的负载,但请耐心等待......)

我编译代码

在带有 AVX 的 CPU 上。如果我通过使用检查 g++ 生成的代码

我看到编译器没有生成对齐的加载指令,而是直接在向量加法指令中加载数据:

代码执行没有任何问题,即使内存地址未对齐(OFFSET 为 1)。这一点很清楚,因为 vaddps 可以容忍未对齐的地址。

如果我取消注释带有第二个附加内在函数的行,编译器无法融合加载和附加,因为 vaddps 只能有一个内存源操作数,并生成:

现在程序段错误,因为使用了专用的对齐加载指令,但内存地址未对齐。(顺便说一句,如果我使用 _mm256_loadu_ps,或者如果我将 OFFSET 设置为 0,则程序不会出现段错误。)

以我的拙见,这使程序员受到编译器的摆布,并使行为部分不可预测。

我的问题是:有没有办法强制 C 编译器在处理指令中生成直接加载(例如 vaddps)或生成专用加载指令(例如 vmovaps)?

0 投票
1 回答
138 浏览

c++ - 为什么这两个高(64bx64b)函数会给出不同的结果?

我正在尝试在 AVX2 (更具体地说BMI2)上使用 MULX 内在函数编写以下内容。但他们没有给出相同的结果。

0 投票
1 回答
215 浏览

c++ - 将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是什么?

我有一个结构定义为:

我想知道如何将其第一行加载到 AVX2 上的 _m256i 变量中?

0 投票
2 回答
3815 浏览

c - _mm256_slli_si256:错误“最后一个参数必须是 8 位中间值”

我有以下问题(g++(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4):

当我_mm256_slli_si256()直接使用时,如:

代码编译没有问题(g++ -Wall -march=native -O3 -o shifttest shifttest.C)。

但是,如果我将它包装成一个函数

编译器抱怨说

无论是否使用该功能。

这对于直接操作数来说不是问题,因为如果我使用 eg_mm256_slli_si32(x, imm)代替,函数 doit() 会编译,并且_mm256_slli_si32()还需要立即操作数。

有一个相关的错误报告

https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=54825

但它已经很老了(2012 年)并且与 gcc 4.8.0 相关,所以我认为该补丁已经被合并到 g++ 4.8.4 中。

有解决此问题的方法吗?

0 投票
2 回答
1616 浏览

intel - 为什么英特尔不以更兼容或更通用的方式设计其 SIMD ISA?

英特尔在 Xeon Phi 上有多个 SIMD ISA,例如 SSE、AVX、AVX2、AVX-512 和 IMCI。这些 ISA 在不同的处理器上受支持。例如,AVX-512 BW、AVX-512 DQ 和 AVX-512 VL 仅在 Skylake 上受支持,而在 Xeon Phi 上不支持。Skylake 和 Xeon Phi 均支持 AVX-512F、AVX-512 CDI、AVX-512 ERI 和 AVX-512 PFI。

为什么英特尔不设计一种更通用的 SIMD ISA,可以在其所有高级处理器上运行?

此外,英特尔在开发 ISA 时删除了一些内在函数并添加了新的。很多内在函数有很多风格。例如,有些工作在压缩的 8 位上,而有些工作在压缩的 64 位上。有些口味没有得到广泛支持。例如,至强融核将无法处理压缩的 8 位值。然而,Skylake 将拥有这个。

为什么英特尔会以如此不一致的方式更改其 SIMD 内在函数?

如果 SIMD ISA 彼此更兼容,则现有的 AVX 代码可以更轻松地移植到 AVX-512。

0 投票
1 回答
2118 浏览

c - AVX2 稀疏矩阵乘法

我正在尝试利用新的 AVX2 GATHER 指令来加速稀疏矩阵 - 向量乘法。该矩阵采用 CSR(或耶鲁)格式,带有指向列索引数组的行指针,该列索引数组又保存列。这种 mat-vec mul 的 C 代码看起来像这样:

现在我的目标是使用 AVX2 内在函数加速这一过程。以下代码适用于最新的 Intel 或 GCC,基于https://blog.fox-toolkit.org/?p=174。我在这里删除了其余部分,因为无论如何我的行都对齐 4 个双精度数(列 % 4==0)(幸运的是我)。如果有人感兴趣,我也有处理余数的代码,但关键是,代码实际上稍微慢了一点。我检查了反汇编,对于上述版本,仅生成 FP 指令,对于我的 AVX2 代码,所有 AVX2 操作都按预期显示。即使有适合缓存的小矩阵,AVX2 版本也不好。我在这里很困惑...

欢迎任何建议。

非常感谢,克里斯

0 投票
2 回答
3679 浏览

c++ - AVX 256 位代码的性能略逊于等效的 128 位 SSSE3 代码

我正在尝试编写非常有效的汉明距离代码。受Wojciech Muła极其聪明的 SSE3 popcount实现的启发,我编写了一个 AVX2 等效解决方案,这次使用 256 位寄存器。 l 基于所涉及操作的双倍并行度,我预计至少有 30%-40% 的改进,但令我惊讶的是,AVX2 代码慢了一点(大约 2%)!

有人可以告诉我为什么我没有获得预期的性能提升的可能原因吗?

展开,两个 64 字节块的 SSE3 汉明距离:

使用 AVX 的 256 位寄存器的未展开等效版本:

我已经验证了编译器发出的输出汇编代码,它看起来不错,预期将内在指令直接转换为机器指令。我唯一注意到的是,在 AVX2 版本上,累积 4 个四字的人口计数的最后一行,它生成的代码比 SSE3 版本更复杂(只需累积 2 个四字即可获得人口计数),但是我仍然希望吞吐量更快。

为四字累加生成的 AVX2 代码

为四字累加生成的 SSE3 代码

我的测试程序调用每个例程 100 万次,使用不同的输入值,但重用两个静态缓冲区来保存pApB参数的数据。在我对 CPU 架构的有限理解中,这个局部性(一遍又一遍地重用相同的内存缓冲区)应该很好地预热 CPU 缓存,并且不受内存带宽问题的束缚,但除了可能的内存带宽之外,我不明白为什么没有性能改进。

测试例程

测试机器是 Intel Corei7 4790,我使用的是 Visual Studio 2012 Pro。