2

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

细节

根据Matrix包中的文档R cran

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

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

SSMULT 和 SFMULT:稀疏矩阵乘法。

在我的 Gentoo 上,我已经安装suitesparse-4.2.1suitesparseconfig-4.2.1-r1. 我也lapackscalapackblas。RsessionInfo()看起来如下:

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 计算上运行矩阵运算?

据我查看堆栈和其他论坛,这个问题不应该是重复的。

4

1 回答 1

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