1

我需要计算存储在 RcppArmadillo 立方体中的矩阵数组的奇异值分解 (SVD)。我想为每个矩阵并行执行 SVD,并希望在通过 OpenBLAS 计算 SVD 时启用多线程。为此,我使用以下 Cpp 脚本:

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

现在,在通过 sourceCpp 从 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

我怎样才能在这个确切的问题中进行这种嵌套并行化?我阅读了一些关于嵌套并行化的材料,但不知道如何在我的情况下做到这一点。

4

0 回答 0