我试图在Unix上的R 3.0上使用GotoBLAS2。我从TACC网站下载了GotoBLAS2源代码,编译了它,并按照链接http://www.rochester.edu/college/gradstudents/jolmsted/files/computing/BLAS.pdf的说明用libgoto2.so替换了libRblas.so。 R中的简单矩阵运算就像“行列式”一样快了20倍(我使用的是巨大的矩阵),这很好。但是,我现在不能并行使用多个内核。
例如,下面的代码永远运行。但如果我用“for”而不是“foreach”来评论,那只需要一秒钟。当我使用R的默认BLAS库时,我可以运行下面的代码(使用许多内核)(但是由于BLAS没有经过优化,所以需要更多的时间)..
library("foreach")
library("doParallel")
registerDoParallel(cores=2)
set.seed(100)
foreach (i = 1:2) %dopar% {
# for (i in 1:2) {
a = replicate(1000, rnorm(1000))
d = determinant(a)
那么,是否可以与GotoBLAS2同时使用多个核心,您有什么想法吗?
提前多多感谢。
答案 0 :(得分:1)
最有可能的是,GotoBLAS已经在使用多个核心,因此使用%dopar%
没有任何好处。我还希望从%dopar%
开始减速,因为您运行的线程数多于您拥有的CPU核心数。
仍然不希望代码“永远运行”,只比for
慢。
答案 1 :(得分:1)
如果并行任务将执行多线程操作,则应确保doParallel worker的数量乘以BLAS库使用的线程数不大于核心数。但是你可能会遇到由GotoBLAS2引起的另一个问题。
GotoBLAS2和OpenBLAS的默认构建设置R进程的CPU亲和性,使子进程全部在CPU的同一核心上运行。这会导致诸如parallel / doParallel之类的包出现严重问题,因为所有工作人员都被迫使用单个核心。
您可以使用新的“mcaffinity”函数解决此问题,该函数已添加到R 3.0.0中的并行程序包中,专门用于解决此问题。您也可以使用它来验证这是您的问题。以下是R会话的输出,最初限制为在单个核心上运行:
> library(parallel)
> mcaffinity()
[1] 1
> mcaffinity(1:128)
[1] 1 2 3 4 5 6
执行此操作后,可以使用所有六个核心。对于您的示例,只需在执行foreach循环之前添加mcaffinity(1:128)
。
但是既然您从源代码构建了GotoBLAS2,您也可以通过在Makefile中将NO_AFFINITY设置为“1”并重建来禁用此功能:
# If you want to disable CPU/Memory affinity on Linux.
NO_AFFINITY = 1