GCC无法对这个简单的循环进行矢量化("迭代次数无法计算"),但在同一代码中管理了类似的循环?

use*_*035 5 c++ gcc vectorization

所以,我有这个循环的C++代码:

for(i=0;i<(m-1);i++)    N4[i]=(i+m-1-Rigta[i]-1-N3[i])/N0;
Run Code Online (Sandbox Code Playgroud)

涉及的所有数量都是int.从GCC的矢量化报告中我得到:

babar.cpp:233: note: ===== analyze_loop_nest =====
babar.cpp:233: note: === vect_analyze_loop_form ===
babar.cpp:233: note: === get_loop_niters ===
babar.cpp:233: note: not vectorized: number of iterations cannot be computed.
babar.cpp:233: note: bad loop form.
Run Code Online (Sandbox Code Playgroud)

我想知道为什么'无法计算迭代次数'!?FWIW,m被宣布为 const int& m.更令人费解的是,我所拥有的代码与上面相同:

for(i=1;i<(m-1);i++)    a2[i]=(x[i]+x[i+m-1])*0.5f;
Run Code Online (Sandbox Code Playgroud)

以上的循环被矢量化就好了(这里a2xfloats).我正在编译

-Ofast -ftree-vectorizer-verbose=10 -mtune=native -march=native
Run Code Online (Sandbox Code Playgroud)

在i7上的GCC 4.8.1上的标志.

提前致谢,

编辑:

在@nodakai的想法之后,我尝试了这个:

const int mm = m;
for(i=0;i<(m-1);i++)    N4[i]=(i+m-1-Rigta[i]-1-N3[i])/N0;
Run Code Online (Sandbox Code Playgroud)

这不会让我安静下来:

babar.cpp:234: note: not vectorized: relevant stmt not supported: D.55255_812 = D.55254_811 / N0_34;
babar.cpp:234: note: bad operation or unsupported loop bound.
Run Code Online (Sandbox Code Playgroud)

所以当然,我试过:

const int mm=m;
const float G0=1.0f/(float)N0;
for(i=0;i<(mm-1);i++)   N4[i]=(i+mm-1-Rigta[i]-1-N3[i])*G0;
Run Code Online (Sandbox Code Playgroud)

然后产生:

babar.cpp:235: note: LOOP VECTORIZED.
Run Code Online (Sandbox Code Playgroud)

(例如成功).奇怪的是,mm似乎有必要(?!).

nod*_*kai 2

你能尝试一下这两个步骤,看看有什么不同吗?

  1. const int mm = m;在循环之前插入。
  2. 将所有出现的 替换mmm

  • 引用(和指针)的语义有时会令人困惑!问题是,“const int &amp;”是对(可能)可变循环边界的“只读”引用。这就是为什么 GCC 没有足够的信心,如果您使用“const int &amp;m”,循环边界不会在循环内改变。请参阅此处的示例代码 http://ideone.com/LRGold (2认同)