我有一个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用于编译器选项。但现在我不确定工作流程。是吗:
但是要明确一点,“autoconf configure.in&gt; configure”不会在软件包安装上运行 - 它纯粹是一个开发人员进程来创建 分发的配置脚本 - amirite?< / p>
答案 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。