Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Rcpp函数放入R包后的性能崩溃 我想用C++特征库加速R中的矩阵乘法运算。 不知何故,我的简单函数eigen\u mult在放入包中时的性能非常不同 // [[Rcpp::depends(RcppEigen)]] #include <RcppEigen.h> //[[Rcpp::export]] Eigen::MatrixXd eigen_mult(Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> X){ return(A * X); }_R_Eigen_Rcpp_R Package - Fatal编程技术网

将Rcpp函数放入R包后的性能崩溃 我想用C++特征库加速R中的矩阵乘法运算。 不知何故,我的简单函数eigen\u mult在放入包中时的性能非常不同 // [[Rcpp::depends(RcppEigen)]] #include <RcppEigen.h> //[[Rcpp::export]] Eigen::MatrixXd eigen_mult(Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> X){ return(A * X); }

将Rcpp函数放入R包后的性能崩溃 我想用C++特征库加速R中的矩阵乘法运算。 不知何故,我的简单函数eigen\u mult在放入包中时的性能非常不同 // [[Rcpp::depends(RcppEigen)]] #include <RcppEigen.h> //[[Rcpp::export]] Eigen::MatrixXd eigen_mult(Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> X){ return(A * X); },r,eigen,rcpp,r-package,R,Eigen,Rcpp,R Package,鉴于会话正在工作,它看起来如下所示: other attached packages: [1] svmod_0.1.0 microbenchmark_1.4-6 loaded via a namespace (and not attached): [1] compiler_3.5.1 Matrix_1.2-14 tools_3.5.1 yaml_2.2.0 Rcpp_0.12.19 grid_3.5.1 lattice_0.20-35

鉴于会话正在工作,它看起来如下所示:

other attached packages:
[1] svmod_0.1.0          microbenchmark_1.4-6

loaded via a namespace (and not attached):
[1] compiler_3.5.1  Matrix_1.2-14   tools_3.5.1     yaml_2.2.0      Rcpp_0.12.19    grid_3.5.1      lattice_0.20-35
我不知道如何重现第一个会话来检查这是否是问题的根源

还不是一个完整的答案,但我想指出的是,我没有得到这种行为:

# Try using a new package from scratch, with only this function
Rcpp::Rcpp.package.skeleton("svmod", example_code = FALSE)
# Then add RcppEigen in LinkingTo, add eigen_mult.cpp to src/
Rcpp::compileAttributes("svmod")
devtools::install("svmod")
Rcpp::sourceCpp("eigen_mult.cpp")
library(microbenchmark)
set.seed(1)
A <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
B <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
microbenchmark(
    "base R" =  A %*% B,
    "Eigen1" =  eigen_mult(A, B),
    "Eigen2" =  svmod::eigen_mult(A,B),
    times = 10
)

Unit: milliseconds
   expr      min       lq     mean   median       uq      max neval cld
 base R 853.6304 858.1488 882.5745 871.6440 894.3132 938.8883    10   b
 Eigen1 172.4896 173.4745 174.5335 174.5249 175.4813 177.6152    10  a 
 Eigen2 170.9105 174.1170 174.7807 174.3971 176.5156 179.0742    10  a 
#尝试从头开始使用新软件包,只使用此功能
Rcpp::Rcpp.package.skeleton(“svmod”,示例代码=FALSE)
#然后在LinkingTo中添加RcppEigen,在src中添加eigen_mult.cpp/
Rcpp::compileAttributes(“svmod”)
devtools::安装(“svmod”)
Rcpp::sourceCpp(“eigen_mult.cpp”)
图书馆(微基准)
种子(1)
A还不是一个完整的答案,但我想指出的是,我没有得到这种行为:

# Try using a new package from scratch, with only this function
Rcpp::Rcpp.package.skeleton("svmod", example_code = FALSE)
# Then add RcppEigen in LinkingTo, add eigen_mult.cpp to src/
Rcpp::compileAttributes("svmod")
devtools::install("svmod")
Rcpp::sourceCpp("eigen_mult.cpp")
library(microbenchmark)
set.seed(1)
A <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
B <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
microbenchmark(
    "base R" =  A %*% B,
    "Eigen1" =  eigen_mult(A, B),
    "Eigen2" =  svmod::eigen_mult(A,B),
    times = 10
)

Unit: milliseconds
   expr      min       lq     mean   median       uq      max neval cld
 base R 853.6304 858.1488 882.5745 871.6440 894.3132 938.8883    10   b
 Eigen1 172.4896 173.4745 174.5335 174.5249 175.4813 177.6152    10  a 
 Eigen2 170.9105 174.1170 174.7807 174.3971 176.5156 179.0742    10  a 
