gpt4 book ai didi

c++ - Rcpp Armadillo : Using autoconf to disable OpenMP

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:56 24 4
gpt4 key购买 nike

在德克对 this question 的评论中, 我被指向了 configure.ac RcppArmadillo 使用的脚本,以便在构建时以编程方式检查 OS X 上是否支持 OpenMP。然后我认为这对我来说听起来太复杂和不必要了,但我尝试了一些方法来避免 OpenMP 问题,但它似乎仍然存在当我在 Travis 上测试它时。

所以我现在所做的是:

1。配置.ac

我已经(有点公然,但我当然会尊重 GPL-2 许可证)复制了 configure.ac RcppArmadillo 使用的脚本,删除了一些部分(例如 LAPACK 检查)并调整了我的包的名称等

2。生成变量

已重命名 src/Makevarssrc/Makevars.in现在是

PKG_CXXFLAGS = -I../inst/include @OPENMP_FLAG@
PKG_LIBS= @OPENMP_FLAG@ $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

src/Makevars.win

PKG_CXXFLAGS = -I../inst/include -I. $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

3。清理

添加了一个 cleanup文件包含

#!/bin/sh
rm -f config.* src/Makevars src/config.h inst/include/pkgConfigGenerated.h

4。 pkgConfigGenerated.h

添加了一个文件 inst/include/pkgConfigGenerated.h.in就像这样:

#ifndef pkg__pkgConfigGenerated__h
#define pkg__pkgConfigGenerated__h
@HAVE_OPENMP@
#endif

5。 pkgConfig.h

基于RcppArmadilloConfig.h文件,我创建了inst/include/pkgConfig.h作为

#if defined(WIN32) || defined(_WIN32)
#define ARMA_USE_OPENMP
#else
#include <pkgConfigGenerated.h>
#endif

我的问题:

  • 现在我猜我需要添加 #include <pkgConfig.h>我的 cpp 文件在 src因为这就是我相信 RcppArmadillo 使用它的方式。它是否正确?当我在 Linux 上测试它时,它提示找不到它:fatal error: pkgConfig.h: No such file or directory .我需要做一些额外的链接吗?
  • 我还需要做其他事情吗?

可行的解决方案

根据德克的回答,我做了以下事情。我借了configure.ac来自 RcppArmadillo 的文件并包含了我需要的部分并做了一些小改动(我将所有内容都包含在此处以供将来引用):

## Copyright Dirk Eddelbuettel for RcppArmadillo (GPL-2)
AC_PREREQ(2.61)
AC_INIT([pkg], 0.1.0)

: ${R_HOME=$(R RHOME)}
if test -z "${R_HOME}"; then
AC_MSG_ERROR([Could not determine R_HOME.])
fi

CXX=$(${R_HOME}/bin/R CMD config CXX)
CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS)

AC_LANG(C++)
AC_REQUIRE_CPP

openmp_flag=""
openmp_cflag=""

AC_MSG_CHECKING([for macOS])
RSysinfoName=$("${R_HOME}/bin/Rscript" --vanilla -e 'cat(Sys.info()[["sysname"]])')
if test x"${RSysinfoName}" == x"Darwin"; then
AC_MSG_RESULT([found])
AC_MSG_WARN([OpenMP unavailable and turned off.])
openmp_flag="-DARMA_DONT_USE_OPENMP"
else
AC_MSG_RESULT([not found as on ${RSysinfoName}])
AC_MSG_CHECKING([for OpenMP])
allldflags=$(${R_HOME}/bin/R CMD config --ldflags)
hasOpenMP=$(echo ${allldflags} | grep -- -fopenmp)
if test x"${hasOpenMP}" == x""; then
AC_MSG_RESULT([missing])
openmp_flag="-DARMA_DONT_USE_OPENMP"
else
AC_MSG_RESULT([found])
openmp_flag='$(SHLIB_OPENMP_CXXFLAGS)'
openmp_cflag='$(SHLIB_OPENMP_CFLAGS)'
fi
fi

AC_SUBST([OPENMP_CFLAG], ["${openmp_cflag}"])
AC_SUBST([OPENMP_FLAG], ["${openmp_flag}"])
AC_CONFIG_FILES([src/Makevars])
AC_OUTPUT

我的主要错误是我认为 autoconf在此 configure.ac 上自动调用文件获取configure ,但事实并非如此!

对应Makevars.in

PKG_CXXFLAGS = @OPENMP_FLAG@
PKG_LIBS= @OPENMP_CFLAG@ $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

(也许这两个标志可以简化为一个,但不要修复没有损坏的东西......)

现在我在 Linux 和 OS X 上都通过了构建(OS X 和 devel 版本的 R 当 RcppArmadillo 安装失败时除外,但这似乎是一个不同的问题)。

最佳答案

一到四看起来不错;我什至认为你不需要两个文件。只需设置 ARMA_USE_OPENMP 它的补码 ARMA_DONT_USE_OPENMP

仔细想想,这也可以分别通过 -DARMA_USE_OPENMP-DARMA_DONT_USE_OPENMP 添加到编译标志中。

Five 有点麻烦,因为您似乎不知道如何设置包含标志。更多不依赖额外文件的理由,嗯? ;-)

让我们看看情况如何。我们可以决定帮助提供一个 R 级函数,您可以从脚本 configure 调用(然后可以在 bash 中,或使用 Rscript)。

编辑:刚刚意识到您可以使用的更简单的修复:简单地将 C++98 作为编译标准。正如编写 R 扩展 所说:

Conversely, to ensure that the C++98 standard is assumed even when this is not the compiler default, use

 SystemRequirements: C++98 

or

 CXX_STD = CXX98

这还将关闭 Armadillo 对 OpenMP 的偏好,OpenMP 在 C++11 下始终处于开启状态。

关于c++ - Rcpp Armadillo : Using autoconf to disable OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46723854/

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