sta*_*lax 8 c++ r g++ rcpp eigen
我正在使用RcppEigen为我的R代码编写一些C++函数,我想尽可能地优化它们的编译.当我过去使用Eigen时,我从-O3和-fopenmp得到了显着的提升.根据Dirk的建议,我编辑了〜/ .R/Makevars,以便使用这些标志编译我的Eigen代码:
CPPFLAGS=-O3 -fopenmp
Run Code Online (Sandbox Code Playgroud)
这工作 - 当我检查编译期间发生了什么(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 -
Run Code Online (Sandbox Code Playgroud)
我想要的旗帜在那里,-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.
Run Code Online (Sandbox Code Playgroud)
那么也许同时拥有-O2和-O3也没关系?
我认为你不需要CXXFLAGS在CPPFLAGS你的~/.R/Makevars
我在以下存储库中设置了 Makevars,以对 R/Rcpp 中的各种 C++ 编译器标志进行基准测试 https://github.com/jackwasey/optimization-comparison
我使用https://github.com/jimhester/covr中的函数以编程方式执行此操作(如果这对您有用)。
另外,你看到下面的内容了吗?R:使用内联包时的 C++ 优化标志