使用 gcc 进行自动矢量化?

Posted

技术标签:

【中文标题】使用 gcc 进行自动矢量化?【英文标题】:Getting auto-vectorization with gcc? 【发布时间】:2011-06-22 08:48:43 【问题描述】:

在评估负对数似然的情况下,我必须 执行一系列可以从矢量化中受益的操作

0) for (i = 1...n) a[i] = 0; // 但我认为这是

std::fill(a.begin(), a.end(), 0) 已经是最优的了

1) for (i = 1...n) a[i] += b * c[i];

2) 总和 = 0; for (i = 1 .. n) sum += a[i] * log( b[i] / c );

你知道是否有希望让 gcc 434 去做 自动矢量化,以及我应该如何编写循环来帮助他(例如 使用索引与使用迭代器,我应该更简单地分解(2) 循环,...) 到目前为止,我正在使用双打,必须检查我是否可以移动到浮动 至少 (1)。

【问题讨论】:

你指定了 -ftree-vectorize 吗? 【参考方案1】:

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

使用所需的选项,-O3 -msse2

有关更多选项,请阅读上面的文档。

【讨论】:

您可以通过添加 -ftree-vectorizer-verbose=2 来查看矢量化器是否执行了任何优化【参考方案2】:

对于像 2) 这样的浮点减少的自动向量化,您需要启用 -funsafe-math-optimizations

在类似 i386 的目标上,您还需要添加 -mfpmath=sse

【讨论】:

以上是关于使用 gcc 进行自动矢量化?的主要内容,如果未能解决你的问题,请参考以下文章

自动矢量化的实际使用?

GCC 自动矢量化对运行时没有影响,即使在所谓“有利可图”的情况下也是如此

gcc、clang 和 msvc 的 C++ 自动矢量化要求

在 GCC 的函数中禁用特定循环的自动矢量化

gcc中的数组与指针自动矢量化

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