8

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

发生了什么限制了我的执行速度?

4

3 回答 3

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 中。

有关详细信息,请参见例如关于 R-sig-hpc 的讨论

更新,除了新郭的回答:

如果您通过 openblas 使用隐式并行化和显式并行化(通过并行/雪/多核)一起使用,您可能需要根据您是否在显式并行部分内来更改 openblas 使用的线程数。
这是可能的(在 Linux 下使用 openblas,我不知道任何其他通常优化的 BLAS' 提供线程数的函数),有关详细信息,请参阅Simon Fuller 的博客文章

于 2012-10-17T00:15:37.257 回答
5

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

所以这是我的解决方案:我下载了一个 openblas 包源并使用文件“ Makefile.rule”进行了编译:有一行“ #NO_AFFINITY = 1”,我刚刚删除了“ #”,因此编译后,没有选择关联选项。然后我安装了这个包,问题就解决了。

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

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

于 2012-10-17T00:15:00.033 回答
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)
于 2012-10-17T00:15:39.170 回答