• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(int argc,char * argv[])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