R(或 Rcpp)中的并行化稀疏矩阵 rowSums
Parallelized sparse matrix rowSums in R (or Rcpp)
对于在 R 中对稀疏矩阵中的所有行求和的简单任务,Matrix::rowSums()
做得很好:
library(Matrix)
m <- rsparsematrix(10000, 5000, 0.1)
rsums <- Matrix::rowSums(m)
显然,这个函数可以通过按行阻塞求和来并行化。那里有哪些选择?我好像找不到。
为一些基准测试奠定基础...
library(rbenchmark)
benchmark(
"Matrix::rowSums" = {
Matrix::rowSums(m)
},
replications = 10,
columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))
# test replications elapsed relative user.self sys.self
# 1 Matrix::rowSums 10 1.14 1 0.95 0.19
我想要最快的解决方案,R 或 Rcpp。
请参阅 Will Townes 关于遍历稀疏矩阵的出色研究:https://rpubs.com/will_townes/sparse-apply。结论似乎是 Matrix::rowSums
和 family 是可靠的执行者,并且可以通过 slam
and/or data.table
.
实现并行化
我看不出如何以面向列的稀疏矩阵格式或坐标稀疏矩阵格式并行化行求和,这是矩阵存储稀疏矩阵的两种格式。行不是内存连续的。如果您将一组行分块并将其交给一个线程,该线程将必须读取整个矩阵数据结构才能为您提供该块的行和。如果你将它分块并 运行 10 个线程,你可能拥有 10 倍的处理能力,但你必须做 10 倍的工作。
对于在 R 中对稀疏矩阵中的所有行求和的简单任务,Matrix::rowSums()
做得很好:
library(Matrix)
m <- rsparsematrix(10000, 5000, 0.1)
rsums <- Matrix::rowSums(m)
显然,这个函数可以通过按行阻塞求和来并行化。那里有哪些选择?我好像找不到。
为一些基准测试奠定基础...
library(rbenchmark)
benchmark(
"Matrix::rowSums" = {
Matrix::rowSums(m)
},
replications = 10,
columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))
# test replications elapsed relative user.self sys.self
# 1 Matrix::rowSums 10 1.14 1 0.95 0.19
我想要最快的解决方案,R 或 Rcpp。
请参阅 Will Townes 关于遍历稀疏矩阵的出色研究:https://rpubs.com/will_townes/sparse-apply。结论似乎是 Matrix::rowSums
和 family 是可靠的执行者,并且可以通过 slam
and/or data.table
.
我看不出如何以面向列的稀疏矩阵格式或坐标稀疏矩阵格式并行化行求和,这是矩阵存储稀疏矩阵的两种格式。行不是内存连续的。如果您将一组行分块并将其交给一个线程,该线程将必须读取整个矩阵数据结构才能为您提供该块的行和。如果你将它分块并 运行 10 个线程,你可能拥有 10 倍的处理能力,但你必须做 10 倍的工作。