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

eigen - 如何使用条件有效地向量化多项式计算(屋顶线模型)

我想将一个小次数的多项式 (2-5) 应用于长度可以在 50 到 3000 之间的向量,并尽可能高效地执行此操作。示例:例如,我们可以取函数:(1+x^2)^3,当x>3时,当x<=3时为0。对于双元素向量,这样的函数将执行 100k 次。每个向量的大小可以在 50 到 3000 之间。

一种想法是使用 Eigen: Eigen::ArrayXd v; 然后简单地应用一个仿函数: v.unaryExpr([&](double x) {return x>3 ? std::pow((1+x*x), 3.00) : 0.00;});

尝试使用 GCC 9 和 GCC 10,我发现这个循环没有被矢量化。我确实手动对其进行了矢量化,结果发现增益比我预期的要小得多(1.5 倍)。我还用逻辑 AND 指令替换了条件,基本上执行两个分支并在 x<=3 时将结果归零。我认为收益主要来自缺乏分支错误预测。

一些考虑 因素有多种因素在起作用。首先,我的代码中有 RAW 依赖项(使用内在函数)。我不确定这如何影响计算。我用 AVX2 编写了我的代码,所以我期待 4 倍的增益。我认为这起到了一定的作用,但我不能确定,因为 CPU 有无序处理。另一个问题是我不确定我尝试编写的循环的性能是否受内存带宽的限制。

问题 如何确定内存带宽或管道危害是否影响此循环的实现?我在哪里可以学习更好地矢量化这个循环的技术?Eigenr MSVC 或 Linux 中是否有用于此目的的好工具?我使用的是 AMD CPU,而不是 Intel。

0 投票
2 回答
447 浏览

c++ - 如何让 gcc 完全矢量化这个 sqrt 循环?

如果我拿这个代码

并编译g++ -S -c -O3 -fopenmp-simd -march=cascadelake,然后我在循环中得到这样的指令(编译器-资源管理器

XMM 是 128 位寄存器,但 cascadelake 支持 avx-512。有没有办法让 gcc 使用 256 (YMM) 或 512 位 (ZMM) 寄存器?

相比之下,ICC 默认为 cascadelake 使用 256 个寄存器:Compiling with products icc -c -S -O3 -march=cascadelake -qopenmp-simd( compiler-explorer )

并且您可以添加-qopt-zmm-usage=high使用 512 位寄存器的选项(compiler-explorer

0 投票
0 回答
89 浏览

c++ - “是字符串中的任何这些字符”的自动矢量化

检查字符是否在字符串中应该相当简单,以使用 simd 加速。我希望现代自动矢量化能给我带来可移植性+速度,但我不知道如何给编译器足够的提示来做到这一点。

这是我尝试过的:

根据神螺栓

https://godbolt.org/z/7ao1rG

clang 确实会发出一些不错的 simd,但 gcc 会展开循环。

这是 gcc 的继承限制,还是我可以更改我的代码以使其发出 simd 代替?

0 投票
1 回答
155 浏览

c - gcc 不自动向量化矩阵向量乘法

我刚刚开始使用我的矢量化代码。我的矩阵向量乘法代码没有被自动向量化gcc,我想知道为什么。此 pastebin 包含来自 -fopt-info-vec-missed.

我无法理解输出告诉我的内容以及它如何与我用代码编写的内容相匹配。

例如,我看到很多行说not enough data-refs in basic block,我无法通过谷歌搜索在网上找到很多关于此的详细信息。我还看到与内存对齐有关的问题,例如Unknown misalignment, naturally alignedvector alignment may not be reachable. 我所有的内存分配都是针对double使用的类型malloc,我相信它可以保证与该类型对齐。

环境:gcc在 WSL2 上编译

0 投票
0 回答
69 浏览

c++ - shuffle() 函数和 SIMD 代码生成

我一直在考虑 ecatmur 的功能,我相信它是更通用功能constexpr swap()的特例:shuffle()

I是源索引,J是目标索引。有许多不同的实现方式(我将不详述细节),但根据我的经验,在循环中shuffle()调用时,实现不会诱导 gcc 和 clang 生成同样好的 SIMD 代码。shuffle()因此我的问题。是否存在一种公式shuffle(),clang 和 gcc 比现有的更喜欢 SIMDify,可能使用内置函数或内在函数?我不是针对特定的指令集。

0 投票
1 回答
157 浏览

c++ - 如何在 Microsoft Visual Studio 2017 或 2019 中启用或使用自动矢量化以及自动并行化?

我正在尝试在下面的 for 循环中测试自动矢量化。我无法让自动矢量化工作。代码如下所示。

我将该行添加/Qvec-report:2 /Qpar-report:2 到我的项目属性页面的附加选项部分,但我没有收到说明矢量化是否失败的报告。

Qvec 和 Qpar 报告添加到项目属性页面

启用并行代码生成

0 投票
0 回答
102 浏览

c++ - 自动矢量化的最小循环长度?

我想知道自动矢量化器启用矢量化的最小循环长度应该是多少。?

例如:

使用 Rpass 标志,我得到以下评论。

有人可以帮助我了解 for 循环矢量化的基本要求是什么。?

0 投票
1 回答
324 浏览

c++ - 为什么向量化在这个 for 循环中没有好处?

我正在尝试对这个 for 循环进行矢量化。使用 Rpass 标志后,我得到以下评论:

我想了解这意味着什么。“交错不是有益的”是否意味着数组索引不正确?

0 投票
0 回答
118 浏览

c++ - Auto-Vectorization of Matrix Addition

I am trying simple matrix addition code to get auto vectorized.

I am getting following remarks after using Rpass analysis flag for the above code :

what changes should I do to make it vectorized and what does this remarks mean ?

0 投票
1 回答
82 浏览

c++ - C5002 1204 自动矢量化原因码是什么意思?

我是一名学生,我正在学习矢量化技术。我正在尝试使编译器矢量化一个将两个矩阵相乘的函数(每个矩阵由大小相等的矩阵元素组成)。代码如下所示:

为了使编译器矢量化它,我修改了这段代码,如下所示:

在构建期间编译器发出以下消息:

code.cpp(161) : info C5002: Loop not vectorized 由于原因:“1204”

此处未提及代码 1204 。此外,我还没有在谷歌上找到任何关于它的信息。我尝试使用__restrict修饰符但没有运气。

我使用 Visual Studio 2019,但我尝试使用 VS 2017 构建它,结果相同。

任何人都可以解释这个原因代码的含义吗?我不相信以前没有人遇到过这个问题。