首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的矩阵运算:并行化、稀疏运算、GPU计算

R中的矩阵运算:并行化、稀疏运算、GPU计算
EN

Stack Overflow用户
提问于 2017-11-27 19:07:44
回答 1查看 441关注 0票数 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。R sessionInfo()看起来如下:

代码语言:javascript
复制
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

我还设置了环境变量:

代码语言:javascript
复制
export CHOLMOD_USE_GPU=1

这是我在一个论坛上发现的,有可能允许GPU使用。

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

代码语言:javascript
复制
library(Matrix)
M1<-rsparsematrix(10000,10000,0.01) 
M<-M1%*%t(M1)

GPU似乎无法工作,就好像R忽略了suitesparse特性一样。

我知道问题很广泛,但是:

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

据我在Stack和其他论坛中所看到的,这个问题不应该是重复的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-28 05:54:02

  1. 不像你说的那么容易。Matrix包包含SuiteSparse子集,该子集被内置到包中。因此Matrix不使用您的系统SuiteSparse (您可以轻松地浏览Matrix源代码这里)。
  2. sparse_matrix * sparse_matrix乘法很难有效的并行化--根据两个矩阵的结构,策略会有很大的变化。
  3. 在许多情况下,计算是内存绑定的,而不是CPU绑定的。
  4. 由于上面描述的内存问题+内存访问模式,GPU上的性能可能比CPU差。
  5. 据我所知,有两个库实现多线程SSMULT和图书b,但我没有听说过R接口。
  6. 如果矩阵很大,您可以手动划分矩阵,并使用标准的mclapply。我怀疑这会有帮助。
  7. 您可以尝试使用EigenRcppEigen,并在那里执行SSMULT。我相信它可能会更快(但仍然是单线程)。
  8. 最后,我会考虑如何重新制定问题,避免SSMULT。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47518110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档