当我编译应用程序时,性能比我预期的要差,我发现编译器正在报告如下警告。
备注#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/