#尝试从头开始使用新软件包,只使用此功能
Rcpp::Rcpp.package.skeleton(“svmod”,示例代码=FALSE)
#然后在LinkingTo中添加RcppEigen,在src中添加eigen_mult.cpp/
Rcpp::compileAttributes(“svmod”)
devtools::安装(“svmod”)
Rcpp::sourceCpp(“eigen_mult.cpp”)
图书馆(微基准)
种子(1)

A如果删除名称空间调用(例如,
svmod::
),会发生什么?我们不知道为什么会发生这种情况。你最好的选择可能是继续减少包装,或者从空包装开始。没有理由这样做。好的,谢谢。我打得有点自大,在一个干净的R区打得很好。一段时间后,情况似乎变得更糟。如果删除名称空间调用(例如
svmod::
),会发生什么?我们不知道为什么会发生这种情况。你最好的选择可能是继续减少包装,或者从空包装开始。没有理由这样做。好的,谢谢。我打得有点自大,在一个干净的R区打得很好。过了一段时间,情况似乎变得更糟了。物理定律仍然成立。晚上11点的新闻。@DirkedelbuettelExactly@Alex我相信那是真的。这里的要点是,您的问题与将函数放在包中无关。这与您的特定设置更为特殊,可能需要更多的修补才能发现,可能从Dirk的建议开始,从一个空包开始,添加您的函数,然后一次添加一个,直到找到罪魁祸首。谢谢您的帮助。它现在也在我的机器上工作。我仍然不确定是什么原因导致了这个问题,但我在会议中发现了一些奇怪的东西,如果它没有很好地工作(请参阅编辑后的问题)。然而,我不知道如何重现这一点。我还注意到,在您的新编辑中,
svmod_0.1.0
附加在第二个
sessionInfo()
中,而
通过命名空间加载(未附加)
附加在第一个中。我还没有考虑到这一点的含义(我不确定这可能是完全不相关的),但需要注意的是,这是应该的。物理定律仍然成立。晚上11点的新闻。@DirkedelbuettelExactly@Alex我相信那是真的。这里的要点是,您的问题与将函数放在包中无关。这与您的特定设置更为特殊,可能需要更多的修补才能发现,可能从Dirk的建议开始,从一个空包开始,添加您的函数,然后一次添加一个,直到找到罪魁祸首。谢谢您的帮助。它现在也在我的机器上工作。我仍然不确定是什么原因导致了这个问题,但我在会议中发现了一些奇怪的东西,如果它没有很好地工作(请参阅编辑后的问题)。然而,我不知道如何重现这一点。我还注意到,在您的新编辑中,
svmod_0.1.0
附加在第二个
sessionInfo()
中,而
通过命名空间加载(未附加)
附加在第一个中。我还没有考虑到这一点的含义(我不确定这可能是完全无关的),但需要注意的是。
# Try using a new package from scratch, with only this function
Rcpp::Rcpp.package.skeleton("svmod", example_code = FALSE)
# Then add RcppEigen in LinkingTo, add eigen_mult.cpp to src/
Rcpp::compileAttributes("svmod")
devtools::install("svmod")
Rcpp::sourceCpp("eigen_mult.cpp")
library(microbenchmark)
set.seed(1)
A <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
B <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
microbenchmark(
    "base R" =  A %*% B,
    "Eigen1" =  eigen_mult(A, B),
    "Eigen2" =  svmod::eigen_mult(A,B),
    times = 10
)

Unit: milliseconds
   expr      min       lq     mean   median       uq      max neval cld
 base R 853.6304 858.1488 882.5745 871.6440 894.3132 938.8883    10   b
 Eigen1 172.4896 173.4745 174.5335 174.5249 175.4813 177.6152    10  a 
 Eigen2 170.9105 174.1170 174.7807 174.3971 176.5156 179.0742    10  a 
# Try your package
remove.packages("svmod")
devtools::install_github("alexandergerber/svmod")
# (in a new R session)
Rcpp::sourceCpp("eigen_mult.cpp")
library(microbenchmark)
set.seed(1)
A <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
B <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
microbenchmark(
    "base R" =  A %*% B,
    "Eigen1" =  eigen_mult(A, B),
    "Eigen2" =  svmod::eigen_mult2(A,B),
    times = 10
)

Unit: milliseconds
   expr      min       lq     mean   median       uq      max neval cld
 base R 813.7922 820.6887 854.6929 837.3059 879.7640 978.0778    10   b
 Eigen1 171.8826 172.6738 210.6316 181.7109 246.6778 332.1725    10  a 
 Eigen2 171.7884 172.8768 176.0966 173.5973 177.5424 186.5957    10  a