在R中为openMP设置“configure”

时间:2011-02-15 18:49:24

标签: r packages openmp configure

我有一个R包,可以通过使用OpenMP轻松加速。如果您的编译器支持它,那么您将获得胜利,如果没有,那么将忽略编译指示并获得一个核心。

我的问题是如何让包构建系统使用正确的编译器选项和库。目前我有:

PKG_CPPFLAGS=-fopenmp
PKG_LIBS=-fopenmp

在我的机器上硬编码到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&gt; configure”不会在软件包安装上运行 - 它纯粹是一个开发人员进程来创建 分发的配置脚本 - amirite?< / p>

2 个答案:

答案 0 :(得分:1)

您认为库选项有误,请尝试

## -- compiling for OpenMP 
PKG_CXXFLAGS=-fopenmp
##
## -- linking for OpenMP
PKG_LIBS= -fopenmp -lgomp 

换句话说,-lgomp可以为您提供链接的OpenMP库。我猜你知道这个库不是是流行的Windows Rtools工具包的一部分。在现代Linux上你应该没问题。

在一个未发布的测试包中,我在这里我还将以下内容添加到PKG_LIBS,但这主要是由于我使用了Rcpp:

$(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") \
                              $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

最后,我认为除非您认为需要通过configure测试OpenMP,否则不需要autoconf业务。

编辑: SpacedMan是正确的。根据libgomp-4.4手册的开头:

  

1启用OpenMP

     

激活OpenMP扩展   C / C ++和Fortran,编译时   必须指定标志`-fopenmp'。   这将启用OpenMP指令   [...]国旗也   安排自动链接   OpenMP运行时库。

所以我站得更正了。似乎手动添加会添加的东西并没有什么坏处,只是为了清晰...

答案 1 :(得分:1)

刚刚解决有关autoconf使用的问题 - 不,你不想用任何参数运行autoconf,也不应该重定向它的输出。你是正确的,运行autoconf来构建配置脚本是包维护者所做的事情,并且生成的配置脚本是分布式的。通常,要从configure.ac生成配置脚本(较旧的包使用名称configure.in,但该名称已被禁止使用多年),开发人员只需运行不带参数的autoconf。在运行autoconf之前,必须运行aclocal,autoheader,libtoolize等...还有一个工具(autoreconf),它简化了进程并以正确的顺序调用所有必需的程序。现在更常见的是运行autoreconf而不是autoconf。