1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NOGMM
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NOMTL
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <map>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <ext/hash_map>
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/dense_hash_map>
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <google/sparse_hash_map>
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef SIZE
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define SIZE 10000
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef DENSITY
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define DENSITY 0.01
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef REPEAT
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define REPEAT 1
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "BenchSparseUtil.h"
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef MINDENSITY
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define MINDENSITY 0.0004
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef NBTRIES
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NBTRIES 10
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define BENCH(X) \
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.reset(); \
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int _j=0; _j<NBTRIES; ++_j) { \
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    timer.start(); \
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for (int _k=0; _k<REPEAT; ++_k) { \
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        X  \
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } timer.stop(); }
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic double rtime;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic double nentries;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename SetterType>
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid dostuff(const char* name, EigenSparseMatrix& sm1)
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int rows = sm1.rows();
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int cols = sm1.cols();
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  sm1.setZero();
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  BenchTimer t;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  SetterType* set1 = new SetterType(sm1);
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  t.reset(); t.start();
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int k=0; k<nentries; ++k)
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    (*set1)(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  t.stop();
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::cout << "std::map =>      \t" << t.value()-rtime
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            << " nnz=" << set1->nonZeros() << std::flush;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // getchar();
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  t.reset(); t.start(); delete set1; t.stop();
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::cout << "  back: \t" << t.value() << "\n";
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint main(int argc, char *argv[])
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int rows = SIZE;
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int cols = SIZE;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  float density = DENSITY;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EigenSparseMatrix sm1(rows,cols), sm2(rows,cols);
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  nentries = rows*cols*density;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::cout << "n = " << nentries << "\n";
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int dummy;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  BenchTimer t;
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  t.reset(); t.start();
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (int k=0; k<nentries; ++k)
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dummy = internal::random<int>(0,rows-1) + internal::random<int>(0,cols-1);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  t.stop();
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  rtime = t.value();
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::cout << "rtime = " << rtime << " (" << dummy << ")\n\n";
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const int Bits = 6;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for (;;)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dostuff<RandomSetter<EigenSparseMatrix,StdMapTraits,Bits> >("std::map     ", sm1);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dostuff<RandomSetter<EigenSparseMatrix,GnuHashMapTraits,Bits> >("gnu::hash_map", sm1);
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dostuff<RandomSetter<EigenSparseMatrix,GoogleDenseHashMapTraits,Bits> >("google::dense", sm1);
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dostuff<RandomSetter<EigenSparseMatrix,GoogleSparseHashMapTraits,Bits> >("google::sparse", sm1);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     {
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       RandomSetter<EigenSparseMatrix,GnuHashMapTraits,Bits> set1(sm1);
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.reset(); t.start();
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       for (int k=0; k<n; ++k)
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.stop();
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       std::cout << "gnu::hash_map => \t" << t.value()-rtime
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//                 << " nnz=" << set1.nonZeros() << "\n";getchar();
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     }
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       RandomSetter<EigenSparseMatrix,GoogleDenseHashMapTraits,Bits> set1(sm1);
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.reset(); t.start();
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       for (int k=0; k<n; ++k)
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.stop();
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       std::cout << "google::dense => \t" << t.value()-rtime
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//                 << " nnz=" << set1.nonZeros() << "\n";getchar();
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     }
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     {
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       RandomSetter<EigenSparseMatrix,GoogleSparseHashMapTraits,Bits> set1(sm1);
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.reset(); t.start();
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       for (int k=0; k<n; ++k)
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//         set1(internal::random<int>(0,rows-1),internal::random<int>(0,cols-1)) += 1;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       t.stop();
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       std::cout << "google::sparse => \t" << t.value()-rtime
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//                 << " nnz=" << set1.nonZeros() << "\n";getchar();
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     }
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    std::cout << "\n\n";
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return 0;
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126