R:使用;foreach“;使用英特尔MKL:“英特尔MKL”;Lapack例程中的错误代码9';dgesdd&x27&引用;

R:使用;foreach“;使用英特尔MKL:“英特尔MKL”;Lapack例程中的错误代码9';dgesdd&x27&引用;,r,linux,foreach,intel-mkl,R,Linux,Foreach,Intel Mkl,我正试图加快运行数千个线性模型的排列所需的时间。我相信英特尔MKL BLAS已被证明能提高回归计算的性能 更新:使用常规for循环再次尝试下面的代码,一次迭代后出现错误: Error in La.svd(x, nu, nv) : error code 9 from Lapack routine 'dgesdd' 看起来,英特尔MKL如何计算SVD(相对于默认的R BLAS)的问题正在引起关注 使用svd R包中的propack.svd()函数似乎可以解决问题。 此解决方案的成功归功于GitHu

我正试图加快运行数千个线性模型的排列所需的时间。我相信英特尔MKL BLAS已被证明能提高回归计算的性能

更新:使用常规for循环再次尝试下面的代码,一次迭代后出现错误:

Error in La.svd(x, nu, nv) : error code 9 from Lapack routine 'dgesdd'
看起来,英特尔MKL如何计算SVD(相对于默认的R BLAS)的问题正在引起关注

使用svd R包中的propack.svd()函数似乎可以解决问题。

此解决方案的成功归功于GitHub上的NerdCommand:


遇到错误的代码块:

j=1
datTemp=foreach(1:N,.combine=cbind) %dopar% { 

top10Expr=datExpr[rownames(datExpr) %in% top10pool[top10inds[,j],grep(datinfoSpec1$DatName[i],colnames(top10pool))],]

top10ME=svd(top10Expr,nu=1,nv=1)$v[,1]
if(cor(top10ME,as.numeric(top10Expr[1,]))<0){
 top10ME=-1*top10ME
}
fit=lapply(rownames(datExprTemp),function(x){lm(as.numeric(datExprTemp[rownames(datExprTemp) %in% x,])~top10ME)})
j=j+1
sapply(fit,function(y){sum(y$residuals^2)/ncol(datExpr)})
      } # // end N permutations 
Error in { : task 1 failed - "missing value where TRUE/FALSE needed"

traceback()
3: stop(simpleError(msg, call = expr))
2: e$fun(obj, substitute(ex), parent.frame(), e$data)
1: foreach(1:N, .combine = cbind) %dopar% {
       top10Expr = datExpr[rownames(datExpr) %in% top10pool[top10inds[, 
           j], grep(datinfoSpec1$DatName[i], colnames(top10pool))], 
           ]
       top10ME = svd(top10Expr, nu = 1, nv = 1)$v[, 1]
       if (cor(top10ME, as.numeric(top10Expr[1, ])) < 0) {
           top10ME = -1 * top10ME
       }
       fit = lapply(rownames(datExprTemp), function(x) {
           lm(as.numeric(datExprTemp[rownames(datExprTemp) %in% 
               x, ]) ~ top10ME)
       })
       j = j + 1
       sapply(fit, function(y) {
           sum(y$residuals^2)/ncol(datExpr)
       })
   }
Error in { : task 2 failed - "error code 9 from Lapack routine 'dgesdd'"

 traceback()
3: stop(simpleError(msg, call = expr))
2: e$fun(obj, substitute(ex), parent.frame(), e$data)
1: foreach(1:N, .combine = cbind) %dopar% {
       top10Expr = datExpr[rownames(datExpr) %in% top10pool[top10inds[, 
           j], grep(datinfoSpec1$DatName[i], colnames(top10pool))], 
           ]
       top10ME = svd(top10Expr, nu = 1, nv = 1)$v[, 1]
       if (cor(top10ME, as.numeric(top10Expr[1, ])) < 0) {
           top10ME = -1 * top10ME
       }
       fit = lapply(rownames(datExprTemp), function(x) {
           lm(as.numeric(datExprTemp[rownames(datExprTemp) %in% 
               x, ]) ~ top10ME)
       })
       j = j + 1
       sapply(fit, function(y) {
           sum(y$residuals^2)/ncol(datExpr)
       })
   }
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Devuan GNU/Linux 3 (beowulf)

Matrix products: default
BLAS/LAPACK: /opt/intel/compilers_and_libraries_2018.2.199/linux/mkl/lib/intel64_lin/libmkl_rt.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tibble_3.0.3      rlang_0.4.7       doParallel_1.0.15 iterators_1.0.12  foreach_1.5.0    
[6] dplyr_1.0.2       data.table_1.13.0

loaded via a namespace (and not attached):
 [1] codetools_0.2-16 crayon_1.3.4     R6_2.4.1         lifecycle_0.2.0  magrittr_1.5     pillar_1.4.6    
 [7] rstudioapi_0.11  vctrs_0.3.4      generics_0.0.2   ellipsis_0.3.1   tools_4.0.3      glue_1.4.2      
[13] purrr_0.3.4      compiler_4.0.3   pkgconfig_2.0.3  tidyselect_1.1.0