spmv.cpp File Reference
#include <iostream>
#include <algorithm>
#include "BenchTimer.h"
#include "BenchSparseUtil.h"

Macros

#define SCALAR   double
 
#define SPMV_BENCH(CODE)   BENCH(t, tries, repeats, CODE);
 

Functions

int main (int argc, char *argv[])
 

Macro Definition Documentation

◆ SCALAR

#define SCALAR   double

◆ SPMV_BENCH

#define SPMV_BENCH (   CODE)    BENCH(t, tries, repeats, CODE);

Function Documentation

◆ main()

int main ( int argc  ,
char argv[] 
)
39  {
40  int size = 10000;
41  int rows = size;
42  int cols = size;
43  int nnzPerCol = 40;
44  int tries = 2;
45  int repeats = 2;
46 
47  bool need_help = false;
48  for (int i = 1; i < argc; i++) {
49  if (argv[i][0] == 'r') {
50  rows = atoi(argv[i] + 1);
51  } else if (argv[i][0] == 'c') {
52  cols = atoi(argv[i] + 1);
53  } else if (argv[i][0] == 'n') {
54  nnzPerCol = atoi(argv[i] + 1);
55  } else if (argv[i][0] == 't') {
56  tries = atoi(argv[i] + 1);
57  } else if (argv[i][0] == 'p') {
58  repeats = atoi(argv[i] + 1);
59  } else {
60  need_help = true;
61  }
62  }
63  if (need_help) {
64  std::cout << argv[0] << " r<nb rows> c<nb columns> n<non zeros per column> t<nb tries> p<nb repeats>\n";
65  return 1;
66  }
67 
68  std::cout << "SpMV " << rows << " x " << cols << " with " << nnzPerCol << " non zeros per column. (" << repeats
69  << " repeats, and " << tries << " tries)\n\n";
70 
72  DenseVector dv(cols), res(rows);
73  dv.setRandom();
74 
75  BenchTimer t;
76  while (nnzPerCol >= 4) {
77  std::cout << "nnz: " << nnzPerCol << "\n";
78  sm.setZero();
79  fillMatrix2(nnzPerCol, rows, cols, sm);
80 
81 // dense matrices
82 #ifdef DENSEMATRIX
83  {
84  DenseMatrix dm(rows, cols), (rows, cols);
85  eiToDense(sm, dm);
86 
87  SPMV_BENCH(res = dm * sm);
88  std::cout << "Dense " << t.value() / repeats << "\t";
89 
90  SPMV_BENCH(res = dm.transpose() * sm);
91  std::cout << t.value() / repeats << endl;
92  }
93 #endif
94 
95  // eigen sparse matrices
96  {
97  SPMV_BENCH(res.noalias() += sm * dv;)
98  std::cout << "Eigen " << t.value() / repeats << "\t";
99 
100  SPMV_BENCH(res.noalias() += sm.transpose() * dv;)
101  std::cout << t.value() / repeats << endl;
102  }
103 
104 // CSparse
105 #ifdef CSPARSE
106  {
107  std::cout << "CSparse \n";
108  cs *csm;
109  eiToCSparse(sm, csm);
110 
111  // BENCH();
112  // timer.stop();
113  // std::cout << " a * b:\t" << timer.value() << endl;
114 
115  // BENCH( { m3 = cs_sorted_multiply2(m1, m2); cs_spfree(m3); } );
116  // std::cout << " a * b:\t" << timer.value() << endl;
117  }
118 #endif
119 
120 #ifdef OSKI
121  {
122  oski_matrix_t om;
123  oski_vecview_t ov, ores;
124  oski_Init();
125  om = oski_CreateMatCSC(sm._outerIndexPtr(), sm._innerIndexPtr(), sm._valuePtr(), rows, cols, SHARE_INPUTMAT, 1,
126  INDEX_ZERO_BASED);
127  ov = oski_CreateVecView(dv.data(), cols, STRIDE_UNIT);
128  ores = oski_CreateVecView(res.data(), rows, STRIDE_UNIT);
129 
130  SPMV_BENCH(oski_MatMult(om, OP_NORMAL, 1, ov, 0, ores));
131  std::cout << "OSKI " << t.value() / repeats << "\t";
132 
133  SPMV_BENCH(oski_MatMult(om, OP_TRANS, 1, ov, 0, ores));
134  std::cout << t.value() / repeats << "\n";
135 
136  // tune
137  t.reset();
138  t.start();
139  oski_SetHintMatMult(om, OP_NORMAL, 1.0, SYMBOLIC_VEC, 0.0, SYMBOLIC_VEC, ALWAYS_TUNE_AGGRESSIVELY);
140  oski_TuneMat(om);
141  t.stop();
142  double tuning = t.value();
143 
144  SPMV_BENCH(oski_MatMult(om, OP_NORMAL, 1, ov, 0, ores));
145  std::cout << "OSKI tuned " << t.value() / repeats << "\t";
146 
147  SPMV_BENCH(oski_MatMult(om, OP_TRANS, 1, ov, 0, ores));
148  std::cout << t.value() / repeats << "\t(" << tuning << ")\n";
149 
150  oski_DestroyMat(om);
151  oski_DestroyVecView(ov);
152  oski_DestroyVecView(ores);
153  oski_Close();
154  }
155 #endif
156 
157 #ifndef NOUBLAS
158  {
159  using namespace boost::numeric;
160  UblasMatrix um(rows, cols);
161  eiToUblas(sm, um);
162 
163  boost::numeric::ublas::vector<Scalar> uv(cols), ures(rows);
164  Map<Matrix<Scalar, Dynamic, 1> >(&uv[0], cols) = dv;
165  Map<Matrix<Scalar, Dynamic, 1> >(&ures[0], rows) = res;
166 
167  SPMV_BENCH(ublas::axpy_prod(um, uv, ures, true));
168  std::cout << "ublas " << t.value() / repeats << "\t";
169 
170  SPMV_BENCH(ublas::axpy_prod(boost::numeric::ublas::trans(um), uv, ures, true));
171  std::cout << t.value() / repeats << endl;
172  }
173 #endif
174 
175 // GMM++
176 #ifndef NOGMM
177  {
178  GmmSparse gm(rows, cols);
179  eiToGmm(sm, gm);
180 
181  std::vector<Scalar> gv(cols), gres(rows);
182  Map<Matrix<Scalar, Dynamic, 1> >(&gv[0], cols) = dv;
183  Map<Matrix<Scalar, Dynamic, 1> >(&gres[0], rows) = res;
184 
185  SPMV_BENCH(gmm::mult(gm, gv, gres));
186  std::cout << "GMM++ " << t.value() / repeats << "\t";
187 
188  SPMV_BENCH(gmm::mult(gmm::transposed(gm), gv, gres));
189  std::cout << t.value() / repeats << endl;
190  }
191 #endif
192 
193 // MTL4
194 #ifndef NOMTL
195  {
196  MtlSparse mm(rows, cols);
197  eiToMtl(sm, mm);
198  mtl::dense_vector<Scalar> mv(cols, 1.0);
199  mtl::dense_vector<Scalar> mres(rows, 1.0);
200 
201  SPMV_BENCH(mres = mm * mv);
202  std::cout << "MTL4 " << t.value() / repeats << "\t";
203 
204  SPMV_BENCH(mres = trans(mm) * mv);
205  std::cout << t.value() / repeats << endl;
206  }
207 #endif
208 
209  std::cout << "\n";
210 
211  if (nnzPerCol == 1) break;
212  nnzPerCol -= nnzPerCol / 2;
213  }
214 
215  return 0;
216 }
void eiToGmm(const EigenSparseMatrix &src, GmmSparse &dst)
Definition: BenchSparseUtil.h:64
void eiToDense(const EigenSparseMatrix &src, DenseMatrix &dst)
Definition: BenchSparseUtil.h:54
mtl::compressed2D< Scalar, mtl::matrix::parameters< mtl::tag::col_major > > MtlSparse
Definition: BenchSparseUtil.h:74
void fillMatrix2(int nnzPerCol, int rows, int cols, EigenSparseMatrix &dst)
Definition: BenchSparseUtil.h:38
gmm::csc_matrix< Scalar > GmmSparse
Definition: BenchSparseUtil.h:62
void eiToMtl(const EigenSparseMatrix &src, MtlSparse &dst)
Definition: BenchSparseUtil.h:76
void eiToUblas(const EigenSparseMatrix &src, UBlasSparse &dst)
Definition: BenchSparseUtil.h:112
int i
Definition: BiCGSTAB_step_by_step.cpp:9
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Definition: BenchTimer.h:55
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
char * trans
Definition: level2_impl.h:240
t
Definition: plotPSD.py:36
#define SPMV_BENCH(CODE)
Definition: spmv.cpp:13

References cols, eiToDense(), eiToGmm(), eiToMtl(), eiToUblas(), fillMatrix2(), i, res, rows, Eigen::SparseMatrix< Scalar_, Options_, StorageIndex_ >::setZero(), size, SPMV_BENCH, plotPSD::t, trans, and Eigen::SparseMatrixBase< Derived >::transpose().