0

我最近将我的 R BLAS 框架更改为 Mac 附带的 vecLib。这样做之后,我在 R 中的并行包遇到了问题。这是一个例子:

library(parallel)
xx1<-matrix(runif(2*70),ncol=2)
mcl.test<-mclapply(1:2,function(i) sum(tcrossprod(xx1[,i])),mc.cores = 2)
mcl.test

[[1]]
NULL

[[2]]
NULL

这个(mclapply 随机返回 NULL)讨论说 mclapply 可能由于内存问题而返回 NULL。虽然 70x70 矩阵不应导致内存问题(否则我的工作区是空的,已被垃圾收集),但请注意,对于 60x60 矩阵,问题就会消失:

xx2<-matrix(runif(2*60),ncol=2)
mcl.test<-mclapply(1:2,function(i) sum(tcrossprod(xx2[,i])),mc.cores = 2)
mcl.test

[[1]]
[1] 754.1371

[[2]]
[1] 889.7769

我什么时候都没有问题mc.cores=1。如果我将 BLAS 切换回默认值,我也没有问题。此外,当我从终端使用 R 时没有问题。 使多线程 R(通过 vecLib)在终端外与 mclapply 一起工作的正确方法是什么?

sessionInfo()

R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Sierra 10.12.6

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.4.3 tools_3.4.3  
4

1 回答 1

0

我发现完成这项工作的唯一方法是通过设置环境变量来强制 vecLib 仅使用一个线程(请参阅内容)export VECLIB_MAXIMUM_THREADS=1。这并不完全令人满意,因为 BLAS 使用的线程和使用的内核的总和mclapply仍然可能小于可用内核的总数。

因此,我改用 openBLAS 而不是 vecLib。openBLAS 似乎没有这个问题(尽管过去可能有)。使用 openBLAS,我似乎可以在多个内核上运行一些东西mclapply,而每个子进程都尽可能多地使用多线程。

于 2018-04-02T20:33:46.967 回答