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

备注#25461:不完美的循环展开干扰2(预向量)

这是我的短代码。

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


索引变量num始终为1024。为什么循环不完全被阻塞?另外,当我修改如下代码时,不会发生卡纸现象!发生卡纸现象是什么情况?

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;
}

最佳答案

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

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

然后运行它。

眨眼之间

这是代码:

#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;
}

关于c++ - 展开和卡纸对大循环的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31971130/

10-11 00:36