【问题标题】:Intel compiler optimization英特尔编译器优化
【发布时间】:2016-02-01 17:12:34
【问题描述】:

使用 -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 秒

【问题讨论】:

  • 你为什么要问我们?要求编译器生成汇编代码,然后检查它。
  • 为什么不反汇编两个版本,对比一下asm代码?
  • 对实际上不执行任何操作的任意代码进行性能优化是一项无望的努力。通过花时间优化重要的事情,您将了解更多信息。

标签: c intel compiler-optimization icc


【解决方案1】:

内部大循环没有副作用,因为您没有在任何地方使用 B,因此任何带有 -O3 的体面编译器都会消除它。

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

【讨论】:

    【解决方案2】:

    如果不检查生成的程序集,很难确定。一般有as-if rule,即

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多