所以,我有这个循环的C ++代码:
for(i=0;i<(m-1);i++) N4[i]=(i+m-1-Rigta[i]-1-N3[i])/N0;
所涉及的所有数量均为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.
我想知道为什么'迭代次数无法计算'!? FWIW,m
被声明为
const int& m
。更令人费解的是,我所拥有的代码就在上面:
for(i=1;i<(m-1);i++) a2[i]=(x[i]+x[i+m-1])*0.5f;
并且上面的循环得到了很好的矢量化(这里a2
和x
是floats
)。我正在编译
-Ofast -ftree-vectorizer-verbose=10 -mtune=native -march=native
在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;
这并没有让我安静下来:
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.
当然,我试过了:
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;
然后产生:
babar.cpp:235: note: LOOP VECTORIZED.
(例如成功)。奇怪的是,mm
似乎是必要的(?!)。
答案 0 :(得分:2)
您可以尝试这两个步骤,看看是否存在任何差异?
const int mm = m;
。m
的出现替换为mm
。答案 1 :(得分:1)
你的循环边界可能不会除以矢量化因子。请注意,在矢量化的循环中,循环迭代的时间少于不循环的循环。作为查看是否是这种情况的简单测试,您可以将非向量化循环的起点更改为1
,然后在循环之前执行0
大小写,如:
N4[0] = (m-1-Rigta[0]-1-N3[0]) / N0;
for(i=1;i<(m-1);i++) N4[i]=(i+m-1-Rigta[i]-1-N3[i])/N0;