为什么这个循环没有矢量化?

时间:2011-09-22 00:59:04

标签: c++ optimization simd vectorization

当我分析我正在处理的代码时,有一个特别的热点是以下循环:

for(int loc = start; loc<end; ++loc)
    y[loc]+=a[offset+loc]*x[loc+d];

其中数组y,a和x没有重叠。在我看来,像这样的循环应该很容易矢量化,但是当我使用g ++编译选项“-O3 -ftree-vectorize -ftree-vectorizer-verbose = 1”时,我没有得到这个特定循环被矢量化的迹象。但是,在上面的代码之前发生了一个循环:

for(int i=0; i<m; ++i)
    y[i]=0;

根据输出进行矢量化。有关为什么第一个循环没有矢量化,或者我怎么能解决这个问题的想法? (我不是所有关于矢量化概念的人,所以我很可能遗漏了一些非常明显的东西)

根据Oli的建议,提高详细程度会产生以下注释(虽然我通常擅长阅读编译器警告/错误/输出,但我不知道这意味着什么):

./include/mv_ops.h:89: note: dependence distance  = 0.
./include/mv_ops.h:89: note: accesses have the same alignment.
./include/mv_ops.h:89: note: dependence distance modulo vf == 0 between *D.50620_89 and *D.50620_89
./include/mv_ops.h:89: note: not vectorized: can't determine dependence between *D.50623_98 and *D.50620_89

2 个答案:

答案 0 :(得分:7)

您需要告诉编译器xya不重叠。在C / C ++术语中,这意味着通过用restrict (or __restrict)声明这些指针来告诉编译器这些指针不是别名。

时,gcc在假设没有别名时非常积极地进行优化。

答案 1 :(得分:4)

一种可能性是编译器无法保证没有别名。换句话说,编译器如何确保yax不以某种方式重叠?

如果你提高了详细程度,你可能会得到一些额外的信息。

相关问题