我使用编译器的不同选项(O0 O1 O2 O3 Os)分析以下代码。第一次迭代是"预热缓存"的循环。对于 O0 和 O1,衰减时间不同,0.00 越高,因为输入参数(N 和 ITER)越大。
当我使用 O2、O3 和 Os 选项时,问题就出现了。时间是0.000。我已经阅读,可能是死代码检测。可能吗?为什么会这样?
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i * 128;
b = a / 32;
}
gettimeofday(&final, NULL);
tiempo = (final.tv_sec-inicio.tv_sec + (final.tv_usec-inicio.tv_usec)/1.e6);
fprintf(fp,"%lfn",tiempo);
printf("%lft",tiempo);
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
gettimeofday(&inicio, NULL);
for(j=0; j<ITER; j++)
for(i=0; i<N; i++){
a = i << 7;
b = a >> 5;
}
谁能帮我?谢谢
由于计算中涉及的变量不会在循环之外访问,因此编译器完全删除代码不会让我感到惊讶。
两种简单的检查方法:
- 将
a
和b
声明为volatile
。 - 查看来自不同优化级别的结果程序集。