gcc -O3优化

/*
 * O3 的描述如下:
 */
    -O3 完美包含 -O2 的全部优化选项,还有额外的优化。

    -fgcse-after-reload
        如果启用了-fgcse after reload,则会在重新加载后执行冗余负载消除过程。此通行证的目的是清理多余的溢出物。
        由-O3、-fprofile使用和-futo配置文件启用。

    -fipa-cp-clone
        进行功能克隆,使过程间恒定传播更强。启用时,当可以使用常量参数调用外部可见函数时,过程间常量传播会执行函数克隆。
        因为这种优化可以创建函数的多个副本,所以它可能会显著增加代码大小(请参阅--param ipa cp unit growth=value)。
        默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。

    -floop-interchange
        在石墨外进行回路交换。此标志可以提高循环嵌套上的缓存性能,并允许进行进一步的循环优化,如矢量化。例如,循环

        for (int i = 0; i < N; i++)
          for (int j = 0; j < N; j++)
            for (int k = 0; k < N; k++)
              c[i][j] = c[i][j] + a[i][k]*b[k][j];

        转换为

        for (int i = 0; i < N; i++)
          for (int k = 0; k < N; k++)
            for (int j = 0; j < N; j++)
              c[i][j] = c[i][j] + a[i][k]*b[k][j];

        默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。

    -floop-unroll-and-jam
        对可行循环应用展开和阻塞变换。在循环嵌套中,这会将外循环展开一些因子,并融合由此产生的多个内循环。
        默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。

    -fpeel-loops
        Peels循环有足够的信息,它们不会滚动太多(来自配置文件反馈或静态分析)。
        它还开启了完整的循环剥离(即,以较小的恒定迭代次数完全去除循环)。
        由-O3、-fprofile使用和-futo配置文件启用。

    -fpredictive-commoning
        执行预测通用优化,即重用在循环的先前迭代中执行的计算(尤其是内存加载和存储)。
        此选项在-O3级别启用。fprofile use和-futo profile也启用了它。

    -fsplit-loops
        如果循环包含一个条件,该条件对迭代空间的一侧始终为true,对另一侧始终为false,则将循环一分为二。
        由-fprofile使用和-futo配置文件启用。

    -fsplit-paths
        分割导致循环后边缘的路径。这可以改进死代码消除和公共子表达式消除。默认情况下,在-O3及以上时启用此选项。

    -ftree-loop-distribution
        执行循环分配。这个标志可以提高大循环体上的缓存性能,并允许进行进一步的循环优化,如并行化或矢量化。例如,循环

        DO I = 1, N
          A(I) = B(I) + C
          D(I) = E(I) * F
        ENDDO

        转换为

        DO I = 1, N
           A(I) = B(I) + C
        ENDDO
        DO I = 1, N
           D(I) = E(I) * F
        ENDDO

        默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。

    -ftree-partial-pre
        使部分冗余消除(PRE)更具攻击性。默认情况下,此标志在-O3处启用。

    -funswitch-loops
        将具有循环不变条件的分支移出循环,在两个分支上都有循环的副本(根据条件的结果进行修改)。


        由-fprofile使用和-futo配置文件启用。

    -fvect-cost-model=dynamic

    -fversion-loops-for-strides
        如果一个循环在一个具有可变步长的数组上迭代,请创建另一个假设步长始终为一的循环版本。例如:

        for (int i = 0; i < n; ++i)
          x[i * stride] = …;

        becomes:

        if (stride == 1)
          for (int i = 0; i < n; ++i)
            x[i] = …;
        else
          for (int i = 0; i < n; ++i)
            x[i * stride] = …;

        这对于Fortran中的假定形状数组特别有用,例如,它允许在假定连续访问的情况下进行更好的矢量化。
        默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。

        

你可能感兴趣的:(Linux,linux)