要求在Rcpp包中使用OpenMP可用性

时间:2017-02-16 17:17:56

标签: r openmp rcpp armadillo r-package

我已使用OpenMPRcppArmadillo.package.skeleton("mypackage") compileAttributes(verbose=TRUE) 库以及以下命令在R中准备了一个包:

DESCRIPTION

另外,在我添加的Imports: Rcpp (>= 0.12.8), RcppArmadillo LinkingTo:Rcpp, RcppArmadillo Depends: RcppArmadillo 文件中:

NAMESPACE

并在我添加的import(RcppArmadillo) importFrom(Rcpp, evalCpp) 文件中:

cmd

然后我在R CMD build mypackage R CMD INSTALL mypackage.tar.gz 中运行以下代码:

RcppArmadillo

我在我的电脑中构建并安装软件包,现在就使用它。但我的学院和朋友无法安装该软件包。错误消息大约是OpenMP和{{1}}个库。

例如:

  

致命错误:' omp.h'找不到文件

有没有人在这种情况下有过经验?我必须在我的包中进行哪种设置才能解决这个问题?

1 个答案:

答案 0 :(得分:8)

恭喜!您很可能偶然发现了macOS'缺乏OpenMP支持。 This has been documented in the Rcpp FAQ as entry 2.10.3

防御性编码

错误显而易见的原因是您没有正确保护OpenMP代码......例如。

标题包含受以下内容保护:

#ifdef _OPENMP
  #include <omp.h>
#endif

代码有以下保护:

#ifdef _OPENMP
   // multithreaded OpenMP version of code
#else
   // single-threaded version of code
#endif

这假设您使用预处理器#omp标签,但更多深入的omp函数调用。如果是先验,则代码保护并不重要,因为预处理器标签将被丢弃。

(For those long time users of the above macro schemes coming here, please note that as of R 3.4.0, the SUPPORT_OPENMP definition was removed completely in favor of _OPENMP.)

通过OpenMP

configure.ac创建包裹要求

但是,上面只是很好的防御性编码。如果您的软件包需要特定功能,那么可能需要考虑使用名为autoconf的{​​{1}}文件来生成configure.ac脚本。

configure放在包裹的顶层。

configure.ac

packagename/ |- data/ |- inst/ |- man/ |- src/ |- Makevars |- HelloWorld.cpp |- DESCRIPTION |- NAMESPACE |- configure.ac |- configure 应包含以下内容:

configure.ac

要生成AC_PREREQ(2.61) AC_INIT(your_package_name_here, m4_esyscmd_s([awk -e '/^Version:/ {print $2}' DESCRIPTION])) AC_COPYRIGHT(Copyright (C) 2017 your name?) ## Determine Install Location of R : ${R_HOME=$(R RHOME)} if test -z "${R_HOME}"; then AC_MSG_ERROR([Could not determine R_HOME.]) fi ## Setup RBin RBIN="${R_HOME}/bin/R" CXX=`"${RBIN}" CMD config CXX` CPPFLAGS=`"${RBIN}" CMD config CPPFLAGS` CXXFLAGS=`"${RBIN}" CMD config CXXFLAGS` ## Package Requires C++ AC_LANG(C++) AC_REQUIRE_CPP ## Compiler flag check AC_PROG_CXX ## Borrowed from BHC/imager/icd/randomForest # Check for OpenMP AC_OPENMP # since some systems have broken OMP libraries # we also check that the actual package will work ac_pkg_openmp=no if test -n "${OPENMP_CFLAGS}"; then AC_MSG_CHECKING([OpenMP detected, checking if viable for package use]) AC_LANG_CONFTEST([AC_LANG_PROGRAM([[#include <omp.h>]], [[ return omp_get_num_threads (); ]])]) "$RBIN" CMD SHLIB conftest.c 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD && "$RBIN" --vanilla -q -e "dyn.load(paste('conftest',.Platform\$dynlib.ext,sep=''))" 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD && ac_pkg_openmp=yes AC_MSG_RESULT([${ac_pkg_openmp}]) fi # if ${ac_pkg_openmp} = "yes" then we have OMP, otherwise it will be "no" if test "${ac_pkg_openmp}" = no; then AC_MSG_WARN([No OpenMP support. If using GCC, upgrade to >= 4.2. If using clang, upgrade to >= 3.8.0]) AC_MSG_ERROR([Please use a different compiler.]) fi # Fin AC_OUTPUT 脚本,请运行:

configure

完成此操作后,您将需要重建包。请注意,如果在Windows上,则可能需要安装autoconf ,而在macOS上,您可能需要通过homebrew进行安装。

帮助用户获得可行的autoconf编译器

现在,您可能希望确保您的同事能够从启用了OpenMP的代码中获得加速增益。要做到这一点,必须通过让同事从使用默认系统编译器转移到&#34; true&#34;来启用OpenMPOpenMP或可行的gcc启用omp编译器。

这里给出了关于macOS的说明:

http://thecoatlessprofessor.com/programming/openmp-in-r-on-os-x/