GCC 无法矢量化这个简单的循环("无法计算迭代次数"),但在同一代码中管理类似的循环?
GCC can't vectorize this simple loop ('number of iterations cannot be computed') yet managed a similar one in the same code?
那么,我就有了这个循环的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
提前感谢,
<标题>编辑:有了@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
似乎是必需的(?!)。
你能试一下这两个步骤,看看有什么不同吗?
- 在循环前插入
const int mm = m;
- 将
m
全部替换为mm
。
您的循环边界可能没有除以矢量化因子。注意,在矢量化的循环中,循环迭代的时间比没有矢量化的循环少一次。作为一种简单的测试,可以将非向量化循环的起始点更改为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;
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在这个代码结束循环中没有得到结束
- 下面是我为检测链接列表中的循环而制作的代码
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 在java中解决这段代码时面临循环中的问题
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 如何编译使用循环引用的代码?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 为什么这段代码会导致无限循环?
- 如果代码包含多个复杂度循环,如何计算复杂度
- 无休止的 do while 循环C++代码
- 循环代码错误C++
- C++ while 循环代码的含义
- 如何将查找组合的几个循环代码转换为递归方法
- 如何使用MySQL将c++for循环代码加速到查询中
- 如何将一系列if/else-if/else-if/关系链转换为线性循环代码
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