在R中的并行处理有限

我正在使用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)