我正在使用并行和 doParallel 包运行 ubuntu 12.04 和 R 2.15.1。当我并行运行任何东西时,我被限制为 100% 的内核,而我应该有高达 800% 的内核,因为我使用 8 个内核运行它。系统监视器上显示的是每个子进程只得到 12%。
发生了什么限制了我的执行速度?
我正在使用并行和 doParallel 包运行 ubuntu 12.04 和 R 2.15.1。当我并行运行任何东西时,我被限制为 100% 的内核,而我应该有高达 800% 的内核,因为我使用 8 个内核运行它。系统监视器上显示的是每个子进程只得到 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 使用隐式并行化和显式并行化(通过并行/雪/多核)一起使用,您可能需要根据您是否在显式并行部分内来更改 openblas 使用的线程数。
这是可能的(在 Linux 下使用 openblas,我不知道任何其他通常优化的 BLAS' 提供线程数的函数),有关详细信息,请参阅Simon Fuller 的博客文章。
由于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 亲和性作为默认选项发布代码。
我的猜测是你可能有错误的代码。我想发布一个从在线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)