问题标签 [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 回答
394 浏览

c++ - 普通循环未使用 gcc 4.8.5 自动矢量化

我正在尝试了解有关 gcc 中自动矢量化的更多信息。在我的项目中,我必须使用 gcc 4.8.5,并且我看到一些未矢量化的循环。因此,我创建了一个小例子来玩,看看为什么它们不是。

我感兴趣的是 gcc 不矢量化循环并找出我如何矢量化它的事实。不幸的是,我对 GCC 的输出消息不是很熟悉。

a)我希望这个循环将被向量化为一个微不足道的案例

b) 有什么我遗漏的琐碎事情吗?

非常感谢大家提前...

小例子是:

我用 gcc 4.8.5 编译它:

我从编译器得到的输出是:

编辑: 在马茨回答以下之后:

@马特:

非常感谢您的回答。我不知道向量没有对齐。此信息非常有用,因为许多人会理所当然地认为循环将被矢量化,即使他们使用向量作为容器。

不幸的是,即使您进行了更改,来自 gcc 的报告仍然没有矢量化(这次有不同的消息):

汇编输出是(希望我复制粘贴正确的部分,因为我的汇编知识不是很好):

0 投票
1 回答
909 浏览

c - 循环中的 gcc 自动矢量化控制流程

在下面的代码中,为什么第二个循环可以自动矢量化,而第一个不能?如何修改代码使其自动矢量化?gcc 说:

注意:未矢量化:循环中的控制流。

我正在使用 gcc 8.2,标志是 -O3 -fopt-info-vec-all。我正在为 x86-64 avx2 编译。

更新:这确实自动矢量化:

我仍然想知道为什么 gcc 说第一个循环的控制流。

0 投票
1 回答
254 浏览

c - 是否可以使 GCC 自动矢量化器输出内在函数而不是汇编?

作为通常优化的一部分,我在每次编译时仅使用自动矢量化器将用户编写的循环代码转换为 SIMD 指令时看到的“问题”是,如果您更改编译器,您无法确定它是否也会自动矢量化您的代码同样好。

因此,如果您只想针对单个处理器,我想让编译器为我生成高级 C 代码,用于特定函数,该函数使用 x86 内在包装函数,这些函数与不同的编译器供应商通用。

是否有一个反编译器,或者甚至是 GCC 的编译器选项给我这个代码?

0 投票
0 回答
206 浏览

c++ - 使用 SSE2 将字节自动矢量化为使用 gcc 的位图

使用正确构造的 C/C++ 代码,可以提示 gcc 自行生成高效的 SIMD 汇编程序,而无需使用内在函数,例如https://locklessinc.com/articles/vectorize/

我正在尝试为 movemask 操作(PMOVMSKB / *_movemask_epi8 系列)实现类似的效果,但到目前为止还没有成功。

我能想到的最简单的代码:

导致装配无法使用移动掩码指令:https ://godbolt.org/z/3XimYc

有没有人知道是否有办法在不显式使用内在函数的情况下使用 gcc 做到这一点?

我还没有查看 MD 文件和 gcc 中的相关实现(https://github.com/gcc-mirror/gcc/tree/master/gcc/config/i386)。

0 投票
2 回答
227 浏览

c++ - 生成缓慢的 vpermpd 指令;为什么?

我有一个过滤器m_f,它v通过

perf告诉我们这个循环在哪里很热:

在此处输入图像描述

和有意义vaddpdvfma231pd没有它们,我们当然无法执行此操作。但是缓慢vpermpd让我感到困惑。它在完成什么?

0 投票
1 回答
393 浏览

c - 自动矢量化随机播放指令

我试图让编译器(v)pshufd通过自动矢量化生成指令(或等效指令)。这出乎意料的困难。

例如,假设一个包含 4 个uint32值的向量,转换 : A|B|C|D => A|A|C|C应该使用单个指令(对应的内在 : _mm_shuffle_epi32())来实现。

尝试仅使用正常操作来表达相同的转换,我可以编写例如:

编译器似乎无法进行良好的转换,而是生成了十几个指令的标量和向量代码的混合。手动展开会产生更糟糕的结果。

有时,一些细节会妨碍编译器正确翻译。例如,数组中元素的nb应该是2的明确幂,指向表的指针应该保证没有别名,对齐应该明确表达等等。在这种情况下,我没有找到任何类似的原因,并且我仍然坚持使用手动内在函数来生成合理的程序集。

有没有办法(v)pshufd只使用普通代码并依赖编译器的自动矢量化器来生成指令?

0 投票
1 回答
628 浏览

gcc - 如何限制 GCC 中的自动矢量化级别?

0 投票
1 回答
56 浏览

gcc - 当数组是函数参数时,矩阵乘法中的 Gcc 自动向量化奇怪行为

我正在用不同的优化级别(出于教学目的)对不同的矩阵乘法形式进行基准测试,并且我在 gcc 自动向量化中检测到了一个奇怪的行为。当数组是参数时它无法向量化(参见 mxmp),但当数组是全局变量时它能够向量化(参见 mxmg)

gcc 版本 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 但行为与旧 gcc 版本相同

编译选项:gcc -O3 -mavx2 -mfma

我希望编译器在这两个函数中执行相同的操作,但是 mxmp 需要大约 10 倍于 mxmg 的执行时间。探索汇编代码,恰好 gcc 能够自动矢量化 mxmg(当数组是全局变量时)但无法矢量化 mxmp(其中数组是参数)。

用 kij 形式尝试了同样的方法,它能够对这两个函数进行矢量化。

我需要帮助来发现为什么 gcc 有这种行为。以及如何帮助 gcc(编译指示、编译选项、属性...)正确矢量化 mxmp 函数。谢谢

0 投票
2 回答
177 浏览

c - 为什么 C/RUST 中的一个加法计算在结果 ASM 中有 3 个双精度浮点加法工具?

简单的 C 代码,只有一个双精度加法。

在编译器资源管理器中获取 ASM 结果:https ://godbolt.org/z/tJ-d39

有一个addpd和两个addsd。两者都是双精度相关的。

另一个类似的 rust 代码,得到了更多的双精度添加工具:https ://godbolt.org/z/c49Wuh

0 投票
0 回答
115 浏览

c++ - 如何在 C++ 源代码中设置多个优化参数

我目前正在通过自动矢量化熟悉 C++ 代码优化。由于我们在一个大型存储库中工作,我喜欢为特定功能激活优化,而不是全局设置它们。

我怎样才能做到这一点?

我在同一版本中使用 GCC 5.4.0 以及随附的 ARM GCC 交叉编译器。我尝试使用该__attribute__((optimize("flags")))语句设置多个参数,但它不起作用。我知道我可以将这些函数导出到单独的源文件中并使用编译器编译指示,但将其直接附加到相关函数会更容易。

我尝试了不同的组合

或者

但似乎没有一个工作。

这是完整的功能:

希望有人可以帮助我。谢谢!