2017-04-04 116 views
0

我开发了一个R包,它通过Rcpp和RcppEigen调用C++代码。我Makevars.win看起来像这样(枚举是指我的问题)Windows/Mac中的R包的C++编译标志

  1. CXX_STD = CXX11

  2. PKG_CPPFLAGS = -fopenmp -O3 -Wall -ftree-矢量化-march =本地-mavx - MFMA

  3. PKG_CXXFLAGS + = $(SHLIB_OPENMP_CXXFLAGS)

  4. PKG_LIBS = -fopenmp

  5. PKG_LIBS + = $(LAPACK_LIBS)$(BLAS_LIBS)$(FLIBS)$(SHLIB_OPENMP_CXXFLAGS)

  6. 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的速度更快。

非常感谢您的宝贵帮助。

回答

1

从哪里开始?

首先,编译和链接选项基于R的Makeconf联合和你包的src/Makevars。你可以增加价值,你不能取代。

二,和相关的,你得到哪个BLAS是系统设置的问题。你通常不能从你的软件包中管理它。

三,插件sourceCpp()cppFunction()。在包装中你可以直接声明,例如CXX_STD=CXX11

第四,使用Rcpp的CRAN上有将近1000个软件包。有时候只是看看其中的一些功能。许多人使用OpenMP。

第五,由于Apple的原因,OpenMP在OS X上面临着严峻的挑战。我忘记了Windows的情况。它在Linux上正常工作

+0

只适用于Windows ...只有macOS需要特殊处理。 – coatless

+0

感谢您的澄清,欣赏它。 –

+0

@DirkEddelbuettel听起来像我不清楚......我说这些标志是在我的src/Makevars中,我用来构建R软件包,而CXX_STD = CXX11在Windows上没有考虑到,但它在Mac上。我不清楚为什么。然后,很明显,我使用OpenMP查看了包(这导致了我的5.)。最后,我还认为我很清楚,在Windows上使用openmp可以很好地构建包。我的问题与我的标志是否正确和不冗余有关,以及为什么std = C++ 11和-O3在Windows中未被考虑(它们在Mac上)。 – itQ