我正在使用parallel和doParallel软件包运行Ubuntu 12.04和R 2.15.1。 当我平行运行任何东西的时候,我被限制在一个核心的100%,当我拥有高达800%,因为我正在运行8核。 在系统监视器上显示的是每个subprocess只有12%。
这是怎么回事呢,限制了我的执行速度?
问题可能是R进程被限制在一个核心(并且子进程继承这个)。
尝试这个:
> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid())) pid 3064's current affinity mask: fff pid 3064's new affinity mask: fff
现在,如果在您的机器上,当前亲和力掩码报告1,那么这是问题。 上面的行应该解决它(即第二行应报告fff(或类似)。
Simon Urbanek写了一个函数mcaffinity
,允许这个控制多核。 据我所知,还是在R-devel。
有关详细信息,请参阅关于R-sig-hpc的讨论 。
更新,除了郭鑫的回答:
如果通过openblas和显式并行(通过parallel / snow / multicore)一起使用隐式并行化,您可能需要更改openblas使用的线程数,具体取决于您是否在显式并行部分内。
这是可能的(在Linux下的openblas,我不知道任何其他通常优化的BLAS,它提供了一个线程数的函数),请参阅Simon Fuller的博客文章 。
我遇到了同样的问题,因为libblas.so(.3gf)
包,我不知道这是否也会导致您的问题。 当R
开始时,它会调用安装在系统中的BLAS
系统来执行线性代数计算。 我有libopenblas.so(.3gf)
,它是高度优化的选项“CPU亲和力”,也就是说,当你做数字矢量或矩阵计算,openblas包将只是做8个线程,使每一个线程粘在一个指定的和固定的CPU上以加速代码。 但是,通过设置这个,系统会被告知所有的CPU都非常繁忙,如果进一步的并行任务到来,系统会尝试把它们挤到一个CPU中,以尽量不干扰繁忙的CPU。
所以这是我的解决方案:我下载了一个openblas软件包的源代码,并将其编译为“ Makefile.rule
”文件:有一行“ #NO_AFFINITY = 1
”,我刚刚删除了“ #
”没有选择亲和力选项。 然后我安装了这个软件包,问题就解决了。
有关这方面的参考,请参阅https://github.com/ipython/ipython/issues/840
请注意,这是一个权衡。 去除CPU亲和力会让你在进行数值计算的时候失去一些效率,这就是为什么openblas的维护者(Dr. Xianyi Zhang)知道这个问题的原因,他仍然把cpu affinity的代码作为默认选项发布。
我的猜测是你可能有错误的代码。 我想发布一个从在线http://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/复制的例子:
library(doMC) registerDoMC() x<- iris[which(iris[,5]!='setosa'),c(1,5)] trials<- 10000 r<- foreach(icount(trials), .combine=cbind) %dopar% { ind<- sample(100,100,replace=T) result1<- glm(x[ind,2]~x[ind,1],family=binomial(logit)) coefficients(result1) }
你可以定义你想在并行中使用多少个核心:
options(cores=4)