0

我试图理解为什么调用 arma::pinv 的 Armadillo与通过 RcppArmadillo 在 R中调用相同的函数相比,直接在 c++ 中调用(Visual Studio)需要更多的时间

在 RI 中,编译/生成包时只是遵循了一种超级基本的方法

MyPackageName <- "thetestpackage"
RcppArmadillo.package.skeleton(MyPackageName, example_code = FALSE)
compileAttributes(pkgdir = paste0("./",MyPackageName), verbose = TRUE)
install(MyPackageName)

在 VisualStudio 中,我使用 NuGet 包管理器安装了“犰狳代码”和“OpenBLAS”,但我也尝试下载犰狳并使用“附加包含目录”包含库:结果相同。

我的感觉是我没有有效地使用 LAPACK 和/或 BLAS。你有什么想法?提前非常感谢!

在 VS 中运行的 c++ 代码如下,在 i = 1000(迭代)和 n = 100(矩阵大小)的情况下运行大约需要 25 秒

#include <iostream>
#include <armadillo>
#include <chrono>  


arma::mat rcpparma_myfun(int i, int n) {
    arma::mat A(n, n);
    A.randn();
    arma::mat B;
    B = arma::pinv(A);
    auto start = std::chrono::high_resolution_clock::now();
    for (int ii = 0; ii < i; ii++) {
        B = arma::pinv(A);
    }
    auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = finish - start;
    std::cout << "Elapsed time: " << elapsed.count() << " s\n";
    return B;
}

int main()
{
    int iters;
    int size;
    std::cout << "Enter iteration\n";
    std::cin >> iters;
    std::cout << "Enter size\n";
    std::cin >> size;
    arma::mat BB;
    BB = rcpparma_myfun(iters, size);
}

用于 RccpArmadillo 的 cpp 函数如下所示,运行 i = 1000(迭代)和 n = 100(矩阵大小)大约需要 8 秒:

#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat rcpparma_myfun(int i, int n) {
    arma::mat A(n,n);
    A.randn();
    arma::mat B;
    B = arma::pinv(A);
    
    for (int ii = 0; ii < i; ii++) {
        B = arma::pinv(A);
    }
    return B;
}
``
4

0 回答 0