R限制中的并行处理

时间:2012-10-16 22:56:13

标签: r ubuntu parallel-processing

我使用parallel和doParallel包运行ubuntu 12.04和R 2.15.1。当我并行运行任何东西时,我限制在100%的核心,当我应该有高达800%,因为我运行8核心。系统监视器上显示的是每个子进程只有12%。

这是怎么回事限制我的执行速度?

3 个答案:

答案 0 :(得分:10)

问题可能是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。

有关详细信息,请参阅例如这discussion on R-sig-hpc

更新,除了新国的回答:

如果您通过openblas和显式并行化(通过parallel / snow / multicore)一起使用隐式并行化,则可能需要更改openblas使用的线程数,具体取决于您是否位于显式并行部分内。 /> 这是可能的(在Linux下使用openblas,我不知道任何其他通常优化的BLAS'提供线程数的函数),详见Simon Fuller's blog post

答案 1 :(得分:5)

由于libblas.so(.3gf)包,我遇到了同样的问题,我不知道这是否也会导致您的问题。当R启动时,它会调用系统中安装的BLAS系统来进行线性代数计算。我有libopenblas.so(.3gf)并且它使用“CPU Affinity”选项进行了高度优化,也就是说,当你进行数值向量或矩阵计算时,openblas包只会生成8个线程并使每个线程卡住到一个指定的和固定的CPU来加速代码。但是,通过设置此项,系统会告知您的所有CPU都非常繁忙,因此如果进一步执行并行任务,系统会尝试将它们压缩到一个CPU中,以便尽量不干扰繁忙的CPU。 / p>

所以这是我的解决方案有效:我下载了一个openblas软件包源并将其编译为“Makefile.rule”文件已更改:有一行“#NO_AFFINITY = 1”我刚刚删除了“{{ 1}}“以便编译后,没有选择关联选项。然后我安装了包,问题解决了。

有关此内容的参考,请参阅https://github.com/ipython/ipython/issues/840

请注意,这是一个权衡。删除CPU亲和力会让你在进行数值计算时失去一些效率,这就是为什么虽然openblas维护者(张先生博士)知道这个问题,但他仍然以cpu亲和力作为默认选项发布代码。

答案 2 :(得分:0)

我的猜测是你可能有错误的代码。我想发布一个从在线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)