当我分析我正在处理的代码时,有一个特别的热点是以下循环:
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
答案 0 :(得分:7)
您需要告诉编译器x
,y
和a
不重叠。在C / C ++术语中,这意味着通过用restrict
(or __restrict
)声明这些指针来告诉编译器这些指针不是别名。
答案 1 :(得分:4)
一种可能性是编译器无法保证没有别名。换句话说,编译器如何确保y
,a
和x
不以某种方式重叠?
如果你提高了详细程度,你可能会得到一些额外的信息。