C++ 特征库中特征解算器的性能

C++ 特征库中特征解算器的性能,c++,matrix,eigenvector,eigen3,C++,Matrix,Eigenvector,Eigen3,我刚下载了最新的Eigen lib版本 本征解算器的算式(o)n^3..通常与矩阵乘法相同 S、 为什么如果我有500*500矩阵,计算EVD的时间大约是15-30 秒..矩阵乘以大约10秒 在矩阵大小为2450*2450的情况下,EVD时间约为35!分钟 矩阵乘法的时间大约是65秒 LOGD( "This isf beging EVD matA "); if(matA.cols()>2000){ Eigen::SelfAdjointEigenSolver<

我刚下载了最新的Eigen lib版本

本征解算器的算式(o)n^3..通常与矩阵乘法相同

S、 为什么如果我有500*500矩阵,计算EVD的时间大约是15-30 秒..矩阵乘以大约10秒

在矩阵大小为2450*2450的情况下,EVD时间约为35!分钟

矩阵乘法的时间大约是65秒

 LOGD( "This isf beging EVD  matA ");
    if(matA.cols()>2000){
        Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> esSelf(DATA);
        D =esSelf.eigenvalues().asDiagonal();
        matV =esSelf.eigenvectors();
    }else{

        EigenSolver<MatrixXd> ess0(DATA);
        D = ess0.pseudoEigenvalueMatrix();
        matV = ess0.pseudoEigenvectors();

    }
    LOGD( "This isf END EVD  matA ");
LOGD(“此isf beging EVD matA”);
如果(matA.cols()>2000){
特征::自伴特征解算器esSelf(数据);
D=自身特征值().作为对角线();
matV=esSelf.特征向量();
}否则{
特征解算器ess0(数据);
D=ess0.伪特征矩阵();
matV=ess0.伪特征向量();
}
LOGD(“本isf结束EVD matA”);

我不知道具体细节,但o(n^3)是一个非常昂贵的算法。两者都是o(n^3),这是真的(请记住,Landau符号抑制常数因子)。但在内存访问模式和缓存局部性方面,特征解算器的行为与矩阵乘法完全不同。矩阵乘法在大型矩阵中几乎可以完美缩放,因此,一旦矩阵大小超过~1-2k,计算EVD就会出现缓存未命中。是否在启用优化的情况下编译?与OpenMP
-f OpenMP
、速度
-O3
、发布
-DEIGEN\u NO\u DEBUG
的并行处理类似?这些是g++/clang++的标志,不确定VC对应的标志。请参阅以获取基准。这些测试是在一个具有32kB一级缓存的CPU上执行的,您可以清楚地看到这是不够的。为了计算更大矩阵的EVD,您需要一个具有更大一级缓存的CPU,否则您将受到一级未命中的严重限制,并且无法正确利用FPU。没有其他方法可以加速EVD的计算。你有权利:我发现: