在R中如何控制BLAS并行矩阵乘积的多线程?

9

我有一个关于在R中使用BLAS并行矩阵乘法的问题(至少自R-3.4以来就是默认矩阵乘法,可能更早)。

现在的默认行为(至少在我的机器上)是让矩阵乘积(参见下面的示例)使用机器上所有可用的核心,这可能会成为一个问题。

您知道如何控制在R中对标准矩阵乘积使用的核心数吗?

提前感谢。

示例:

n=10000
p=1000
q=5000
A = matrix(runif(n*p),nrow=n, ncol=p)
B = matrix(runif(p*q),nrow=p, ncol=q)
C = A %*% B # multi-threaded matrix product

会话信息:

> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.3 LTS

Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.18.so

locale:
 [1] LC_CTYPE=fr_FR.utf8       LC_NUMERIC=C             
 [3] LC_TIME=fr_FR.utf8        LC_COLLATE=fr_FR.utf8    
 [5] LC_MONETARY=fr_FR.utf8    LC_MESSAGES=fr_FR.utf8   
 [7] LC_PAPER=fr_FR.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=fr_FR.utf8 LC_IDENTIFICATION=C      

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

loaded via a namespace (and not attached):
[1] compiler_3.4.1
1个回答

14

这个RhpcBLASctl 包就是用来做这件事的。

根据它的描述:

控制'BLAS'(又称为'GotoBLAS'、'ACML'和'MKL')上线程的数量,以及可能控制'OpenMP'中线程的数量。如可行,获取逻辑核心和物理核心的数量。

我们在CRAN任务视图上提到了它。


非常感谢。这正是我所需要的。在提问之前,我确实搜索了类似的内容,但没有找到。我想我会就此事联系R核心团队。文档(matmult)在这一点上并不清楚。在矩阵乘积中使用所有可用核心的默认行为可能会成为共享计算资源的巨大问题。再次感谢。 - Odin
我正在通勤上班,没有机会发表评论。我预计Tomas在r-devel上给你的答案基本上是正确的。这在(基于Intel的)MKL、OpenBLAS等情况下已经有文档记录,可通过已知的环境变量来选择可用的BLAS选项,在R中也有文档记录,简而言之,您在这里没有任何问题。是(或您的系统管理员)选择安装OpenBLAS;R与此无关。我们(在Debian / Ubuntu中)为您提供了几种BLAS实现的选择。所有这些都已经在这里、R列表和其他地方讨论了数百万次多年。没有什么新的东西。 - Dirk Eddelbuettel
谢谢,我明白了。我的担忧主要是针对使用我其中一个包的用户,该包结合了“parallel”包的多线程和矩阵乘积。然而,我现在明白了,他们有责任了解他们的BLAS实现方式。 - Odin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接