如何在 Mac OS 中为 mgcv R 软件包启用 openMP?

问题描述 投票:0回答:1

我正在尝试在 mgcv 中运行 GAMM,并希望利用多线程计算,但运行 Sonoma 14.1.1 的 Apple M2 Pro 上未启用 openMP。我对 R 的后端了解不多,所以如果可能的话,希望简单的解释!

我已经通过 homebrew 安装了 libomp,并且我的 Makevars 文件设置如下:

FLIBS   =-L/opt/homebrew/opt/gfortran/lib
F77     = /opt/homebrew/bin/gfortran
FC      = /opt/homebrew/bin/gfortran

CFLAGS   = -I/opt/homebrew/include
CPPFLAGS = -I/opt/homebrew/include
CXXFLAGS = -I/opt/homebrew/include

LDFLAGS += -L/opt/homebrew/opt/libomp/lib -lomp
CPPFLAGS += -Xclang -fopenmp

我也尝试过 CPPFLAGS 中的 -Xpreprocessor 并得到相同的结果。

当我从源代码安装 mgcv 时,我得到

fatal error: 'omp.h' file not found
。我认为这意味着 libomp 的路径不太正确,但我不确定如何修复它。完整输出如下:

> install.packages("mgcv", type = "source")
trying URL 'https://cran.rstudio.com/src/contrib/mgcv_1.9-1.tar.gz'
Content type 'application/x-gzip' length 1083217 bytes (1.0 MB)
==================================================
downloaded 1.0 MB

* installing *source* package ‘mgcv’ ...
** package ‘mgcv’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
using C compiler: ‘Apple clang version 15.0.0 (clang-1500.1.0.2.5)’
using SDK: ‘MacOSX14.2.sdk’
clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I/opt/homebrew/include -Xclang -fopenmp    -fPIC  -I/opt/homebrew/include -c coxph.c -o coxph.o
clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I/opt/homebrew/include -Xclang -fopenmp    -fPIC  -I/opt/homebrew/include -c davies.c -o davies.o
clang -arch arm64 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG   -I/opt/homebrew/include -Xclang -fopenmp    -fPIC  -I/opt/homebrew/include -c discrete.c -o discrete.o
discrete.c:26:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^~~~~~~
1 error generated.
make: *** [discrete.o] Error 1
ERROR: compilation failed for package ‘mgcv’
* removing ‘/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/mgcv’
Warning in install.packages :
  installation of package ‘mgcv’ had non-zero exit status

The downloaded source packages are in
    ‘/private/var/folders/lm/67l59t7s7qb61nx7mc1b6lsh0000gn/T/Rtmp0qj8PW/downloaded_packages’
r macos openmp mgcv
1个回答
0
投票

我自己刚刚完成此操作,主要按照@user2554330的评论遵循https://mac.r-project.org/openmp/上的说明。

我个人想控制 OpenMP 是否被使用,所以我不想将相关标志添加到

~/.R/Makevars
,相反,我想选择什么获得 OpenMP 支持,因为这一切都非常实验性的警告。

注意:我正在使用 R Core 的 R 版本(通过

brew install --cask r
安装),因此对于大多数事情,我可以使用 R Core 提供的软件包的二进制版本。

按照 R Mac OpenMP 页面上的说明下载适合您的操作系统/clang 的 OpenMP 版本。要检查,您可以运行

clang -v

让它打印出您正在使用的 clang 版本。

然后按照以下步骤操作:

  1. 下载 mgcv tarball 的副本并将其解压到您的磁盘。或者,如果您使用 git,请从 CRAN github 克隆 readonly 存储库:https://github.com/cran/mgcv

  2. 编辑文件

    src/Makevars
    ,使其显示为:

    PKG_LIBS =  $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) $(SHLIB_OPENMP_CFLAGS)
    PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS)
    
    PKG_LIBS += -lomp
    PKG_CPPFLAGS = -Xclang -fopenmp
    

    请注意,上面的最后两行是我添加到

    Makevars
    以启用 OpenMP 支持的行,文件的其余部分只是注释。

  3. cd
    到构建目录/文件夹(即您要构建 pkg tarball 的位置`,

  4. 运行

    R CMD build --no-build-vignettes path/to/sources

  5. 在构建目录中运行

    R CMD INSTALL mgcv_1.9-1.tar.gz

  6. 开始新的 R 会话

  7. 使用 library("mgcv")

     加载 
    mgcv

  8. 运行未导出的函数

    mgcv:::mgcv.omp()

  9. 如果返回

    TRUE
    ,你就是黄金。如果没有,请返回并检查之前的步骤。

  10. 作为我尝试确认一切正常的最后一步,我运行

    mgcv::blas.thread.test(n = 10000)
    来强制 mgcv 中的某些内容运行线程编码。

  11. 享受使用 OpenMP 拟合模型的乐趣。

我使用

git clone
选项,因为我希望每次发布 mgcv 时都能够更新软件包源,而不必记住每次启用 OpenMP 时我做了什么。

© www.soinside.com 2019 - 2024. All rights reserved.