2017-11-27 1 views
1

내 질문의 기본 목표는 R에서 Matrix 패키지를 사용하여 행렬 연산의 최상의 성능을 얻는 방법입니다. 특히 저는 연산 (곱셈)을 병렬화하고 CUDA GPU에서 연산을 사용하여 희소 행렬로 작업하려고합니다. 밀도 및 스파 스 및 패턴 모두 삼각형, 대칭, 대각선 행렬 포함 행렬 클래스의 R cranR의 행렬 연산 : 병렬화, 희소 연산, GPU 계산

풍부한 계층 구조에서 Matrix 패키지의 문서에 따라 부품

, 논리 및 숫자 항목. 'LAPACK'및 'SuiteSparse'라이브러리를 사용하여 이러한 행렬에 대한 수많은 메소드 및 연산.

SuiteSparse 덕분에 GPU (CUDA)를 사용하여 스파 스 매트릭스에서 기본 작업을 수행 할 수 있어야합니다. 특히 SuiteSparse의 문서에는 다음 목록이 나와 있습니다.

SSMULT 및 SFMULT : 스파 스 매트릭스 곱하기.

내 Gentoo에서 과 함께 suitesparse-4.2.1을 설치했습니다. 또한 lapack, scalapackblas이 있습니다. 다음과 같이 R sessionInfo() 본다 : GPU 사용을 허용해야 잠재적

export CHOLMOD_USE_GPU=1 

내가 한 포럼에서 발견 :

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 

가 나는 또한 환경 변수를 설정했습니다.

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

Rsuitesparse 기능을 무시하는 것처럼 GPU가 작동하지 않는 것 같습니다 : 나는 간단한 테스트를 실행할 때

기본적으로 모든하지만, 갈 등의 준비가 보인다.

나는 질문은 매우 광범위 알고 있지만 :

  • 사람은 아이디어가 있습니까 Rsuitesparse 작업 할 특정 엄격한 방법으로 컴파일 할 필요가있는 경우?
  • Matrix 패키지가 병렬 처리 및 스파 스 작동 (GPU 사용)을 위해 모든 공유 라이브러리를 사용하는지 확인하는 방법은 무엇입니까?
  • Matrix 패키지를 사용하여 CUDA/GPU 계산에서 행렬 연산을 실행할 수 있었다는 것을 누구도 확인할 수 있습니까?

스택 및 기타 포럼을 검토 한 경우이 질문은 중복되어서는 안됩니다.

답변

3
  1. 설명대로 쉽지 않습니다.Matrix 패키지는 서브 세트SuiteSparse이고이 서브 세트가 패키지에 내장되어 있습니다. 그래서 MatrixSuiteSparse 시스템을 사용하지 않습니다 (Matrix 소스 코드 here).
  2. sparse_matrix * sparse_matrix 곱셈은 효율적으로 병렬화하기 어렵습니다. 전략은 두 행렬의 구조에 따라 많이 다릅니다.
  3. 대부분의 경우 계산은 메모리 바운드이며 CPU 바운드가 아닙니다.
  4. 위에서 설명한 메모리 문제와 메모리 액세스 패턴으로 인해 CPU에 비해 ​​GPU 성능이 저하 될 수 있습니다.
  5. 내 지식에 따르면 다중 스레드 SSMULT - Intel MKL 및 librsb을 구현하는 라이브러리가 있지만 R 인터페이스에 대해 들어 본 적이 없습니다.
  6. 매트릭스가 거대한 경우 매트릭스를 수동으로 파티션하고 표준 mclapply을 사용할 수 있습니다. 나는 이것이 도움이 될지 의심 스럽다.
  7. EigenRcppEigen을 사용하고 SSMULT를 수행 할 수 있습니다. 나는 그것이 더 빠를 수 있다고 믿는다 (그러나 여전히 단일 스레드).
  8. 궁극적으로 문제를 재구성하고 SSMULT를 피하는 방법에 대해 생각해 보겠습니다.