覆盖C++;来自R的编译标志 我使用RCPPEGIGN为我的R代码编写一些C++函数,我希望尽可能地优化它们的编译。当我在过去使用Eigen时,我从-O3和-fopenmp中得到了显著的提升。在Dirk之后,我编辑了~/.R/Makevars,这样我的特征码就可以用以下标志编译: CPPFLAGS=-O3 -fopenmp

覆盖C++;来自R的编译标志 我使用RCPPEGIGN为我的R代码编写一些C++函数,我希望尽可能地优化它们的编译。当我在过去使用Eigen时,我从-O3和-fopenmp中得到了显著的提升。在Dirk之后,我编辑了~/.R/Makevars,这样我的特征码就可以用以下标志编译: CPPFLAGS=-O3 -fopenmp,c++,r,g++,eigen,rcpp,C++,R,G++,Eigen,Rcpp,这是可行的——当我检查编译过程中发生了什么(ps ax | grep cpp)时,我看到: 我想要的旗帜在那里,-O3和-fopenmp。但我也看到了-O2,这可能是系统范围内的默认值(我通过删除~/.R/Makevars验证了这一点,事实上,-O2在那里,但-O3和-fopenmp没有。) 所以问题是:我如何去除-O2?或者,这真的重要吗?g++手册页上说: -O3 Optimize yet more. -O3 turns on all optimizations specified

这是可行的——当我检查编译过程中发生了什么(ps ax | grep cpp)时,我看到:

我想要的旗帜在那里,-O3和-fopenmp。但我也看到了-O2,这可能是系统范围内的默认值(我通过删除~/.R/Makevars验证了这一点,事实上,-O2在那里,但-O3和-fopenmp没有。)

所以问题是:我如何去除-O2?或者,这真的重要吗?g++手册页上说:

   -O3 Optimize yet more.  -O3 turns on all optimizations specified by -O2 and also 
   turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse- 
   after-reload, -ftree-vectorize and -fipa-cp-clone options.

因此,在
~/.R/Makevars

我在下面的Reo中设置了MakEARS,以在R/Rcpp中对各种C++编译器标志进行基准测试

如果对您有用的话,我将使用中的一个函数以编程方式实现这一点


另外,您是否看到以下内容

天气很好
gcc
将使用通过其标志传递的最高级别优化(IIUC)。@KevinUshey:你确定吗?我一直认为它使用最左边的标志?你有消息来源吗?啊,你说得对。从--
中,如果您使用多个-O选项,有或没有级别编号,则最后一个这样的选项是有效的。
。所以看起来它实际上是最合适的。
   -O3 Optimize yet more.  -O3 turns on all optimizations specified by -O2 and also 
   turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse- 
   after-reload, -ftree-vectorize and -fipa-cp-clone options.