Матричные операции в 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 ответ

Решение
  1. Это не так просто, как вы описали. Matrix пакет содержит подмножество SuiteSparse и это подмножество встроено в пакет. Так Matrix не использует вашу систему SuiteSparse (Вы можете легко просматривать Matrix Исходный код здесь).
  2. sparse_matrix * sparse_matrix умножения сложно эффективно распараллелить - стратегии сильно различаются в зависимости от структуры обеих матриц.
  3. Во многих случаях вычисления связаны с памятью, а не с процессором
  4. Вы можете иметь худшую производительность на GPU по сравнению с CPU из-за проблем с памятью, описанных выше + шаблоны доступа к памяти.
  5. Насколько мне известно, есть несколько библиотек, которые реализуют многопоточный SSMULT - Intel MKL и librsb, но я не слышал об интерфейсе R.
  6. Если матрица огромна, вы можете разбить ее вручную и использовать стандартные mclapply, Я сомневаюсь, что это поможет.
  7. Вы можете попробовать использовать Eigen а также RcppEigen и выполнить SSMULT там. Я считаю, что это может быть довольно быстро (но все еще однопоточным).
  8. В конечном итоге я бы подумал о том, как переформулировать проблему и избежать SSMULT
Другие вопросы по тегам