R包自动使用多个核心?

时间:2011-01-23 17:09:50

标签: r multicore

我注意到R在执行我的一个程序时只使用一个核心,这需要大量的计算。我想利用我的多核处理器让我的程序运行得更快。 我还没有深入调查这个问题,但我很感激你的评论,因为我没有很好的计算机科学知识,而且我很难获得有关该主题的易于理解的信息。

是否有允许R在需要时自动使用多个内核的软件包?

我想这不是那么简单。

6 个答案:

答案 0 :(得分:48)

R只能在附加软件包的帮助下使用多个内核,并且仅适用于某些类型的操作。有关选项的详细信息,请参阅CRAN上的High Performance Computing Task View

更新:R版本2.14.0不一定需要附加软件包,因为并行软件包包含在R附带的推荐软件包中< strong> parallel 包括多核包中的功能,基本不变。

答案 1 :(得分:31)

利用多处理器的最简单方法是multicore包,其中包含函数mclapply()。 mclapply()是lapply()的多核版本。因此,任何可以使用lapply()的进程都可以轻松转换为mclapply()进程。但是,多核不适用于Windows。我写了一篇关于这个last year的博客文章,可能会有所帮助。 Revolution Analytics创建的软件包doSMP不是R的多线程版本。它实际上是多核的Windows版本。

如果你的工作是embarrassingly parallel,那么熟悉lapply()类型的结构是个好主意。这将使您轻松地进入mclapply()甚至使用相同的抽象分布式计算。

对于没有“令人尴尬的平行”的操作,事情变得更加困难。

[编辑]

作为旁注,Rstudio作为R的前端越来越受欢迎。我喜欢Rstudio并且每天都使用它。然而需要注意的是Rstudio与Multicore的搭配并不好(至少截至2011年10月......我明白RStudio团队将会解决这个问题)。这是因为Rstudio在幕后做了一些分支,这些分叉与Multicore试图分叉相冲突。因此,如果您需要多核,您可以在Rstuido中编写代码,但在简单的Jane R会话中运行它。

答案 2 :(得分:14)

在这个问题上,你总会得到非常简短的答案。根据我的说法,最简单的解决方案是基于雪的snowfall包。也就是说,在具有多个内核的Windows单台计算机上。有关简单示例,请参见此处article of Knaus et al。降雪是雪包的包装,允许您使用一些命令设置多核。它绝对比大多数其他软件包更麻烦(我没有尝试所有这些)。

在旁注中,确实只有很少的任务可以并行化,原因很简单,你必须能够在多核计算有意义之前拆分任务。 apply系列显然是一个合乎逻辑的选择:多次和独立计算,这对于多核使用至关重要。其他任何东西并不总是那么容易多元化。

另请阅读sfApply and custom functions上的讨论。

答案 3 :(得分:7)

Microsoft R Open包含多线程数学库,以提高R.It在Windows / Unix / Mac中的所有操作系统类型的性能。它是开源的,如果您有任何现有的R(来自CRAN)安装,可以安装在单独的目录中。你可以使用流行的IDE Rstudio。从一开始,R就被设计为一次只使用一个线程(处理器)。即使在今天,除非与多线程BLAS / LAPACK库链接,否则R会以这种方式工作。

今天的多核机器提供并行处理能力。为了利用这一点,Microsoft R Open包含多线程数学库。 这些库使得许多常见的R操作成为可能,例如矩阵乘法/逆矩阵,矩阵分解和一些更高级别的矩阵运算,可以并行计算并使用所有可用的处理能力来减少计算时间。

请查看以下链接:

https://mran.revolutionanalytics.com/rro/#about-rro

http://www.r-bloggers.com/using-microsoft-r-open-with-rstudio/

答案 4 :(得分:3)

正如David Heffernan所说,看看革命分析博客。但是你应该知道大多数软件包都适用于Linux。所以,如果你使用Windows,它会更难。 无论如何,看看这些网站:

Revolution。在这里你会发现关于R中的并行化的讲座。讲座实际上非常好,但正如我所说的,大多数技巧都是针对Linux的。

这个 Stackoverflow 的帖子将讨论Windows中的一些实现。

答案 5 :(得分:1)

future软件包使使用并行和分布式处理在R中工作非常简单。 More info here。如果要将函数并行应用到元素,则future.apply包提供了一种使用“应用”族函数(例如apply()lapply()和{{1} })。

示例:

vapply()