gpt4 book ai didi

r - 需要Rcpp软件包中使用的OpenMP可用性

转载 作者:行者123 更新时间:2023-12-04 17:12:43 25 4
gpt4 key购买 nike

我已经通过使用RcppArmadilloOpenMP库以及以下命令在R中准备了一个程序包:

RcppArmadillo.package.skeleton("mypackage")
compileAttributes(verbose=TRUE)

另外,在 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

我在计算机上生成并安装了该软件包,现在就使用它。但是我的大学和 friend 无法安装该软件包。错误消息是有关 RcppArmadilloOpenMP库的。

例如:

fatal error: 'omp.h' file not found



有人在这种情况下有过经验吗?为了解决此问题,我必须在包装中进行哪种类型的设置?

最佳答案

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

防御性编码

错误明显的原因是您没有适当保护OpenMP代码...例如

header 包含项受以下保护:

#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的打包要求

但是,以上只是好的防御性编码。如果您的软件包需要特定功能,那么也许该考虑使用名为 autoconfconfigure.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脚本,请运行:
autoconf

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

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

现在,您可能要确保您的同事能够从启用了 OpenMP的代码中获得加速 yield 。为此,您必须使同事从使用默认系统编译器转移到使用“true” OpenMP或启用了 gcc的可行 omp编译器,以启用 clang

此处提供了有关macOS的说明:

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

关于r - 需要Rcpp软件包中使用的OpenMP可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42280628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com