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

GCC can't vectorize this simple loop ('number of iterations cannot be computed') yet managed a similar one in the same code?

本文关键字:循环 代码 管理 简单 矢量化 计算 GCC 迭代      更新时间:2023-10-16

那么,我就有了这个循环的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;

和上面的循环得到了很好的矢量化(这里a2xfloats)。我正在编译

-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似乎是必需的(?!)。

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

  1. 在循环前插入const int mm = m;
  2. 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;
}