【发布时间】:2011-11-22 10:18:56
【问题描述】:
当我分析我正在处理的代码时,一个特别的热点是以下循环:
for(int loc = start; loc<end; ++loc)
y[loc]+=a[offset+loc]*x[loc+d];
其中数组 y、a 和 x 没有重叠。在我看来,这样的循环应该很容易矢量化,但是当我使用带有选项“-O3 -ftree-vectorize -ftree-vectorizer-verbose=1”的 g++ 进行编译时,我没有得到任何迹象表明这个特定的循环是矢量化的.但是,在上面的代码之前发生了一个循环:
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
【问题讨论】:
-
为什么不使用指向
a[offset]和x[d]的指针呢? -
感谢 K-ballo 的建议。只是按照你的建议做了,这使事情更具可读性(尽管它对我的矢量化没有影响)。
-
@K-ballo:我怀疑它会有所作为。
-
这些
x、y和a在该函数中声明为数组还是指针? -
@Oli Charlesworth:这只是个人喜好问题。这就是为什么它是评论而不是答案。
标签: c++ optimization simd vectorization