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

c++ - gcc 优化产生较慢的代码

我正在尝试使用 gcc 4.8.2 编译以下代码,如果我使用它编译它,g++ -mavx2 -O0 10bit.cpp我会从 time 命令获得以下输出:

实际0m0.117s

用户 0m0.116s

系统 0m0.000s

但是当我启用优化时g++ -mavx2 -O3 10bit.cpp,时间命令的输出显示更长的执行时间:

实际0m0.164s

用户 0m0.164s

系统 0m0.000s

我的 CPU 型号名称是:Intel(R) Xeon(R) CPU E5-2667 v3 @ 3.20GHz支持AVX2。此外,如果我尝试SSE4.1指令而不是AVX2,我的程序完成得更快。有人可以解释一下吗?

0 投票
1 回答
5212 浏览

c++ - 将 8 个字符从内存加载到 __m256 变量中作为打包单精度浮点数

我正在优化图像上的高斯模糊算法,我想用 __m256 内在变量替换下面代码中浮点缓冲区 [8] 的使用。哪一系列指令最适合这项任务?

0 投票
2 回答
1743 浏览

intel - 为什么 Intel Haswell XEON CPU 偶尔会错误计算 FFT 和 ART?

在最后几天,我观察到我无法解释的新工作站的行为。对这个问题进行一些研究,在INTEL Haswell 架构以及当前的 Skylake Generation 中可能存在一个错误。

在写可能的错误之前,让我先概述一下所使用的硬件、程序代码和问题本身。

工作站硬件规格

  • INTEL 至强 E5-2680 V3 2500MHz 30M 缓存 12核
  • 美超微 SC745 BTQ -R1K28B-SQ
  • 4 x 32GB ECC 注册 DDR4-2133 内存
  • 英特尔 SSD 730 系列 480 GB
  • 英伟达特斯拉 C2075
  • 英伟达泰坦

有问题的操作系统和程序代码

我目前正在运行 Ubuntu 15.04 64 位桌面版本,已安装最新更新和内核内容。除了使用这台机器开发 CUDA 内核和其他东西,我最近测试了一个纯 C 程序。该程序正在对相当大的输入数据集进行某种修改后的ART 。因此代码执行了一些 FFT 并消耗了相当长的时间来完成计算。我目前无法发布/链接到任何源代码,因为这是正在进行的研究,无法发布。如果您不熟悉ART,只是一个简单的解释它的作用。ART 是一种用于重建从计算机断层扫描仪接收到的数据以获取用于诊断的可见图像的技术。因此,我们的代码版本重构了大小为 2048x2048x512 的数据集。到目前为止,没有什么特别的,也没有涉及火箭科学。经过几个小时的调试和修复错误,代码在参考结果上进行了测试,我们可以确认代码按预期工作。代码使用的唯一库是 standard math.h。没有特殊的编译参数,没有可能带来额外问题的额外库内容。

观察问题

该代码使用一种技术来实现 ART,以最小化重建数据所需的投影。所以让我们假设我们可以重建一个包含 25 个投影的数据切片。代码以 12 个内核上完全相同的输入数据开始。请注意,该实现不是基于多线程的,目前启动了 12 个程序实例。我知道这不是最好的方法,强烈建议涉及适当的线程管理,这已经在改进列表中:)

因此,当我们运行至少两个程序实例(每个实例都在单独的数据切片上工作)时,一些预测的结果是随机错误的。为了让您了解结果,请参见表 1。请注意,输入数据始终相同。

只运行一个涉及 CPU 一个核心的代码实例,结果都是正确的。即使执行一些涉及一个 CPU 内核的运行,结果仍然正确。仅涉及至少两个或更多内核会生成结果模式,如表 1 所示。

表 1:Haswell XEON CPU 的随机错误结果

识别问题

好的,这花了好几个小时来了解实际出了什么问题。所以我们检查了整个代码,大部分问题都是从一个小的实现错误开始的。但是,好吧,没有(当然我们不能证明没有错误也不能保证)。为了验证我们的代码,我们使用了两台不同的机器:

  • (机器 1)英特尔酷睿 i5 四核(2009 年末型号)
  • (Machine2) 在 Intel XEON 6core SandyBridge CPU 上运行的虚拟机

