使用 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 自动矢量化对运行时没有影响,即使在所谓“有利可图”的情况下也是如此