【问题标题】:Parallel big matrix multiplication并行大矩阵乘法
【发布时间】:2018-09-11 10:38:43
【问题描述】:

我需要将两个大矩阵AB 相乘如下:

library(bigmemory)
library(bigalgebra)
library(biganalytics)

A <- big.matrix( replicate(100,  rnorm(10^5)) )
B <- big.matrix( replicate(10^5, rnorm(100))  )
AB <- A %*% B

如何并行计算这个乘法?

目前我遇到的唯一教程是this one

> library("doRedis")
> registerDoRedis(queue="example")
> L = foreach(j=1:2,.packages="VAM",.combine=c) %dopar%
+ {
+ key = paste("X",j,sep="")
+ ridx = ((j-1)*5 + 1):min((j*5),nrow(A))
+ X = A[ridx,] %*% B[,]
+ Y = as.big.matrix(X,backingfile=key)
+ vnew(Y, key)
+ key
+ }
> X = vam(matrix(L,nrow=2))
> sum(X[,] - A[,] %*% B[,])
[1] 0

但我不确定如何将其付诸实践。可能还有更简单/更有效的方法来实现相同的结果?

【问题讨论】:

  • 不要尝试自己实现。有一些优化的并行矩阵库可以在 R 中使用。你有哪个操作系统?
  • @F.Privé 我有 Windows 10。
  • 在 WIndows 上实现此目的的最简单方法是使用 Microsoft R Open。见the benchmarks
  • @F.Privé 感谢您的建议,我对 Microsoft R Open 不熟悉。与 R 相比,使用它有什么主要缺点吗?
  • 应该兼容。看看他们的网站。我认为在 RStduio 中,你甚至可以在 options 中选择你想使用的版本(R ou MRO)。

标签: r r-bigmemory


【解决方案1】:

安装 Microsoft R Open,我从 3 秒到 0.1 秒!

library(bigmemory)
library(bigalgebra)

N <- 200
M <- 1e5

A <- big.matrix(N, M, init = rnorm(N * M))
B <- big.matrix(M, N, init = rnorm(N * M))
system.time(AB <- A %*% B)

【讨论】:

  • 简直不可思议!我尝试了N &lt;- 300M &lt;- 1e6:在 R.3.5.1 下花费了 74.04 秒,而在 MRO 3.5.1 下花费了 15.9 秒。谢谢!
  • 在 MOR 下显式并行计算(例如使用 furrrforeach 包)是否仍然有意义,或者默认情况下所有内容都已并行计算?
  • 不,不要自己并行化。
  • 似乎 bigalgebra 目前已停产。有什么选择吗?
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 2013-05-18
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2014-09-22
相关资源
最近更新 更多