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

optimization - LLVM ScalarEvolution Pass 无法计算循环向量器的退出计数

我试图弄清楚如何运行 LLVM 的内置循环矢量化器。我有一个包含一个非常简单的循环的小程序(我曾经有一些输出,这就是为什么 stdio.h 尽管从未被使用过,但仍然被包含在内):

如您所见,它没有任何用处。我只需要 for 循环可以矢量化。我正在将其编译为 LLVM 字节码

然后我将矢量化器与

但是,调试输出给了我这个:

我在 LLVM 源代码中进行了一些研究,看起来 SCEV 来自 ScalarEvolution 通道,它的任务是(除其他外)计算返回到循环条件的后边缘的数量,在这种情况下(如果我没记错的话)应该是行程计数减去第一次行程(在这种情况下为 9,999)。我已经在一个更大的基准上运行了这个 pass,它在每个循环中都给了我完全相同的错误,所以我猜它不是循环本身,而是我没有给它足够的信息。

我花了很多时间梳理文档和谷歌结果,以找到使用此转换的完整 opt 命令的示例,但到目前为止还没有成功;我很感激任何关于我可能遗漏的提示(我是矢量化代码的新手,所以它可能非常明显)。

谢谢,

斯蒂芬

0 投票
1 回答
1131 浏览

gcc - gcc 自动矢量化(未处理的数据参考)

我不明白为什么这样的代码没有用 gcc 4.4.6 向量化

但是,如果我编写以下代码

gcc 成功自动矢量化此循环

如果我添加 omp 指令

我有以下错误未矢量化:未处理的数据参考

你能帮我解释一下为什么第一个代码和第三个代码不是自动矢量化的吗?

第二个问题:数学操作数似乎没有向量化(exp、log 等),例如这段代码

未矢量化。这是由于我的 gcc 版本吗?

编辑:使用新版本的 gcc 4.8.1 和 openMP 2011 (echo |cpp -fopenmp -dM |grep -i open) 我对所有类型的循环都有以下错误,甚至基本上

编辑2:

结果与

大量的

谢谢

0 投票
0 回答
92 浏览

c - Auto-Vectorize max 函数,使用 Visual 2012

我目前正在尝试对大量 uint_32 值运行简单的“最大函数”循环扫描。

使用 AVX2 内在,它相当简单:

唯一重要的操作是 _mm256_max_epu32 (vpmaxud),它有效地完成了请求的工作。表中的所有单元格都与单个常数进行比较。

现在,就可移植性而言,使用内在函数有点限制,我更愿意使用标准 C 编写一个等效版本,编译器会自动对其进行向量化。毕竟,内部循环似乎很简单,可以用廉价的启发式方法找出来。

唉,我没有通过这个简单的练习,即使 VS2012 关于自动矢量化的说明清楚地指出应该正确检测到这个函数:

http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-04-99/3007.Auto_2D00_Vectorizer_2D00_08_2D00_Cookbook.pdf

我试过的:

不起作用:与说明书语句相比,“if”语句是这里的问题:auto-vectorize在代码 1100 上失败

没有更好,尽管出于不同的原因:自动矢量化在代码 1304 上失败(循环包括不同大小的分配),这可能是一个错误,因为所有变量都使用相同的类型。

这个有效,并且是矢量化的。但它更复杂,因此运行速度明显比直接内在版本慢。

我想知道是否有办法让这个简单的“最大”操作由 Visual 自动矢量化(GCC 和 Clang 跟随)。

0 投票
1 回答
1828 浏览

r - 用curve()在R中绘制一个常数函数

所以我有一个错误...

考虑到这很奇怪

工作得很好......这让我想到了 R 如何处理 data.frame()s。

这意味着函数 Vectorize() 将解决我的问题。无论如何,这是 R 做出的隐含决定的一个尖锐例子,这会导致不一致的行为。

0 投票
2 回答
995 浏览

c99 - 将限制限定符与 C99 可变长度数组 (VLA) 一起使用

