1 2 //g++ -O3 -g0 -DNDEBUG sparse_transpose.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out 3 // -DNOGMM -DNOMTL 4 // -DCSPARSE -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a 5 6 #ifndef SIZE 7 #define SIZE 10000 8 #endif 9 10 #ifndef DENSITY 11 #define DENSITY 0.01 12 #endif 13 14 #ifndef REPEAT 15 #define REPEAT 1 16 #endif 17 18 #include "BenchSparseUtil.h" 19 20 #ifndef MINDENSITY 21 #define MINDENSITY 0.0004 22 #endif 23 24 #ifndef NBTRIES 25 #define NBTRIES 10 26 #endif 27 28 #define BENCH(X) \ 29 timer.reset(); \ 30 for (int _j=0; _j<NBTRIES; ++_j) { \ 31 timer.start(); \ 32 for (int _k=0; _k<REPEAT; ++_k) { \ 33 X \ 34 } timer.stop(); } 35 36 int main(int argc, char *argv[]) 37 { 38 int rows = SIZE; 39 int cols = SIZE; 40 float density = DENSITY; 41 42 EigenSparseMatrix sm1(rows,cols), sm3(rows,cols); 43 44 BenchTimer timer; 45 for (float density = DENSITY; density>=MINDENSITY; density*=0.5) 46 { 47 fillMatrix(density, rows, cols, sm1); 48 49 // dense matrices 50 #ifdef DENSEMATRIX 51 { 52 DenseMatrix m1(rows,cols), m3(rows,cols); 53 eiToDense(sm1, m1); 54 BENCH(for (int k=0; k<REPEAT; ++k) m3 = m1.transpose();) 55 std::cout << " Eigen dense:\t" << timer.value() << endl; 56 } 57 #endif 58 59 std::cout << "Non zeros: " << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << "%\n"; 60 61 // eigen sparse matrices 62 { 63 BENCH(for (int k=0; k<REPEAT; ++k) sm3 = sm1.transpose();) 64 std::cout << " Eigen:\t" << timer.value() << endl; 65 } 66 67 // CSparse 68 #ifdef CSPARSE 69 { 70 cs *m1, *m3; 71 eiToCSparse(sm1, m1); 72 73 BENCH(for (int k=0; k<REPEAT; ++k) { m3 = cs_transpose(m1,1); cs_spfree(m3);}) 74 std::cout << " CSparse:\t" << timer.value() << endl; 75 } 76 #endif 77 78 // GMM++ 79 #ifndef NOGMM 80 { 81 GmmDynSparse gmmT3(rows,cols); 82 GmmSparse m1(rows,cols), m3(rows,cols); 83 eiToGmm(sm1, m1); 84 BENCH(for (int k=0; k<REPEAT; ++k) gmm::copy(gmm::transposed(m1),m3);) 85 std::cout << " GMM:\t\t" << timer.value() << endl; 86 } 87 #endif 88 89 // MTL4 90 #ifndef NOMTL 91 { 92 MtlSparse m1(rows,cols), m3(rows,cols); 93 eiToMtl(sm1, m1); 94 BENCH(for (int k=0; k<REPEAT; ++k) m3 = trans(m1);) 95 std::cout << " MTL4:\t\t" << timer.value() << endl; 96 } 97 #endif 98 99 std::cout << "\n\n"; 100 } 101 102 return 0; 103 } 104 105