Spa*_*man 7 packages r configure openmp
我有一个R包,使用OpenMP很容易加速.如果您的编译器支持它,那么您将获得胜利,如果没有,那么将忽略编译指示并获得一个核心.
我的问题是如何让包构建系统使用正确的编译器选项和库.目前我有:
PKG_CPPFLAGS=-fopenmp
PKG_LIBS=-fopenmp
Run Code Online (Sandbox Code Playgroud)
在我的机器上硬编码到src/Makevars中,并使用OpenMP支持构建它.但是它会在检查时产生关于非标准编译器标志的警告,并且在没有openMP功能的机器上可能会很难.
解决方案似乎是使用configure和autoconf.这里有一些信息:
http://cran.r-project.org/doc/manuals/R-exts.html#Using-Makevars
包括一个在odbc功能中编译的复杂示例.但我看不出如何开始调整以检查openmp和libgomp.
我所看到的关于使用openMP的R软件包似乎都没有设置.
那么有没有人有一个使用OpenMP设置R包的演练?
[编辑]
我现在可能已经破解了.我有一个configure.ac脚本和一个带有@ FOO @ substitutions的Makevars.in用于编译器选项.但现在我不确定工作流程.是吗:
但是,仅仅是明确的,"autoconf的configure.in>配置"不上运行包安装-其纯粹的开发过程中创建的配置脚本的分布- amirite?
我认为你的库选项错误,请尝试
## -- compiling for OpenMP
PKG_CXXFLAGS=-fopenmp
##
## -- linking for OpenMP
PKG_LIBS= -fopenmp -lgomp
Run Code Online (Sandbox Code Playgroud)
换句话说,-lgomp让您链接 OpenMP 库。我想您知道这个库不是流行的 Windows Rtools 套件的一部分。在现代 Linux 上你应该没问题。
在我这里的未发布测试包中,我还将以下内容添加到PKG_LIBS,但这主要是由于我使用了 Rcpp:
$(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") \
$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
Run Code Online (Sandbox Code Playgroud)
最后,我认为 autoconf 业务并不是真正需要的,除非您觉得需要通过配置测试 OpenMP。
编辑: SpacedMan 是正确的。根据 libgomp-4.4 手册的开头:
1 启用 OpenMP
要激活 C/C++ 和 Fortran 的 OpenMP 扩展,必须指定编译时标志“-fopenmp”。这启用了 OpenMP 指令 [...] 该标志还安排了 OpenMP 运行时库的自动链接。
所以我纠正了。似乎手动添加无论如何都会添加的内容并没有什么坏处,只是为了清楚起见......