【问题标题】:mclapply conflict with vecLibmclapply 与 vecLib 冲突
【发布时间】:2018-03-22 23:21:17
【问题描述】:

我最近将我的 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 returns NULL randomly) 讨论说 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  

【问题讨论】:

    标签: r multithreading mclapply rparallel


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 2017-12-09
      • 2013-10-21
      • 2020-08-19
      • 2010-12-10
      • 2018-04-02
      • 2021-10-23
      • 2020-12-03
      相关资源
      最近更新 更多