Мне нужно вычислить разложение по сингулярным значениям (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
Как я могу выполнить вложенное распараллеливание в этой конкретной задаче? Я читал материалы по вложенному распараллеливанию, но не мог понять, как это сделать в моем случае.