Как использовать OpenMP и OpenBlas в RcppArmadillo? - PullRequest
1 голос
/ 19 июня 2020

Мне нужно вычислить разложение по сингулярным значениям (SVD) массива матриц, хранящихся в кубе RcppArmadillo. Я хотел бы выполнять SVD параллельно для каждой матрицы и хочу включить многопоточность при вычислении SVD через OpenBLAS. Для этого я использую следующий сценарий Cpp:

field<vec> sing_vals(S);
#pragma omp parallel for
    for(unsigned s=0;s<S;++s){
      svd( sing_vals(s), X.slice(s) );
    }

Теперь перед компиляцией этого файла Cpp из R через исходный код Cpp я установил количество потоков OpenMP и OpenBLAS с помощью следующего сценария:

library(OpenMPController )
omp_set_num_threads(nomp)

Sys.setenv("PKG_CXXFLAGS"="-fopenmp")
Sys.setenv("PKG_LIBS"="-fopenmp")


#########################set OPENBLAS nthreads
require(inline)
openblas.set.num.threads <- cfunction( signature(ipt="integer"),
                                       body = 'openblas_set_num_threads(*ipt);',
                                       otherdefs = c ('extern void openblas_set_num_threads(int);'),
                                       libargs = c ('-L/opt/openblas/lib -lopenblas'),
                                       language = "C",
                                       convention = ".C"
)
openblas.set.num.threads(nblas)

Мне нужно установить для любого из nblas и nomp значение 1. Иначе я получаю сообщение

OpenBLAS Warning : Detect OpenMP Loop and this application may hang. Please rebuild the library with USE_OPENMP=1 option

Как я могу выполнить вложенное распараллеливание в этой конкретной задаче? Я читал материалы по вложенному распараллеливанию, но не мог понять, как это сделать в моем случае.

...