我正在尝试在 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’
我自己刚刚完成此操作,主要按照@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 版本。
然后按照以下步骤操作:
下载 mgcv tarball 的副本并将其解压到您的磁盘。或者,如果您使用 git,请从 CRAN github 克隆 readonly 存储库:https://github.com/cran/mgcv
编辑文件
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 支持的行,文件的其余部分只是注释。
cd
到构建目录/文件夹(即您要构建 pkg tarball 的位置`,
运行
R CMD build --no-build-vignettes path/to/sources
在构建目录中运行
R CMD INSTALL mgcv_1.9-1.tar.gz
开始新的 R 会话
使用 library("mgcv")
加载mgcv
运行未导出的函数
mgcv:::mgcv.omp()
如果返回
TRUE
,你就是黄金。如果没有,请返回并检查之前的步骤。
作为我尝试确认一切正常的最后一步,我运行
mgcv::blas.thread.test(n = 10000)
来强制 mgcv 中的某些内容运行线程编码。
享受使用 OpenMP 拟合模型的乐趣。
我使用
git clone
选项,因为我希望每次发布 mgcv 时都能够更新软件包源,而不必记住每次启用 OpenMP 时我做了什么。