我正在探索 C99 中简单循环的不同实现如何根据函数签名自动矢量化。

这是我的代码:

当我编译时

我看到 VLA 案例不是自动矢量化的,但是当我添加标志来断言 no aliasing-fno-alias时,它们是。因此,我得出结论,我应该在源代码中规定这个,所以我尝试通过编译来做到这一点

编译器错误输出包括

但如您所见,我的 VLA 参数不允许使用限制。

所以我的问题是:有没有办法在 ISO C 中断言 VLA 没有别名?

请注意,我可以使用编译指示在源代码中断言没有别名 - 例如simd,omp simdivdep- 并获得我想要的自动矢量化,但这些不是 ISO C。

在这种情况下,ISO C 是指 C 的最新版本,在撰写本文时当然是 C11。

0 投票
0 回答
1363 浏览

c++ - 使用 GCC 进行自动矢量化

我想在我的代码中对矩阵向量产品进行向量化。我尝试在 GCC 中使用自动矢量化,但它根本不起作用,我不知道如何使它起作用。现在我尝试一个非常简单的示例代码:

我使用 gcc 版本 4.9.2 并使用标志编译(为了完整性)

我得到以下输出(我真的不明白这些东西的含义,但底线显然是矢量化不起作用):

我尝试了许多其他的东西和其他代码,但从来没有得到任何矢量化的东西。诀窍是什么?

0 投票
1 回答
550 浏览

c++ - 为什么向量化对于几乎相同的代码表现不同?

以下是执行相同功能的免费函数,但在第一种情况下,循环不是矢量化的,但在其他情况下是矢量化的。这是为什么?

来自编译器的相关消息(VS2013):

来自@tony 的评论

原因 1200:“循环包含阻止矢量化的循环携带的数据依赖性。循环的不同迭代相互干扰,因此矢量化循环会产生错误的答案,并且自动矢量化器无法向自己证明不存在此类数据依赖性。” 资源

0 投票
1 回答
5607 浏览

c - 了解 gcc 4.9.2 自动矢量化输出

我正在尝试学习 gcc 自动矢量化模块。从这里阅读文档后。

这是我尝试过的(debian jessie amd64):

然后,我简单地运行:

根据文档,我会假设看到一条清晰的线,上面写着:

但事实并非如此。我使用了 command line option:-fopt-info-vec-missed因为 command line option:-ftree-vectorizer-verbose现在是 no-op,根据报告

所以我的问题是:我如何阅读上面的输出来提取循环实际上是矢量化的?

如果有帮助:

0 投票
1 回答
656 浏览

gcc - 从 cython 对数组进行循环向量化

考虑以下在 Cython 内存视图上执行就地添加的示例:

使用这些 Cython 指令,看似等效的指令inplace_addinplace_addlocal可以编译为紧密的 C 循环。但是对于N=128(我期望的近似大小inplace_addlocal)比 快两倍(!)inplace_add,在编译之后gcc -Ofast(并直接编写一个采用 (int, double*, double*) 的 C 函数)或多或少与addlocal, with or没有#openmp simd)。传递-fopt-info给被矢量化的gcc节目,但不是.inplace_addlocalinplace_add

这是 Cython 生成的 C 代码的问题(即 gcc 确实无法推断出向量化代码所需的任何保证),还是 gcc(即缺少一些优化)或其他问题?

谢谢。

(交叉发布给 cython 用户)

0 投票
1 回答
4110 浏览

cython - cython boundscheck=True 比 boundscheck=False 快

考虑以下最小示例:

基本上沿某些特定轴对两个二维数组求和,并沿另一个轴找到最大化索引。

当使用 gcc -O3 编译并使用参数 (1, 2000, 2000) 调用时,添加 boundscheck=True 导致执行速度比 boundscheck=False 快两倍。

任何暗示为什么会这样?(好吧,我可能猜到这又与 GCC 自动矢量化有关……)

提前致谢。

(来自 cython 用户的交叉发布)