如何让 R 使用所有处理器?

Posted

技术标签:

【中文标题】如何让 R 使用所有处理器?【英文标题】:How to make R use all processors? 【发布时间】:2010-11-26 14:08:04 【问题描述】:

我有一台运行 Windows XP 的四核笔记本电脑,但查看任务管理器 R 似乎一次只使用一个处理器。如何让 R 使用所有四个处理器并加速我的 R 程序?

【问题讨论】:

根据下面的 cmets 和对你名​​字的链接搜索...我很确定这是无耻的广告 (linkedin.com/in/dmsmith)。你用你参与开发的付费产品回答了你自己的问题......来吧...... 【参考方案1】:

我听说REvolution R 支持更好的多线程,然后 R 和 REvolution 的典型 CRAN 版本也支持 Windows 中的 64 位 R。我一直在考虑买一本,但我发现他们的定价不透明。他们的网站上没有价格表。很奇怪。

【讨论】:

如果非要问价格,你买不起。 这里列出了学术定价:revolution-computing.com/industry/academic.php 现在被微软收购了,没有免费的学术版了。但您可以免费安装revolutionanalytics.com/revolution-r-open,它还附带英特尔 MKL 库。在 Windows 上,如果您从该安装中获取 libiomp5md.dll、Rblas.dll 和 Rlapack.dll 文件并覆盖您喜欢使用的任何 R 安装中的文件,您将拥有多线程矩阵运算(通常为 10-20 倍加速)。或者来自 prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 的 Atlas Rblas.dll 也可以工作并且几乎一样快。【参考方案2】:

CRAN Task View on High-Performance Compting with R 列出了几个选项。 XP 是一个限制,但您仍然可以在几分钟内获得类似snow 的内容来使用套接字。

【讨论】:

【参考方案3】:

在 Windows 上,我相信最好的方法可能是使用 foreach 和 snow,正如 David Smith 所说。

但是,基于 Unix/Linux 的系统可以通过“多核”包使用多个进程进行计算。它提供了一个高级函数“mclapply”,可以跨多个内核执行列表理解。 “多核”包的一个优点是每个处理器都可以获得一个全局环境的私有副本,它可以修改它。最初,这个副本只是一个指向全局环境的指针,如果全局环境被视为只读,那么共享变量会非常快。

Rmpi 要求数据在 R 进程之间显式传输,而不是使用“多核”闭包方法。

-- 丹

【讨论】:

【参考方案4】:

我相信multicore 软件包适用于 XP。它提供了一些基本的多进程功能,特别是通过提供 lapply() 的直接替换和在新线程 (mcparallel()) 中评估表达式的简单方法。

【讨论】:

替换lapply() 的替换被称为mclapply()。真的就这么简单:N 个处理器快 N 倍(只要所有繁重的工作都在应用的函数内部) 多核包需要兼容 POSIX 的操作系统,因此它不能在 Win 中运行。您可以在此处阅读要求:cran.r-project.org/web/packages/multicore/index.html doSMP 提供与 Windows 上的 multicore 类似的功能,并且是 available on CRAN【参考方案5】:

从 2.15 版开始,R 现在自带对多核计算的原生支持。只需加载并行包

library("parallel")

并查看相关的插图

vignette("parallel")

【讨论】:

通过包引导引导我也很感兴趣,并在该文件中进行了说明。 @MistereeDevlord 啊,谢谢。不知道我是怎么错过的。【参考方案6】:

我有一个我使用的基本系统,我在“for”循环上并行化我的程序。一旦您了解需要做什么,此方法就很简单。它仅适用于本地计算,但这似乎是您所追求的。

您需要安装这些库:

library("parallel")
library("foreach")
library("doParallel")

首先,您需要创建计算集群。我通常在运行并行程序时做其他事情,所以我喜欢让一个打开。 “detectCores”函数将返回您计算机中的核心数。

cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)

接下来,使用“foreach”命令以及 %dopar% 运算符调用您的 for 循环。我总是使用“尝试”包装器来确保丢弃操作失败的任何迭代,并且不会破坏原本好的数据。您需要指定“.combine”参数,并将任何必要的包传递到循环中。请注意,“i”是用等号定义的,而不是“in”运算符!

data = foreach(i = 1:length(filenames), .packages = c("ncdf","chron","stats"),
               .combine = rbind) %dopar% 
  try(
       # your operations; line 1...
       # your operations; line 2...
       # your output
     )

完成后,清理:

stopCluster(cl)

【讨论】:

【参考方案7】:

如果您进行大量矩阵运算并且您使用的是 Windows,您可以免费安装 revolutionanalytics.com/revolution-r-open,该软件附带英特尔 MKL 库,可让您进行多线程矩阵运算。在 Windows 上,如果您从该安装中获取 libiomp5md.dll、Rblas.dll 和 Rlapack.dll 文件并覆盖您喜欢使用的任何 R 版本中的文件,您将拥有多线程矩阵运算(通常您会获得 10-20 倍的加速用于矩阵运算)。或者您可以使用来自prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/binary/windows/x64 的 Atlas Rblas.dll,它也可以在 64 位 R 上工作,并且几乎与 MKL 一样快。我发现这是大幅提高 R 在 Windows 系统上的性能的最简单的方法。不知道为什么它们实际上在 R Windows 安装中没有成为标准。

在 Windows 上,不幸的是,多线程在 R(除非您使用 OpenMP via Rcpp)和可用的 SOCKET-based parallelization on Windows systems, e.g. via package parallel, is very inefficient. On POSIX systems things are better as you can use forking there.(包 multicore 我相信是最有效的)中没有得到很好的支持。您也可以尝试在共享内存模型中使用包Rdsm 进行多线程处理 - 我的 github 上有一个版本,它具有未标记的 -unix only 标志,并且应该也可以在 Windows 上工作(早期的 Windows 不支持作为依赖项@ 987654327@ 据说不能在 Windows 上工作,但现在看来可以了):

library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)

【讨论】:

以上是关于如何让 R 使用所有处理器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中处理文本文件的所有元素

如何对使用大猩猩mmux的所有路由应用相同的处理程序

如何只显示 TWinControl 并让其父级处理所有鼠标事件?

如何让批处理按创建时间删除某文件夹下的文件

omp parallel for:如何让线程写入私有数组并在所有线程完成处理后合并所有数组

了解如何在 R 中处理 .Internal C 函数