Windows/Mac中的R包的C++编译标志
我开发了一个R包,它通过Rcpp和RcppEigen调用C++代码。我Makevars.win
看起来像这样(枚举是指我的问题)Windows/Mac中的R包的C++编译标志
CXX_STD = CXX11
PKG_CPPFLAGS = -fopenmp -O3 -Wall -ftree-矢量化-march =本地-mavx - MFMA
PKG_CXXFLAGS + = $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = -fopenmp
- 个
PKG_LIBS + = $(LAPACK_LIBS)$(BLAS_LIBS)$(FLIBS)$(SHLIB_OPENMP_CXXFLAGS)
PKG_CPPFLAGS + = -I ../安装/包含/
如我想使用OpenMP并将R软件包与英特尔MKL库链接。我也在我的源文件中添加插件// [[Rcpp::plugins(cpp11)]]
和// [[Rcpp::plugins(openmp)]]
。
当我编译包的一切工作正常,但我仍然得到默认编译标志-O2
和-std=c++0x
。所以我的问题是:
A.不是1应该强制-std=c++11
(顺便说一下,使用相同的Makevars产生了正确的C++版本,所以必须有特定于Windows的东西)?
B.做3次重复fopenmp 2?
C.如何检查5.是否已被考虑?我这样问,因为构建在Mac上的相同软件包比在Windows上快得多,而它们的配置相同。我使用Microsoft R Open和Mac在Windows上完成了相同代码的基准测试,在这种情况下Windows的速度更快。
非常感谢您的宝贵帮助。
从哪里开始?
首先,编译和链接选项基于R的Makeconf
的联合和你包的src/Makevars
。你可以增加价值,你不能取代。
二,和相关的,你得到哪个BLAS是系统设置的问题。你通常不能从你的软件包中管理它。
三,插件sourceCpp()
和cppFunction()
。在包装中你可以直接声明,例如CXX_STD=CXX11
。
第四,使用Rcpp的CRAN上有将近1000个软件包。有时候只是看看其中的一些功能。许多人使用OpenMP。
第五,由于Apple的原因,OpenMP在OS X上面临着严峻的挑战。我忘记了Windows的情况。它在Linux上正常工作。
只适用于Windows ...只有macOS需要特殊处理。 – coatless
感谢您的澄清,欣赏它。 –
@DirkEddelbuettel听起来像我不清楚......我说这些标志是在我的src/Makevars中,我用来构建R软件包,而CXX_STD = CXX11在Windows上没有考虑到,但它在Mac上。我不清楚为什么。然后,很明显,我使用OpenMP查看了包(这导致了我的5.)。最后,我还认为我很清楚,在Windows上使用openmp可以很好地构建包。我的问题与我的标志是否正确和不冗余有关,以及为什么std = C++ 11和-O3在Windows中未被考虑(它们在Mac上)。 – itQ