为什么GCC自动矢量化也依赖于循环迭代变量的类型?

时间:2016-05-04 22:44:41

标签: c gcc vectorization auto-vectorization

我有一个带循环的简单函数。 GCC能够在此函数中对循环进行矢量化。我的GCC版本是4.7.4。

void  __attribute__ ((noinline)) foo(int *__restrict__ ptr1,  int *__restrict__ ptr2, int *__restrict__ ptr3, unsigned int cnt)
{
unsigned int i;

ptr1 = __builtin_assume_aligned (ptr1, 32);
ptr2 = __builtin_assume_aligned (ptr2, 32);
ptr3 = __builtin_assume_aligned (ptr3, 32);

for(i = 0; i < cnt; i++)
 {
    ptr3[i] = ptr1[i] * ptr2[i];
 }
}

但是,当我将函数参数cnt的类型从unsigned int更改为int时,GCC无法优化循环。

void  __attribute__ ((noinline)) foo(int *__restrict__ ptr1,  int *__restrict__ ptr2, int *__restrict__ ptr3, int cnt)
{
unsigned int i;

ptr1 = __builtin_assume_aligned (ptr1, 32);
ptr2 = __builtin_assume_aligned (ptr2, 32);
ptr3 = __builtin_assume_aligned (ptr3, 32);

for(i = 0; i < cnt; i++)
 {
    ptr3[i] = ptr1[i] * ptr2[i];
 }
}

在这个新版本的foo中,循环没有矢量化。循环的GCC输出是:

142:未矢量化:数据参考分析失败D.62366_17 = * D.62365_16;

似乎GCC需要参数和它在循环迭代中使用的变量具有相同的确切类型。为什么矢量化在这种情况下依赖于循环迭代变量类型?

0 个答案:

没有答案