【发布时间】:2012-10-30 10:02:04
【问题描述】:
我有以下 for 循环。当我打开类型数组时,代码不会矢量化。当我将类型固定为“1”时,gcc 会执行一个 primitize 矢量化矢量化。有没有人有任何建议来触发某种矢量化?
#define type(M,N) type[(M)*sizeX + (N)]
for (int i = 0; i < sizeY - 1; i++)
{
for (int j = 0; j < sizeX - 1; j++)
{
const int id = type(i, j);
//const int id = 1; //vectorizes
const float A = this->A[id];
const float B = this->B[id];
a(i, j) = A * a(i, j) + B * (b(i, j) - b(i + 1, j))*(p[i]);
}
}
gcc 4.7.1 的近似误差
45: not vectorized: not suitable for gather A_26 = *D.14145_25;
编辑 1
所有数组都存储为指针,并使用 restrict 关键字定义为某个类的成员。
编辑 2
如果 'type' 很小,我能做些什么吗?
编辑 3
小意味着8。
【问题讨论】:
-
type 是在类中使用 restrict 关键字定义的整数数组(与所有数组一样)
-
你像调用函数一样调用
type()。你能给出那个函数的定义吗? -
a()和b()怎么样?相同的宏? -
是的...重要的一点是,当类型条件负载矢量化消失。
-
@Mysticial:在他的代码的第一行。
标签: c++ gcc compiler-optimization vectorization