kernal matrix computation這個主題不只被我用了一次
其實我在PTT分享RcppParallel也是用了這個當例子,文章連結
那這裡就延續上篇的程式把RcppParallel一起拉進來比較一下吧
因為我已經知道p大的時候,我每一個都逐一算其實很慢
那我這裡的RcppParallel就改變一下做法
讓RcppParallel不會因為p改變而使得計算效率改變
這裡新增三個cpp檔案,分別是:RcppArmadillo
1.RcppArmadillo with RcppParallel
- RcppEigen with RcppParallel
- RcppEigen and OpenMP with RcppParallel
其他三個就在前一篇都有了,這裡就不重複貼了
R code:
1 | library(kernlab) |
kernel_matrix_arma_para.cpp:
1 | // [[Rcpp::depends(RcppArmadillo, RcppParallel)]] |
kernel_matrix_eigen_para1.cpp:
1 | // [[Rcpp::depends(RcppEigen, RcppParallel)]] |
kernel_matrix_eigen_para2.cpp:
1 | // [[Rcpp::depends(RcppEigen, RcppParallel)]] |
這個結果可以看出幾件事情:
- 直接用Multi-threaded BLAS的RcppArmadillo在這個問題上,用了RcppParallel還是略輸一籌,BLAS還是比較強大XD
- 相較RcppEigen_RcppParallel跟RcppEigen_RcppParallel_Openmp來看,因為沒平行的部分只剩下一開始計算
kernelMat
、x_square_sum
以及center_square_sum
,所以這裡RcppEigen用它本身的BLAS庫來做乘除就慢上了不少,而後面的計算其實也是用colwise, rowwise以及element-wise的操作,那邊已經被平行做掉了,還是跟只單用RcppEigen差不多快,所以其實element-wise, colwise以及rowwise這幾個操作應該不至於造成瓶頸,因此,最大的瓶頸是在大矩陣的乘法,需要openmp使用multi-thread來加速 - RcppEigen_RcppParallel_Openmp還是比RcppEigen_Openmp比,所以其實後段的處理是白費的,用原本的方法比較快 (RcppArmadillo的部分同理)