令人惊讶的是,Machine1 和 Machine2总是产生正确的结果。即使使用所有 CPU 内核,结果仍然正确。在每台机器上运行超过 50 次,甚至没有一个错误的结果。代码在每台目标机器上编译,没有优化选项或任何特定的编译器设置。因此,阅读新闻导致以下发现:

因此,Prime95Mersenne 社区的 人们似乎是第一个发现和识别这个讨厌的错误的人。引用的贴子和新闻支持了这种怀疑,即问题只存在于工作量大的情况下。根据我的观察,我可以确认这种行为。

问题

  • 您/社区是否在 Haswell CPU 和 Skylake CPU 上观察到此问题?
  • 由于 gcc 每个默认的 AVX(2) 优化(尽可能),关闭此优化会有所帮助吗?
  • 如何编译我的代码并确保关闭可能受此错误影响的任何优化?到目前为止,我只阅读了有关在 Haswell / Skylake 架构中使用 AVX2 命令集的问题。

解决方案?

好的,我可以关闭所有 AVX2 优化。但这会减慢我的代码速度。英特尔可能会向主板制造商发布 BIOS 更新,以修改英特尔 CPU 中的微码。由于这似乎是一个硬件错误,即使通过更新 CPU 微码,这也可能会变得有趣。我认为这可能是一个有效的选择,因为英特尔 CPU 使用一些由微码控制的 RISC 到 CISC 转换机制。

编辑:Techreport.com - 勘误表提示英特尔在 Haswell 中禁用 TSX,早期的 Broadwell CPU将检查我 CPU 中的微码版本。

EDIT2:截至目前(19.01.2016 15:39 CET)Memtest86+ v4.20 正在运行并测试内存。由于这似乎需要相当长的时间才能完成,我将在明天更新帖子并提供结果。

EDIT3:截至目前(21.01.2016 09:35 CET)Memtest86+ 完成了两次运行并通过了。甚至没有一个内存错误。将 CPU 的微码从 更新revision=0x2drevision=0x36。目前正在准备这里发布的源代码。错误结果的问题在于。由于我不是相关代码的作者,因此我必须仔细检查不要发布我不允许发布的代码。我也在使用工作站并对其进行维护。

EDIT4: (22.01.2016) (12:15 CET) 这是用于编译源代码的 Makefile:

gcc -v输出:

0 投票
2 回答
492 浏览

c++ - 使用 AVX2 和范围保留的按位类型转换

我想将有符号字符向量转换为无符号字符向量。我想保留每种类型的值范围。

我的意思是当 unsigned char 元素的值范围在 0 - 255 之间时,signed char 的值范围是 -128 和 +127。

如果没有内在函数,我几乎可以这样做:

因此,我使用 AVX2 编写了以下程序:

当我显示变量 b 时,它是完全空的。我还检查以下情况:

和 :

我的调查显示部分问题与 and_not 操作有关。但我不明白为什么。

变量 b 应包含以下序列: [127, 126, 125, 132, 133, 134, 121, 120, 137, 138, 117, 140, 141, 142, 143, 144, 145, 0, 147, 148, 149、150、151、152、153、154、155、156、157、158、159、160]。

提前感谢您的帮助。

0 投票
0 回答
229 浏览

intrinsics - 英特尔收集指令

我对英特尔如何收集内在函数有点困惑。

我有以下简单的代码。其中一个是设置y[0]=y[1] = x[0], ... y[20002]=y[20003]=x[10002],另一个是设置y[i] = x[i], y[i+1] = x[i+2]。

我只是随机打印出一些值来检查正确性。我发现如果使用“zeros”,我可以让 y[10] 和 y[11] 都等于 2.46。但是,当我使用“步幅”时,我会得到一个 y[11] 的随机数,而 y[10] 仍然是 2.46。知道出了什么问题吗?

0 投票
2 回答
1438 浏览

c - 英特尔 FMA 指令提供零性能优势

考虑使用 Haswell 的 FMA 指令的以下指令序列:

