如何在Eigen C ++中加快LU分解?

问题描述 投票:1回答:1

我是C ++和Eigen库的新手。我想在大小为1815 X 1815的矩阵上执行LU分解(部分透视),并带有复杂的条目。但是,我的代码性能很差,LU分解花费77.2852秒,而MATLAB仅花费0.140946秒。请找到随附的代码。关于如何改进代码的任何建议?请注意,在代码的第一部分中,我正在从条目为a + bi的文件中导入矩阵,其中ab是复数。矩阵文件是从MATLAB生成的。谢谢。

#include <iostream>
#include <Eigen/Dense>
#include <fstream>
#include <complex>
#include <string>
#include <chrono> 

using namespace std;
using namespace std::chrono; 
using namespace Eigen;

int main(){ 

    int mat_sz = 1815; // size of matrix
    MatrixXcd c_mat(mat_sz,mat_sz); // initialize eigen matrix
    double re, im;
    char sign;
    string entry;

    ifstream myFile("A_mat"); // format of entries : a + bi. 'a' and 'b' are complex numbers

    //Import and assign matrix to an Eigen matrix

    for (int i = 0; i < mat_sz; i++){
        for (int j = 0; j < mat_sz; j++){
            myFile >> entry;

            stringstream stream(entry);
            stream >> re >> sign >> im;
            c_mat(i,j) = {re, (sign == '-') ? -im : im}; // Assigning matrix entries
        }
    }

    // LU Decomposition

    auto start = high_resolution_clock::now();

    c_mat.partialPivLu(); // Solving equation through partial LU decomposition

    auto stop = high_resolution_clock::now(); 
    auto duration = duration_cast<microseconds>(stop - start);

    double million = 1000000;

    cout << "Time taken by function: " << duration.count()/million << " seconds" << endl; 

} 


c++ eigen matrix-factorization
1个回答
1
投票

我将评论总结为一个答案。

[当您感觉到Eigen的运行速度很慢时,有一些事情需要验证。

  1. 是否启用了优化?Eigen是一个模板繁重的库,它执行大量的编译时检查,应该对其进行优化。如果未启用优化,则不会内联任何优化,并且会进行许多无意义的函数调用。即使是最低级别的优化,通常也可以缓解大多数问题(gcc / clang中的-O1或更高,MSVC中的/O1或更高)。有关优化的一般说明可以为found here
  2. 我使用所有硬件选项吗?如果允许,可以对本征中的许多代码进行矢量化处理。确保通过启用SSE / AVX / etc的标志启用此功能。如果目标硬件支持它。如果可用,也启用FMA。有一个占位符doc here
  3. 启用多线程如果您的进程/硬件允许,请考虑enabling OpenMP以允许Eigen将多个内核用于某些操作。
  4. 使用正确的精度在许多应用中,只有前几个数字很重要。如果在您的应用程序中是这种情况,请考虑使用单精度而不是双精度。
  5. 链接到微调的库最后,Eigen吐出了一些精巧的C ++代码,并依靠编译器本身来处理大多数优化。在某些情况下,调整更好的库(例如MKL)可以提高性能。 Eigen can link to MKL可以从硬件中挤出更多的速度。
© www.soinside.com 2019 - 2024. All rights reserved.