覆盖R的C编译标志的系统默认值

我正在使用RcppEigen为我的R代码编写一些C函数,我想尽可能地优化它们的编译.当我过去使用Eigen时,我从-O3和-fopenmp得到了显着的提升.在Dirk的 advice之后,我编辑了〜/ .R / Makevars,以便使用这些标志编译我的Eigen代码
CPPFLAGS=-O3 -fopenmp

这工作 – 当我检查编译期间发生了什么(ps ax | grep cpp)时,我看到:

27097 pts/6    R+     0:00 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/cc1plus -quiet -I/usr/include/R -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/Rcpp/include -I/home/sf/R/x86_64-redhat-linux-gnu-library/3.0/RcppEigen/include -D_GNU_SOURCE -D_REENTRANT -DNDEBUG -D_FORTIFY_SOURCE=2 file69b757e053ad.cpp -quiet -dumpbase file69b757e053ad.cpp -m64 -mtune=generic -auxbase-strip file69b757e053ad.o -g -O3 -O2 -Wall -fopenmp -fpic -fexceptions -fstack-protector --param ssp-buffer-size=4 -o -

我想要的旗帜在那里,-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.

那么也许同时拥有-O2和-O3也没关系?

解决方法

我认为你的〜/ .R / Makevars需要CXXFLAGS而不是CPPFLAGS

我在以下repo中设置Makevars来对R / Rcpp中的各种C编译器标志进行基准测试
https://github.com/jackwasey/optimization-comparison

我使用https://github.com/jimhester/covr中的函数以编程方式执行此操作,如果这对您有用.

另外,你看到以下情况了吗? R: C++ Optimization flag when using the inline package

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...