问题标签 [auto-vectorization]

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 回答
778 浏览

gcc - 如何使用 GCC 获得更好的矢量化?

考虑执行相同计算的这三个函数:

GCC 4.7.2(带有 -O3 -mavx)对循环版本进行矢量化,但对展开的循环使用标量操作。三个版本所采用的(标准化)时间分别为 3.3(循环、自动矢量化)、1.2(展开、标量)、1(手动 avx)。展开版本和手动矢量化函数之间的性能差异很小,但我想强制矢量化,因为它在完整代码中是有益的。

使用不同的编译器进行测试(请参阅https://godbolt.org/g/HJH2CX)表明,clang 会自动对展开的循环进行矢量化(从版本 3.4.1 开始),但 GCC 到版本 7 则不会。我可以使用 GCC 自动获得类似的矢量化吗?我只发现与循环矢量化相关的优化选项没有帮助。GCC 网站自 2011 年以来没有显示任何消息。

0 投票
2 回答
411 浏览

c++ - 在 std::vector 上的 Visual Studio 2012 express 中的自动矢量化没有发生

我有一个简单的程序,其中我有 3 个 std::vector 并在 for 循环中使用它们。在启用编译标志后,我正在测试这些循环是否被优化。但是 Visual Studio 显示由于原因 1200,循环未矢量化。我的示例代码如下。

下面是使用启用选项“/Qvec-report:2”的代码编译的输出。

2> --- 分析函数:main 2> d:\test\ssetestonvectors\main.cpp(12) : info C5002: loop not vectorized due to reason '1200' 2> d:\test\ssetestonvectors\main.cpp( 18) : info C5002: loop not vectorized 由于原因“1200”

当我在 msdn 页面上阅读错误代码 1200 时: https ://msdn.microsoft.com/en-us/library/jj658585.aspx 它指定错误代码 1200 是由于“循环包含循环携带的数据依赖”

我无法理解这个循环是如何包含它的。我有一些需要优化的代码,以便它可以使用 Visual Studio 的自动矢量化功能,以便可以针对 SSE2 进行优化。此代码包含向量操作。所以我无法做到这一点,因为每次视觉工作室都会显示一些这样的错误代码。

0 投票
2 回答
209 浏览

c++ - Visual Studio 2012 中 Eigen 类型向量的自动向量化效果不佳

我有 Eigen::vector3d 类型的 std::vector ,当我使用 Microsoft Visual Studio 2012 编译此代码时,打开/Qvec-report:2标志以报告矢量化详细信息。它显示由于 msdn 页面上指定的原因 1304(循环包含不同类型的分配)而未矢量化循环 - https://msdn.microsoft.com/en-us/library/jj658585.aspx

我的代码如下:

所以我无法理解如何告诉编译器,这是固定大小的数据,固定大小的分配将在这里发生。

0 投票
3 回答
455 浏览

c - 为什么 gcc 自动向量化不适用于大于 3x3 的卷积矩阵?

我已经为卷积矩阵实现了以下程序

问题是当我-O3用于自动矢量化时,它只适用于 3x3 卷积矩阵。我已经看到组装输出和自动矢量化只是对 3x3 内核进行了一些更改并合理地提高了性能(快 20 倍注意:不寻常 func 的标量版本比 naive fun 慢)但是 5x5 卷积矩阵没有任何改进

更新:我在问题中添加了简单的实现,并将图片大小更改为 NxM,将卷积矩阵更改为内核,将 Cdim1xCdim2 更改为 PxQ,并将 seqConv 函数更改为不寻常的澄清。问题不在于改进异常功能的实现。问题是虽然所有元素都在内存的相同位置,但 gcc 使用启发式等。为什么 gcc 未能改进这种不寻常的实现? 注意:问题不在于幼稚的实现。gcc -O3将 3x3、5x5 内核的简单实现提高了约 7 倍的速度。它也适用于 7x7 和 9x9 加速约 1.5 倍。为了改进卷积,我使用了内在函数,并且加速比简单的实现提高了 40 倍以上,比不寻常的卷积快了 2 倍。所以我的矢量化比我不寻常的矢量化快约 80 倍。手动调整优化不是问题。自动矢量化优化是问题所在,也是失败的原因。

GCC 命令:gcc -Wall -march=native -O3 -o "%e" "%f"

平台:Linux mint、Skylake、gcc 6.2

提前致谢

0 投票
2 回答
439 浏览

c++ - Clang 或 GCC 是否能够自动矢量化手动展开的循环?

我对编写特定类型的数值算法的代码风格有一个想法,您可以纯粹以与数据布局无关的方式编写算法。

即,您的所有函数都采用(一个或多个)标量参数,并(通过指针)返回一个或多个标量返回值。因此,例如,如果您有一个采用 3d 浮点向量的函数,而不是采用具有三个成员的结构或 float[3] xyz,您采用 float x、float y、float z。

这个想法是您可以更改输入和输出数据的布局,即您可以使用数组结构与结构数据布局的数组、缓存效率的平铺布局、SIMD 与多核粒度等...无需为所有数据布局组合重写所有代码。

该策略有一些明显的缺点:

  • 你不能在你的函数中使用 for 循环来使你的代码更紧凑
  • 您的函数在其签名中需要更多参数

...但是如果您的数组很短,这些都是可口的,并且它可以让您不必多次重写代码以使其快速。

但特别是,我担心编译器可能无法接受像 x+=a; 这样的东西。y+=b; z+=c; w+=d 并将其自动矢量化为单个 SIMD 向量添加,如果您想在调用堆栈的底部执行 SIMD,而不是在内联函数堆栈的顶部执行 SIMD。

clang 和/或 gcc 是否能够在 C 和/或 C++ 代码中“重新滚动”手动展开的循环(可能在内联函数之后)并生成矢量化机器代码?

0 投票
1 回答
157 浏览

c++ - 为什么来自对齐的 std::array 的初始自动矢量化负载是标量?(g++/clang++)

我无法理解是什么阻止编译器在从std::array<uint64_t,...>读取数据时使用初始向量加载。

我知道 gcc 可以使用 -fopt-info-vec-* 生成调试信息。我无法从详细日志中找到任何可以表明为什么两个编译器都做出相同的次优决定来使用初始标量加载的内容。

另一方面,我不知道如何让 clang 提供有关矢量化问题的详细信息。-Rpass-analysis=loop-vectorize 仅报告 init 中的循环不值得交错。当然,我的内在版本证明循环可以向量化,但所需的转换可能过于复杂,除非来自编译器。

我当然可以使用内在函数实现热路径,但这需要为每个 cpu argitecture 复制相同的逻辑。我更喜欢编写编译器可以完美矢量化的标准 C++ 代码。使用 target_clones 属性或宏和 target 属性使用不同的标志多次编译相同的代码变得很简单。

如何让编译器告诉为什么负载无法矢量化?

我怀疑 gcc 可能已经打印了我只是不知道我在寻找什么的信息。

为什么自动矢量化在初始加载时失败?

0 投票
2 回答
1269 浏览

c - 如何在 gcc 中启用 sse3 自动矢量化

我有一个简单的循环,取 n 个复数的乘积。当我执行这个循环数百万次时,我希望它尽可能快。我知道使用 SSE3 和 gcc 内在函数可以快速做到这一点,但我对是否可以让 gcc 自动矢量化代码感兴趣。这是一些示例代码

您从 gcc -S -O3 -ffast-math 获得的程序集是:

0 投票
3 回答
7279 浏览

c - 如何帮助 gcc 向量化 C 代码

我有以下 C 代码。第一部分只是将复数矩阵从标准输入读入称为 的矩阵M。有趣的部分是第二部分。

我用gcc -fopt-info-vec-all -O3 -ffast-math -march=bdver2 permanent-in-c.c -lm. 这向我解释了为什么几乎没有循环被矢量化。

性能最重要的部分是第 47--50 行,它们是:

gcc 告诉我:

如何解决阻止这部分被矢量化的问题?


奇怪的是这部分是矢量化的,但我不知道为什么:


gcc -fopt-info-vec-all -O3 -ffast-math -march=bdver2 Permanent-in-cc -lm 的完整输出位于https://bpaste.net/show/18ebc3d66a53

0 投票
2 回答
439 浏览

c++ - 展开用于自动矢量化的指针增量循环

我想知道是否展开这个循环:

进入

将在自动矢量化方面帮助编译器。


我可以想象它无论如何都会对第一个循环进行矢量化。但是,明确的帮助吗?

0 投票
3 回答
1631 浏览

c++ - C++ 矩阵乘法自动向量化

我启用了自动矢量化。当我编译代码时,我收到以下警告:

MSDN指定

循环体包括对数组的非连续访问。

我已经查看了这些链接12以寻求帮助,但没有运气。

这是我的源代码:

欢迎任何帮助。