diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-10-19 17:06:11 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-10-19 17:06:11 +0000 |
commit | 76fe2e1b34b4388ea3d9585bc840a0bab20ee5be (patch) | |
tree | a8d14974b78f46796a934a10b867286aaa88316d /bench/sparse_product.cpp | |
parent | ecc6c43dba2ca00d2f9d525dcd0d94941bea3fda (diff) |
add/update some benchmark files used to test/compare sparse module features
Diffstat (limited to 'bench/sparse_product.cpp')
-rw-r--r-- | bench/sparse_product.cpp | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/bench/sparse_product.cpp b/bench/sparse_product.cpp index edeb08c5d..dfb4b4335 100644 --- a/bench/sparse_product.cpp +++ b/bench/sparse_product.cpp @@ -1,8 +1,8 @@ //g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out //g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out -// -DNOGMM -DNOMTL - +// -DNOGMM -DNOMTL -DCSPARSE +// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a #ifndef SIZE #define SIZE 10000 #endif @@ -33,6 +33,22 @@ X \ } timer.stop(); } + +#ifdef CSPARSE +cs* cs_sorted_multiply(const cs* a, const cs* b) +{ + cs* A = cs_transpose (a, 1) ; + cs* B = cs_transpose (b, 1) ; + cs* D = cs_multiply (B,A) ; /* D = B'*A' */ + cs_spfree (A) ; + cs_spfree (B) ; + cs_dropzeros (D) ; /* drop zeros from D */ + cs* C = cs_transpose (D, 1) ; /* C = D', so that C is sorted */ + cs_spfree (D) ; + return C; +} +#endif + int main(int argc, char *argv[]) { int rows = SIZE; @@ -87,13 +103,15 @@ int main(int argc, char *argv[]) // eigen sparse matrices { - std::cout << "Eigen sparse\t" << density*100 << "%\n"; + std::cout << "Eigen sparse\t" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << "% * " + << sm2.nonZeros()/float(sm2.rows()*sm2.cols())*100 << "%\n"; // timer.reset(); // timer.start(); BENCH(for (int k=0; k<REPEAT; ++k) sm3 = sm1 * sm2;) // timer.stop(); std::cout << " a * b:\t" << timer.value() << endl; +// std::cout << sm3 << "\n"; timer.reset(); timer.start(); @@ -120,6 +138,32 @@ int main(int argc, char *argv[]) std::cout << " a * b' :\t" << timer.value() << endl; } + // CSparse + #ifdef CSPARSE + { + std::cout << "CSparse \t" << density*100 << "%\n"; + cs *m1, *m2, *m3; + eiToCSparse(sm1, m1); + eiToCSparse(sm2, m2); + + timer.reset(); + timer.start(); + for (int k=0; k<REPEAT; ++k) + { + m3 = cs_sorted_multiply(m1, m2); + if (!m3) + { + std::cerr << "cs_multiply failed\n"; +// break; + } +// cs_print(m3, 0); + cs_spfree(m3); + } + timer.stop(); + std::cout << " a * b:\t" << timer.value() << endl; + } + #endif + // GMM++ #ifndef NOGMM { |