【问题标题】:Why isn't this loop vectorized?为什么这个循环没有向量化?
【发布时间】: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:我怀疑它会有所作为。
  • 这些xya 在该函数中声明为数组还是指针?
  • @Oli Charlesworth:这只是个人喜好问题。这就是为什么它是评论而不是答案。

标签: c++ optimization simd vectorization


【解决方案1】:

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

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

【讨论】:

  • 嗨 Oli- 有没有办法告诉编译器没有重叠?另外,我从编译器添加了一些更详细的输出 - 我怀疑它很有帮助,(并且似乎表明你怀疑什么?)但我不太确定它的含义。
  • @MarkD:您可以尝试在指针上使用restrict__restrict
【解决方案2】:

您需要告诉编译器xya 不重叠。在 C/C++ 术语中,这意味着通过使用 restrict (or __restrict) 声明这些指针来告诉编译器这些指针没有别名。 gcc 在假设没有别名的情况下会非常积极地进行优化,所以要小心。

【讨论】:

  • 感谢 MSN- 成功了。现在是时候阅读该链接并了解我做了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多