在R中为openMP设置"configure"

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用于编译器选项.但现在我不确定工作流程.是吗:

  • 如果我更改configure.in文件,请运行"autoconf configure.in> configure; chmod 755 configure".
  • 做一个包构建.
  • 在软件包安装上,系统为我运行./configure并从Makevars.in创建Makevars

但是,仅仅是明确的,"autoconf的configure.in>配置"不上运行包安装-其纯粹的开发过程中创建的配置脚本分布- amirite?

Dir*_*tel 3

我认为你的库选项错误,请尝试

## -- 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 运行时库的自动链接。

所以我纠正了。似乎手动添加无论如何都会添加的内容并没有什么坏处,只是为了清楚起见......