首页 > 解决方案 > 在 R foreach() 下并行运行时无法识别动态库依赖项

问题描述

我正在使用Rfast包,它导入包RcppZiggurat。我在 Linux 集群(Red Hat 6.1)上运行 R 3.6.3。软件包安装在我的本地目录中,但 R 安装在系统范围内。

colsums()当我直接调用Rfast 函数(例如)时,它们运行良好。但是当我在如下循环中调用它们时foreach()(编辑:我添加了代码来注册集群,如 Rui Barradas 所指出的,但它没有解决问题)。

library(Rfast)
library(doParallel)
library(foreach)

cores <- detectCores()
cl <- makeCluster(cores)
registerDoParallel(cl)

A <- matrix(rnorm(1e6), 1000, 1000)
cm <- foreach(n = 1:4, .packages = 'Rfast') %dopar% colmeans(A)

stopCluster(cl)

然后我得到一个错误:

unable to load shared object '/home/users/sutd/R/x86_64-pc-linux-gnu-library/3.6/RcppZiggurat/libs/RcppZiggurat.so':
  libgsl.so.0: cannot open shared object file: No such file or directory

不知何故,动态库在直接调用时被识别,但在foreach().

我知道它libgsl.so位于 中/usr/lib64/,所以我在 R 脚本的开头添加了以下行

Sys.setenv(LD_LIBRARY_PATH=paste("/usr/lib64/", Sys.getenv("LD_LIBRARY_PATH"), sep = ":"))

但它没有用。

我也尝试过,dyn.load('/usr/lib64/libgsl.so')但出现以下错误:

Error in dyn.load("/usr/lib64/libgsl.so") : unable to load shared object '/usr/lib64/libgsl.so': 
/usr/lib64/libgsl.so: undefined symbol: cblas_ctrmv

如何使依赖项在foreach()并行循环中可用?

笔记

在实际用例中,我使用的是遗传算法包GA,并使用GA::ga()它来处理foreach()循环,并且在循环中我使用我自己的包中的一个函数来调用这些Rfast函数。所以我希望有一个解决方案,我不必修改foreach()call

标签: rlinuxenvironment-variablesparallel-foreach

解决方案


以下工作没有问题。与问题中的代码不同,它首先检测可用内核的数量,创建一个集群并使其可用于foreach.

library(Rfast)
library(doParallel)
library(foreach)

cores <- detectCores()
cl <- makeCluster(cores)
registerDoParallel(cl)

set.seed(2020)
A <- matrix(rnorm(1e6), 1000, 1000)
cm <- foreach(n = 1:4, 
              .combine = rbind, 
              .packages = "Rfast") %dopar% {
  colmeans(A)
}

stopCluster(cl)

str(cm)
#num [1:4, 1:1000] -0.02668 -0.02668 -0.02668 -0.02668 0.00172 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:4] "result.1" "result.2" "result.3" "result.4"
#  ..$ : NULL

推荐阅读