| |
|
| | |
| |
|
| | #define EIGEN_SUPERLU_SUPPORT |
| | #define EIGEN_UMFPACK_SUPPORT |
| | #include <Eigen/Sparse> |
| |
|
| | #define NOGMM |
| | #define NOMTL |
| |
|
| | #ifndef SIZE |
| | #define SIZE 10 |
| | #endif |
| |
|
| | #ifndef DENSITY |
| | #define DENSITY 0.01 |
| | #endif |
| |
|
| | #ifndef REPEAT |
| | #define REPEAT 1 |
| | #endif |
| |
|
| | #include "BenchSparseUtil.h" |
| |
|
| | #ifndef MINDENSITY |
| | #define MINDENSITY 0.0004 |
| | #endif |
| |
|
| | #ifndef NBTRIES |
| | #define NBTRIES 10 |
| | #endif |
| |
|
| | #define BENCH(X) \ |
| | timer.reset(); \ |
| | for (int _j=0; _j<NBTRIES; ++_j) { \ |
| | timer.start(); \ |
| | for (int _k=0; _k<REPEAT; ++_k) { \ |
| | X \ |
| | } timer.stop(); } |
| |
|
| | typedef Matrix<Scalar,Dynamic,1> VectorX; |
| |
|
| | #include <Eigen/LU> |
| |
|
| | template<int Backend> |
| | void doEigen(const char* name, const EigenSparseMatrix& sm1, const VectorX& b, VectorX& x, int flags = 0) |
| | { |
| | std::cout << name << "..." << std::flush; |
| | BenchTimer timer; timer.start(); |
| | SparseLU<EigenSparseMatrix,Backend> lu(sm1, flags); |
| | timer.stop(); |
| | if (lu.succeeded()) |
| | std::cout << ":\t" << timer.value() << endl; |
| | else |
| | { |
| | std::cout << ":\t FAILED" << endl; |
| | return; |
| | } |
| |
|
| | bool ok; |
| | timer.reset(); timer.start(); |
| | ok = lu.solve(b,&x); |
| | timer.stop(); |
| | if (ok) |
| | std::cout << " solve:\t" << timer.value() << endl; |
| | else |
| | std::cout << " solve:\t" << " FAILED" << endl; |
| |
|
| | |
| | } |
| |
|
| | int main(int argc, char *argv[]) |
| | { |
| | int rows = SIZE; |
| | int cols = SIZE; |
| | float density = DENSITY; |
| | BenchTimer timer; |
| |
|
| | VectorX b = VectorX::Random(cols); |
| | VectorX x = VectorX::Random(cols); |
| |
|
| | bool densedone = false; |
| |
|
| | |
| | |
| | { |
| | EigenSparseMatrix sm1(rows, cols); |
| | fillMatrix(density, rows, cols, sm1); |
| |
|
| | |
| | #ifdef DENSEMATRIX |
| | if (!densedone) |
| | { |
| | densedone = true; |
| | std::cout << "Eigen Dense\t" << density*100 << "%\n"; |
| | DenseMatrix m1(rows,cols); |
| | eiToDense(sm1, m1); |
| |
|
| | BenchTimer timer; |
| | timer.start(); |
| | FullPivLU<DenseMatrix> lu(m1); |
| | timer.stop(); |
| | std::cout << "Eigen/dense:\t" << timer.value() << endl; |
| |
|
| | timer.reset(); |
| | timer.start(); |
| | lu.solve(b,&x); |
| | timer.stop(); |
| | std::cout << " solve:\t" << timer.value() << endl; |
| | |
| | |
| | } |
| | #endif |
| |
|
| | #ifdef EIGEN_UMFPACK_SUPPORT |
| | x.setZero(); |
| | doEigen<Eigen::UmfPack>("Eigen/UmfPack (auto)", sm1, b, x, 0); |
| | #endif |
| |
|
| | #ifdef EIGEN_SUPERLU_SUPPORT |
| | x.setZero(); |
| | doEigen<Eigen::SuperLU>("Eigen/SuperLU (nat)", sm1, b, x, Eigen::NaturalOrdering); |
| | |
| | |
| | doEigen<Eigen::SuperLU>("Eigen/SuperLU (COLAMD)", sm1, b, x, Eigen::ColApproxMinimumDegree); |
| | #endif |
| |
|
| | } |
| |
|
| | return 0; |
| | } |
| |
|
| |
|