Матричные операции в R: распараллеливание, разреженные операции, вычисления на GPU
Основная цель моего вопроса - как добиться максимальной производительности матричных операций в R
с помощью Matrix
пакет. В частности, я хочу распараллелить операции (умножение) и работать с разреженными матрицами, используя вычисления на CUDA GPU.
подробности
Согласно документации Matrix
пакет в R cran
Богатая иерархия классов матриц, включая треугольные, симметричные и диагональные матрицы, как плотные, так и разреженные, с шаблонными, логическими и числовыми элементами. Многочисленные методы и операции над этими матрицами с использованием библиотек "LAPACK" и "SuiteSparse".
Кажется, что благодаря SuiteSparse
Я должен быть в состоянии выполнять основные операции над разреженными матрицами, используя графический процессор (CUDA). В частности, в документации SuiteSparse перечислено следующее:
SSMULT и SFMULT: умножение разреженных матриц.
На моем Gentoo я установил suitesparse-4.2.1
вместе с suitesparseconfig-4.2.1-r1
, Также у меня есть lapack
, scalapack
а также blas
, 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
который я нашел на одном форуме и потенциально должен разрешить использование графического процессора.
В принципе, все выглядит готовым к работе, когда я запускаю простой тест:
library(Matrix)
M1<-rsparsematrix(10000,10000,0.01)
M<-M1%*%t(M1)
Кажется, что GPU не работают, как будто R
игнорирует suitesparse
функции.
Я знаю, что вопросы довольно широкие, но:
- Кто-нибудь есть идеи, если
R
должны быть скомпилированы определенным, строгим образом для работы сsuitesparse
? - Как убедиться, что
Matrix
Пакет использует все общие библиотеки для распараллеливания и разреженных операций (с использованием графического процессора)? - Может ли кто-нибудь подтвердить, что он смог запустить матричные операции на вычислениях CUDA/GPU, используя
Matrix
пакет?
Насколько я просматривал Stack и другие форумы, этот вопрос не должен быть дубликатом.
1 ответ
- Это не так просто, как вы описали.
Matrix
пакет содержит подмножествоSuiteSparse
и это подмножество встроено в пакет. ТакMatrix
не использует вашу системуSuiteSparse
(Вы можете легко просматриватьMatrix
Исходный код здесь). sparse_matrix * sparse_matrix
умножения сложно эффективно распараллелить - стратегии сильно различаются в зависимости от структуры обеих матриц.- Во многих случаях вычисления связаны с памятью, а не с процессором
- Вы можете иметь худшую производительность на GPU по сравнению с CPU из-за проблем с памятью, описанных выше + шаблоны доступа к памяти.
- Насколько мне известно, есть несколько библиотек, которые реализуют многопоточный SSMULT - Intel MKL и librsb, но я не слышал об интерфейсе R.
- Если матрица огромна, вы можете разбить ее вручную и использовать стандартные
mclapply
, Я сомневаюсь, что это поможет. - Вы можете попробовать использовать
Eigen
а такжеRcppEigen
и выполнить SSMULT там. Я считаю, что это может быть довольно быстро (но все еще однопоточным). - В конечном итоге я бы подумал о том, как переформулировать проблему и избежать SSMULT