【问题标题】:Parallelized sparse matrix rowSums in R (or Rcpp)R(或Rcpp)中的并行稀疏矩阵rowSums
【发布时间】:2020-12-11 17:53:44
【问题描述】:

对于在 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 及其家族性能稳定,可以使用slam 和/或data.table 实现并行化。

【问题讨论】:

    标签: r sparse-matrix rcpp


    【解决方案1】:

    我不知道如何以面向列的稀疏矩阵格式或坐标稀疏矩阵格式并行化行求和,这是 Matrix 存储稀疏矩阵的两种格式。行不是内存连续的。如果您将一组行分块并将其提供给线程,则该线程将必须读取整个矩阵数据结构才能为您提供该块的行和。如果你将它分块并运行 10 个线程,你可能拥有 10 倍的处理能力,但你必须做 10 倍的工作。

    【讨论】:

    • 好主意,听起来很合理。然而,假设矩阵被转置,然后运行并行化 colSums。平行 colSums 很可能会远远超过转置的成本?
    • 您可以在面向列的稀疏矩阵上并行化基于列的操作。对于您的特定行和示例,我只使用矩阵乘法来获得行和 - 英特尔 MKL 很好地并行化矩阵乘法。我不认为它有一个 R 接口。
    • MKL 提供 BLAS 和 LAPACK,因此它可以直接插入。参见例如github.com/eddelbuettel/mkl4deb 在 Debian 和衍生产品上易于使用的脚本。
    • “插头”甚至。在暴露我的拼写不足方面,SO 总是和 Twitter 一样糟糕。请参阅fortunes::fortune("Dirk can type") 了解之前的声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2011-03-23
    • 2015-12-05
    • 2012-01-10
    相关资源
    最近更新 更多