1

当我编译我的应用程序时,性能比我预期的要差,我发现编译器正在报告如下所示的警告。

备注 #25461: 不完美的循环展开 - 被 2 卡住(前向量)

这是我的短代码。

for(i=0; i<num; i++){
    values[i] = func(a, b, c);
}

索引变量 num 始终为 1024。为什么循环展开卡住不完美?另外,当我像下面这样修改代码时,不会发生 unroll-jamming!发生展开卡纸的条件是什么?

for(i=0; i<num; i++){
    value += func(a, b, c);
}

实际上,代码是大文件的一部分,所以我不能在这里写完整的代码。但下面是包含 func() 的代码。

int values[num];

int func(int a, int b, int c)
{
    int i=0;
    int total=0;
    for(i=0; i<num; i++){
        total = a*b+c;
    }
    return total;
}

int main(void){
    int i=0;
    int min=0;
    for(i=0; i<num; i++){
        values[i] = func(a, b, c);
    }

    for(i=0; i<num; i++){
        value = values[i];
    }
    printf("value: %d\n", value);
    return 0;
}
4

1 回答 1

0

我创建了一个实际编译的代码版本:

可能发生了数学溢出,但我没有检查

然后运行它。

它在“眨眼”中运行

这是代码:

#include <stdio.h>

#define num (1024)

int values[num];
int value;
int a=2;
int b=3;
int c=4;

int func(int a, int b, int c)
{
    int i=0;
    int total=0;
    for(i=0; i<num; i++){
        total = a*b+c;
    }
    return total;
}

int main(void){
    int i=0;
    //int min=0;
    for(i=0; i<num; i++){
        values[i] = func(a, b, c);
    }

    for(i=0; i<num; i++){
        value = values[i];
    }
    printf("value: %d\n", value);
    return 0;
}
于 2015-08-13T13:55:38.033 回答