我有一台运行Windows XP的四核笔记本电脑,但是看看任务管理器R似乎一次只能使用一个处理器。如何让R使用所有四个处理器并加速我的R程序?
答案 0 :(得分:42)
我有一个基本系统,我在“for”循环中并行化我的程序。一旦了解了需要完成的工作,这种方法很简单。它只适用于本地计算,但这似乎是你所追求的。
您需要安装这些库:
library("parallel")
library("foreach")
library("doParallel")
首先,您需要创建计算群集。我经常在运行并行程序时做其他事情,所以我想保持一个开放状态。 “detectCores”函数将返回计算机中的核心数。
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl, cores = detectCores() - 1)
接下来,使用“foreach”命令以及%dopar%运算符调用for循环。我总是使用“try”包装器来确保丢弃操作失败的任何迭代,并且不会破坏其他好的数据。您需要指定“.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)
答案 1 :(得分:29)
CRAN Task View on High-Performance Compting with R列出了几个选项。 XP是一个限制,但你仍然可以在几分钟内使用snow来使用套接字。
答案 2 :(得分:15)
从版本2.15开始,R现在支持多核计算。只需加载并行包
library("parallel")
并查看相关的小插图
vignette("parallel")
答案 3 :(得分:7)
我听说REvolution R支持更好的多线程,然后R和REvolution的典型CRAN版本也支持Windows中的64位R.我一直在考虑购买副本,但我发现他们的价格不透明。他们的网站上没有价目表。很奇怪。
答案 4 :(得分:6)
我相信multicore
包适用于XP。它提供了一些基本的多进程功能,特别是通过提供lapply()
的替代品以及评估新线程(mcparallel()
)中表达式的简单方法。
答案 5 :(得分:2)
在Windows上我认为最好的方法可能是大卫史密斯所说的foreach和snow。
但是,基于Unix / Linux的系统可以使用“多核”包使用多个进程进行计算。它提供了一个高级功能'mclapply',可以跨多个核心执行列表理解。 “多核”包的一个优点是每个处理器都可以获得它可能修改的全局环境的私有副本。最初,此副本只是指向全局环境的指针,如果将全局环境视为只读,则可以非常快速地共享变量。
Rmpi要求在R进程之间明确地传输数据,而不是使用'多核'闭包方法。
- 丹
答案 6 :(得分:0)
如果您进行了大量的矩阵操作并且使用的是Windows,则可以免费安装revolutionanalytics.com/revolution-r-open,而且这个可以使用intel MKL库来执行多线程矩阵操作。在Windows上,如果您从该安装中获取libiomp5md.dll,Rblas.dll和Rlapack.dll文件并覆盖您希望使用的任何R版本中的文件,那么您将拥有多线程矩阵操作(通常会得到10-20 x加速矩阵运算)。或者您可以使用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上有一个版本,它只有unflagged -unix标志,并且也应该在Windows上工作(早期的Windows不是&#39 ; t支持因为依赖bigmemory
据说在Windows上不起作用,但现在看起来确实如此):
library(devtools)
devtools::install_github('tomwenseleers/Rdsm')
library(Rdsm)