Intel编译器优化

时间:2016-02-01 17:12:34

标签: c intel compiler-optimization icc

使用-O3

进行优化时,此代码几乎没有时间
void foo()
{
    int *A = (int *)malloc(1024*1024*sizeof(int));
    int *B = (int *)malloc(1024*1024*sizeof(int));

    double total_time = 0;


    for(int i=0;i<1024;i++)
    for(int j=0;j<1024;j++)
            A[i*1024+j] = rand()%1000;

    for(int t=0;t<10;t++)
    {
            double t1 = get_clock();

            for(int i=0;i<1024;i++)
                    for(int j=0;j<1024;j++)
                            B[j*1024+i] = A[i*1024+j];

            double t2 = get_clock();

            total_time += (t2-t1);
    }

    double time_taken = total_time/10;

    free(A);

    printf("time taken = %7.16f\n",time_taken);
}

什么编译器优化使得此代码从-O0的0.014秒到-03

的0.000000

2 个答案:

答案 0 :(得分:3)

如果不检查生成的组件,很难肯定。一般来说,有as-if rule,其中

  

允许任何和所有代码转换不会改变程序的可观察行为

例如,可能是因为在任何地方都没有使用A没有B,编译器只是省略了

for(int i=0;i<1024;i++)
for(int j=0;j<1024;j++)
        A[i*1024+j] = rand()%1000;

以及

for(int i=0;i<1024;i++)
    for(int j=0;j<1024;j++)
        B[j*1024+i] = A[i*1024+j];

答案 1 :(得分:3)

内部大循环没有副作用,因为你不在任何地方使用B,所以任何使用-O3的合适编译器都会消除它。

为避免这种情况,您可以尝试汇总值并在结尾处打印出结果。或者,从B打印一些随机元素可能会使编译器产生足够的怀疑,以避免消除