sparse_dense_product.cpp
Go to the documentation of this file.
1 
2 //g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.005 -DSIZE=10000 && ./a.out
3 //g++ -O3 -g0 -DNDEBUG sparse_product.cpp -I.. -I/home/gael/Coding/LinearAlgebra/mtl4/ -DDENSITY=0.05 -DSIZE=2000 && ./a.out
4 // -DNOGMM -DNOMTL -DCSPARSE
5 // -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a
6 #ifndef SIZE
7 #define SIZE 650000
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 
37 #ifdef CSPARSE
38 cs* cs_sorted_multiply(const cs* a, const cs* b)
39 {
40  cs* A = cs_transpose (a, 1) ;
41  cs* B = cs_transpose (b, 1) ;
42  cs* D = cs_multiply (B,A) ; /* D = B'*A' */
43  cs_spfree (A) ;
44  cs_spfree (B) ;
45  cs_dropzeros (D) ; /* drop zeros from D */
46  cs* C = cs_transpose (D, 1) ; /* C = D', so that C is sorted */
47  cs_spfree (D) ;
48  return C;
49 }
50 #endif
51 
52 int main(int argc, char *argv[])
53 {
54  int rows = SIZE;
55  int cols = SIZE;
56  float density = DENSITY;
57 
58  EigenSparseMatrix sm1(rows,cols);
59  DenseVector v1(cols), v2(cols);
60  v1.setRandom();
61 
63  for (float density = DENSITY; density>=MINDENSITY; density*=0.5)
64  {
65  //fillMatrix(density, rows, cols, sm1);
66  fillMatrix2(7, rows, cols, sm1);
67 
68  // dense matrices
69  #ifdef DENSEMATRIX
70  {
71  std::cout << "Eigen Dense\t" << density*100 << "%\n";
72  DenseMatrix m1(rows,cols);
73  eiToDense(sm1, m1);
74 
75  timer.reset();
76  timer.start();
77  for (int k=0; k<REPEAT; ++k)
78  v2 = m1 * v1;
79  timer.stop();
80  std::cout << " a * v:\t" << timer.best() << " " << double(REPEAT)/timer.best() << " * / sec " << endl;
81 
82  timer.reset();
83  timer.start();
84  for (int k=0; k<REPEAT; ++k)
85  v2 = m1.transpose() * v1;
86  timer.stop();
87  std::cout << " a' * v:\t" << timer.best() << endl;
88  }
89  #endif
90 
91  // eigen sparse matrices
92  {
93  std::cout << "Eigen sparse\t" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << "%\n";
94 
95  BENCH(asm("#myc"); v2 = sm1 * v1; asm("#myd");)
96  std::cout << " a * v:\t" << timer.best()/REPEAT << " " << double(REPEAT)/timer.best(REAL_TIMER) << " * / sec " << endl;
97 
98 
99  BENCH( { asm("#mya"); v2 = sm1.transpose() * v1; asm("#myb"); })
100 
101  std::cout << " a' * v:\t" << timer.best()/REPEAT << endl;
102  }
103 
104 // {
105 // DynamicSparseMatrix<Scalar> m1(sm1);
106 // std::cout << "Eigen dyn-sparse\t" << m1.nonZeros()/float(m1.rows()*m1.cols())*100 << "%\n";
107 //
108 // BENCH(for (int k=0; k<REPEAT; ++k) v2 = m1 * v1;)
109 // std::cout << " a * v:\t" << timer.value() << endl;
110 //
111 // BENCH(for (int k=0; k<REPEAT; ++k) v2 = m1.transpose() * v1;)
112 // std::cout << " a' * v:\t" << timer.value() << endl;
113 // }
114 
115  // GMM++
116  #ifndef NOGMM
117  {
118  std::cout << "GMM++ sparse\t" << density*100 << "%\n";
119  //GmmDynSparse gmmT3(rows,cols);
120  GmmSparse m1(rows,cols);
121  eiToGmm(sm1, m1);
122 
123  std::vector<Scalar> gmmV1(cols), gmmV2(cols);
124  Map<Matrix<Scalar,Dynamic,1> >(&gmmV1[0], cols) = v1;
125  Map<Matrix<Scalar,Dynamic,1> >(&gmmV2[0], cols) = v2;
126 
127  BENCH( asm("#myx"); gmm::mult(m1, gmmV1, gmmV2); asm("#myy"); )
128  std::cout << " a * v:\t" << timer.value() << endl;
129 
130  BENCH( gmm::mult(gmm::transposed(m1), gmmV1, gmmV2); )
131  std::cout << " a' * v:\t" << timer.value() << endl;
132  }
133  #endif
134 
135  #ifndef NOUBLAS
136  {
137  std::cout << "ublas sparse\t" << density*100 << "%\n";
138  UBlasSparse m1(rows,cols);
139  eiToUblas(sm1, m1);
140 
141  boost::numeric::ublas::vector<Scalar> uv1, uv2;
142  eiToUblasVec(v1,uv1);
143  eiToUblasVec(v2,uv2);
144 
145 // std::vector<Scalar> gmmV1(cols), gmmV2(cols);
146 // Map<Matrix<Scalar,Dynamic,1> >(&gmmV1[0], cols) = v1;
147 // Map<Matrix<Scalar,Dynamic,1> >(&gmmV2[0], cols) = v2;
148 
149  BENCH( uv2 = boost::numeric::ublas::prod(m1, uv1); )
150  std::cout << " a * v:\t" << timer.value() << endl;
151 
152 // BENCH( boost::ublas::prod(gmm::transposed(m1), gmmV1, gmmV2); )
153 // std::cout << " a' * v:\t" << timer.value() << endl;
154  }
155  #endif
156 
157  // MTL4
158  #ifndef NOMTL
159  {
160  std::cout << "MTL4\t" << density*100 << "%\n";
161  MtlSparse m1(rows,cols);
162  eiToMtl(sm1, m1);
163  mtl::dense_vector<Scalar> mtlV1(cols, 1.0);
164  mtl::dense_vector<Scalar> mtlV2(cols, 1.0);
165 
166  timer.reset();
167  timer.start();
168  for (int k=0; k<REPEAT; ++k)
169  mtlV2 = m1 * mtlV1;
170  timer.stop();
171  std::cout << " a * v:\t" << timer.value() << endl;
172 
173  timer.reset();
174  timer.start();
175  for (int k=0; k<REPEAT; ++k)
176  mtlV2 = trans(m1) * mtlV1;
177  timer.stop();
178  std::cout << " a' * v:\t" << timer.value() << endl;
179  }
180  #endif
181 
182  std::cout << "\n\n";
183  }
184 
185  return 0;
186 }
187 
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:49
Matrix< Scalar, Dynamic, Dynamic > DenseMatrix
Index cols() const
Definition: SparseMatrix.h:140
#define MINDENSITY
void eiToMtl(const EigenSparseMatrix &src, MtlSparse &dst)
Vector v2
Scalar * b
Definition: benchVecAdd.cpp:17
Vector v1
Index rows() const
Definition: SparseMatrix.h:138
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:94
double value(int TIMER=CPU_TIMER) const
Definition: BenchTimer.h:104
int main(int argc, char *argv[])
#define DENSITY
static char trans
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:48
void eiToUblasVec(const EigenType &src, UblasType &dst)
void fillMatrix2(int nnzPerCol, int rows, int cols, EigenSparseMatrix &dst)
Matrix< Scalar, Dynamic, 1 > DenseVector
#define SIZE
void eiToDense(const EigenSparseMatrix &src, DenseMatrix &dst)
void eiToUblas(const EigenSparseMatrix &src, UBlasSparse &dst)
double best(int TIMER=CPU_TIMER) const
Definition: BenchTimer.h:111
Matrix3d m1
Definition: IOFormat.cpp:2
TransposeReturnType transpose()
mtl::compressed2D< Scalar, mtl::matrix::parameters< mtl::tag::col_major > > MtlSparse
EIGEN_DONT_INLINE void prod(const Lhs &a, const Rhs &b, Res &c)
gmm::csc_matrix< Scalar > GmmSparse
#define REPEAT
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
boost::numeric::ublas::compressed_matrix< Scalar, boost::numeric::ublas::column_major > UBlasSparse
void eiToGmm(const EigenSparseMatrix &src, GmmSparse &dst)
static BenchTimer timer
#define BENCH(X)


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:35:54