【问题标题】:Matrix operations in R: parallelization, sparse operations, GPU computationR 中的矩阵运算:并行化、稀疏运算、GPU 计算
【发布时间】:2018-05-11 02:46:09
【问题描述】:

我的问题的基本目的是如何使用Matrix 包在R 中实现矩阵运算的最佳性能。特别是我想并行化操作(乘法)并使用 CUDA GPU 上的计算处理稀疏矩阵。

详情

根据R cranMatrix包的文档

矩阵类的丰富层次结构,包括三角矩阵、对称矩阵和对角矩阵,既有密集矩阵也有稀疏矩阵,并具有模式、逻辑和数字条目。使用“LAPACK”和“SuiteSparse”库对这些矩阵进行多种方法和操作。

看来,多亏了SuiteSparse,我应该能够使用 GPU (CUDA) 对稀疏矩阵执行基本操作。特别是 SuiteSparse 的文档列出了以下内容:

SSMULT 和 SFMULT:稀疏矩阵乘法。

在我的 Gentoo 上,我安装了 suitesparse-4.2.1suitesparseconfig-4.2.1-r1。我还有lapackscalapackblas。 R sessionInfo() 如下所示:

R version 3.4.1 (2017-06-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Gentoo/Linux

Matrix products: default
BLAS: /usr/lib64/blas/reference/libblas.so.0.0.0
LAPACK: /usr/lib64/lapack/reference/liblapack.so.0.0.0

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8
 [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] Matrix_1.2-10

loaded via a namespace (and not attached):
[1] compiler_3.4.1  grid_3.4.1      lattice_0.20-35

我也设置了环境变量:

export CHOLMOD_USE_GPU=1

我在一个论坛上找到的,可能应该允许使用 GPU。

基本上,一切看起来都准备好了,但是,当我运行一个简单的测试时:

library(Matrix)
M1<-rsparsematrix(10000,10000,0.01) 
M<-M1%*%t(M1)

GPU 似乎无法正常工作,好像R 忽略了suitesparse 功能。

我知道问题范围很广,但是:

  • 是否有人知道R 是否应该以特定、严格的方式编译以使用suitesparse
  • 如何确保Matrix 包使用所有共享库进行并行化和稀疏操作(使用 GPU)?
  • 谁能确认他能够使用 Matrix 包在 CUDA/GPU 计算上运行矩阵运算?

就我查看 Stack 和其他论坛而言,这个问题不应该是重复的。

【问题讨论】:

    标签: r matrix cuda sparse-matrix suitesparse


    【解决方案1】:
    1. 没有你描述的那么容易。 Matrix 包包含SuiteSparse子集,并且该子集内置于包中。所以Matrix不使用你的系统SuiteSparse(你可以轻松浏览Matrix源代码here)。
    2. sparse_matrix * sparse_matrix 乘法很难有效地并行化 - 策略因两个矩阵的结构而异。
    3. 在许多情况下,计算受内存限制,而不是 CPU 限制
    4. 由于上述内存问题 + 内存访问模式,您在 GPU 上的性能可能比在 CPU 上更差。
    5. 据我所知,有几个库实现了多线程 SSMULT - Intel MKL 和 librsb,但我还没有听说过 R 接口。
    6. 如果矩阵很大,您可以手动划分矩阵并使用标准mclapply。我怀疑这会有所帮助。
    7. 您可以尝试使用EigenRcppEigen 并在那里执行SSMULT。我相信它可能会更快(但仍然是单线程)。
    8. 最终我会考虑如何重新表述问题并避免 SSMULT

    【讨论】:

    • 如果你使用稀疏(行主要)和密集(col major),那么 Eigen 多线程跨 CPU 内核。还有一些其他的特殊情况优化可用,但不是稀疏 x 稀疏。
    • @JackWasey 仅供参考,犰狳也能做到 - github.com/conradsnicta/armadillo-code/pull/66
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多