可以使用非 FMA 指令表示相同的计算,如下所示:

人们会期望 FMA 版本比非 FMA 版本提供一些性能优势。

但不幸的是,在这种情况下,性能改进为零 (0)。

谁能帮我理解为什么?

我在基于核心 i7-4790 的机器上测量了这两种方法。

更新:

因此,我分析了生成的机器代码并确定 MSFT VS2013 C++ 编译器正在生成机器代码,因此 r1 和 r2 的依赖链可以并行调度,因为 Haswell 有 2 个 FMA 管道。

r3 必须在 r1 之后调度,因此在这种情况下,第二个 FMA 管道是空闲的。

我认为如果我展开循环以执行 6 组 FMA 而不是 3 组,那么我可以让所有 FMA 管道在每次迭代时都处于忙碌状态。

不幸的是,当我在这种情况下检查程序集转储时,MSFT 编译器没有选择允许我正在寻找的并行调度类型的寄存器分配,并且我证实我没有得到我正在寻找的性能提升为了。

有没有办法可以更改我的 C 代码(使用内在函数)以使编译器能够生成更好的代码?

0 投票
2 回答
3177 浏览

c# - 为什么只有 AVX 的处理器在许多 SIMD 算法中的性能优于 AVX2 处理器?

我一直在研究 C# 和 C++ 中 SIMD 算法的好处,发现在许多情况下,在 AVX 处理器上使用 128 位寄存器比在带有 AVX2 的处理器上使用 256 位寄存器提供更好的改进,但我没有不明白为什么。

改进是指 SIMD 算法相对于同一台机器上的非 SIMD 算法的加速。

0 投票
1 回答
279 浏览

visual-studio-2015 - MSVC 2015 AVX2 调试问题。并非所有 SIMD 通道都正确填充

我在 Visual Studio 2015 更新 1(针对 Win10)中调试我的 AVX2 代码时遇到问题。

使用调试器并检查 AVX2 寄存器时,与正常运行程序相比,使用断点和单步执行 _mm256_insertf128_ps-intrinsic(例如)时的内容不同。该错误很容易重现。只需在 main 函数中使用以下代码创建一个新的 Win 控制台应用程序:

在第 4 行设置断点并跳过它会导致第 5-6 行打印循环的以下输出:

运行程序给出以下输出:

我已经使用 MSVC 和 Intel 编译器(版本 16)进行了尝试,并且都表现出相同的行为。

有没有其他人偶然发现这个问题?有谁知道这可能是什么原因?有什么解决方法吗?

提前致谢!

0 投票
1 回答
795 浏览

c - 加载指令与 AVX 中的 AVX2 __m256i const* mem_addr

我无法像以前在 AVX 中所做的那样使用 AVX2 内在指令加载或存储。没有错误,只有警告,并且它不会在运行时执行加载/存储指令。其他 AVX2 指令正常工作,但我无法从内存中加载。

如下。

AVX:

AVX2:

那么,问题/区别是什么?有什么想法或解决方案吗?

0 投票
1 回答
449 浏览

assembly - 用于 AVX 加载/存储指令的 Intel Broadwell uop fusion

我正在尝试确定内存绑定矢量化循环的性能基线。我在 32 字节对齐的环境中使用带有 AVX2 指令的 Intel Broadwell 芯片执行此操作。

基线循环一次使用 8 个 YMM 寄存器从一个位置加载并非临时存储到另一个位置:

我用 YASM 组装它,然后用英特尔架构代码分析器 (IACA) 进行测试,它告诉我:

我的印象是,我可以在 Broadwell 上一次获得 2 倍负载,同时在端口 2 和 3 上同时加载。为什么没有发生这种情况?

谢谢


更新

根据以下建议,将 pd 替换为 ps,并将地址合并到一个寄存器中,新代码如下所示:

然后 IACA 告诉我:

这告诉我商店现在可以使用端口 7 作为地址并且操作已存储。IACA 告诉我,“块吞吐量”仍然是 8 次操作,因为需要额外操作才能将地址​​放到单个寄存器上。也许我做错了?

我还是不明白为什么加载操作不能融合