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

gcc - GCC 向量化编译指示

使用英特尔编译器,如果用户使用#pragma ivdep.

我在 GCC 中找到了一个#pragma GCC ivdep,但出现如下错误:

warning: ignoring #pragma GCC ivdep [-Wunknown-pragmas] #pragma GCC ivdep

0 投票
0 回答
632 浏览

c - 如何告诉 GCC 循环自动矢量化没有指针别名?(限制无效)

我在让 GCC 对这个循环进行矢量化时遇到问题:

这些变量来自两个矩阵(scoreMatrix 和 shiftMatrix,它们被声明为对齐并保证每个“行”开始对齐),以及一个 8 位数组 (fillRow)。GCC 不断告诉我:

其中第 600 行是有问题的循环。我不知道如何更明确地表明没有别名发生。以前我省略了 diagShift 和 diagScore 行,只使用了循环索引,例如 prevRow[j-1] 而不是“diagShift[j]”——结果完全相同。我能做些什么?

0 投票
1 回答
405 浏览

qt - 内存对齐 QVector().data()

我正在使用 Qt5 编写一个程序,我需要分配一个32 字节对齐QVector <float>的指针。data()

无论如何我可以在不修改 Qt 库本身的情况下做到这一点吗?

我的代码看起来像这样:

我正在使用英特尔的 C++ 编译器。

0 投票
1 回答
687 浏览

c - 展开循环并使用矢量化进行独立求和

对于以下循环,如果我告诉它使用关联数学,例如 with ,GCC 只会对循环进行矢量化-Ofast

这是与-Ofast -mavx

这清楚地表明循环已被矢量化。

但是这个循环也有一个依赖链。为了克服加法的延迟,我需要在 x86_64 上展开并至少进行 3 次部分求和(不包括需要展开 8 次的 Skylake 以及需要在 Haswell 和 Broadwell 上展开 10 次的 FMA 指令进行加法) . 据我了解,我可以使用-funroll-loops.

这是与-Ofast -mavx -funroll-loops.

GCC 确实展开了八次循环。但是,它不进行独立求和。它做了八个相关的和。这是没有意义的,也没有比不展开更好。

如何让 GCC 展开循环并进行独立的部分求和?


编辑:

即使没有 SSE,Clang 也会展开到四个独立的部分总和-funroll-loops,但我不确定它的 AVX 代码是否同样有效。无论如何编译器都不应该需要-funroll-loops-Ofast所以很高兴看到 Clang 至少对 SSE 这样做是正确的。

Clang 3.5.1 与-Ofast.

ICC 13.0.1-O3展开到两个独立的部分总和。ICC 显然只假设关联数学与-O3.

0 投票
2 回答
676 浏览

c++ - 英特尔自动矢量化行程计数解释?

我已经完成了相当多的线程级和进程级并行性,现在我正尝试使用英特尔 C++ 编译器进入指令级并行性,这是一个相当大的挑战。

在对循环进行一些自动矢量化并分析编译器日志时,我发现了一些我无法弄清楚的“估计循环的最大行程计数”。

例子:

此循环输出 12 次行程的最大行程计数估计值。我在某处读到,向量化过程每次行程总共可以处理 8 个元素,只要每个循环的过程成本小于 6 个 u 操作,据我所知,这个示例循环的成本为 1存储、2 次读取和 1 次算术运算。

所以理论上,我的旅行次数应该是 100/8 = 12.5 次旅行,因此是 13 次旅行。

这是编译器进行的汇总吗?还是在后台进行任何其他优化以使该过程少于 13 次行程?

还有一个问题,我的每周期 6 次 u 操作假设是否正确?有没有不适用的情况?

提前致谢

0 投票
2 回答
2327 浏览

visual-c++ - 如何编写编译器可以高效编译为 SSE 或 AVX 的 c++ 代码?

假设我有一个用 C++ 编写的函数,它对许多向量执行矩阵向量乘法。它需要一个指向要转换的向量数组的指针。我是否正确假设编译器无法有效地将其优化为 SIMD 指令,因为它在编译时不知道传递的指针的对齐方式(SSE 需要 16 字节对齐或 AVX 需要 32 字节对齐)?还是数据的内存对齐与最佳 SIMD 代码无关,数据对齐只会影响缓存性能?

如果对齐对生成的代码很重要,我如何让(visual c++)编译器知道我打算只将具有某种对齐的值传递给函数?

0 投票
1 回答
6416 浏览

gcc - GNU 中的 -ftree-vectorize 选项

使用 GCC 编译器,该-ftree-vectorize选项打开自动矢量化,并且在使用-O3. 它矢量化到什么水平?即,我会得到 SSE2、SSE4.2、AVX 或 AVX2 指令吗?我知道mavx,mavx2标志等的存在,但我想知道编译器在没有这些特定标志的情况下正在做什么来强制特定类型的矢量化。

0 投票
5 回答
2411 浏览

optimization - SSE 是多余的还是不鼓励的?

环顾这里和互联网,我可以找到很多关于现代编译器在许多实际情况下击败 SSE 的帖子,我刚刚遇到了一些我继承的代码,当我禁用 2006 年编写的一些基于整数的图像处理的 SSE 代码时并强制代码进入标准 C 分支,它运行得更快。

在具有多核和高级流水线等的现代处理器上,旧的 SSE 代码是否表现不佳gcc -O2

0 投票
3 回答
2252 浏览

gcc - GCC 暗示向量化

我希望 GCC 对下面的代码进行矢量化。-fopt-info告诉我 GCC 目前不是。我认为问题W在于k. 请注意,heightandwidth是常量,当前index_type设置为unsigned long

我删除了一些评论

我正在编译gcc -O3 -ffast-math -fopt-info -std=c11 ./neural.c -o neural -lm

有没有一种好方法可以使这个矢量化?你能给我介绍更多信息吗?

我的索引方法是不是一个坏主意(即k*width*width + ...)?我需要动态分配,并且我认为将事物保持在内存中会更好地进行优化。

编辑:这可能有用

-fopt-info-missed这些行的输出

编辑:

最小的例子是这里

我正在尝试使用 BLAS。在最小的例子中,它跑得更快,但在整个代码上它更慢......不知道为什么

编辑:

编译器正在优化代码。固定的。BLAS 现在更快了。修复是针对整个代码,而不是最小的示例。

编辑:

与上一次编辑的链接中的代码相同

0 投票
1 回答
106 浏览

c++ - 带模索引的自动矢量化?

我正在尝试使 clang++ 自动矢量化一个简单的位加扰循环,它执行以下操作:

如果dst和长度相同srckey编译器对这个循环进行矢量化没有问题,但我真正想做的是:

我不需要密钥与数据一样长,但是当我添加% 64矢量化器时,它会跑掉,剩下的就是一个正常的循环。即使% 8SIMD 寄存器的大小也会发生这种情况。我尝试的下一件事是:

但是矢量化器也不喜欢这样。
但是这样做:

确实得到了很好的矢量化,但是只有一个字节的密钥比我希望的要短。

有没有办法以取悦矢量化器的方式做这样的事情?