PURIFY
Next-generation radio interferometric imaging
wavelet_operator.cc
Go to the documentation of this file.
1 #include <chrono>
2 #include <benchmark/benchmark.h>
3 #include "benchmarks/utilities.h"
5 
6 using namespace purify;
7 
8 // -------------- Constructor benchmark -------------------------//
9 
10 void wavelet_operator_constructor(benchmark::State& state) {
11  // Image size
12  t_uint m_imsizex = state.range(0);
13  t_uint m_imsizey = state.range(0);
14 
15  // benchmark the creation of measurement operator
16  while (state.KeepRunning()) {
17  auto start = std::chrono::high_resolution_clock::now();
18 
19  const sopt::wavelets::SARA m_sara{
20  std::make_tuple("Dirac", 3u), std::make_tuple("DB1", 3u), std::make_tuple("DB2", 3u),
21  std::make_tuple("DB3", 3u), std::make_tuple("DB4", 3u), std::make_tuple("DB5", 3u),
22  std::make_tuple("DB6", 3u), std::make_tuple("DB7", 3u), std::make_tuple("DB8", 3u)};
23 
24  sopt::LinearTransform<Vector<t_complex>> Psi =
25  sopt::linear_transform<t_complex>(m_sara, m_imsizey, m_imsizex);
26 
27  auto end = std::chrono::high_resolution_clock::now();
28 
29  state.SetIterationTime(b_utilities::duration(start, end));
30  }
31 }
32 
34  //->Apply(b_utilities::Arguments)
35  //->Args({1024})
36  ->RangeMultiplier(2)
37  ->Range(1024, 1024 << 10)
38  ->UseManualTime()
39  ->Repetitions(10)
40  ->ReportAggregatesOnly(true)
41  ->Unit(benchmark::kMillisecond);
42 
43 // ----------------- Application benchmarks -----------------------//
44 
45 class WaveletOperatorFixture : public ::benchmark::Fixture {
46  public:
47  void SetUp(const ::benchmark::State& state) {}
48 
49  void TearDown(const ::benchmark::State& state) {}
50 
51  // A bunch of useful variables
52  t_uint m_counter;
53 };
54 
55 class WaveletOperatorAdjointFixture : public ::benchmark::Fixture {
56  public:
57  void SetUp(const ::benchmark::State& state) {}
58 
59  void TearDown(const ::benchmark::State& state) {}
60 
61  // A bunch of useful variables
62  t_uint m_counter;
63 };
64 
65 BENCHMARK_DEFINE_F(WaveletOperatorFixture, Apply)(benchmark::State& state) {
66  t_uint m_imsizex = state.range(0);
67  t_uint m_imsizey = state.range(0);
68  sopt::wavelets::SARA m_sara{
69  std::make_tuple("Dirac", 3u), std::make_tuple("DB1", 3u), std::make_tuple("DB2", 3u),
70  std::make_tuple("DB3", 3u), std::make_tuple("DB4", 3u), std::make_tuple("DB5", 3u),
71  std::make_tuple("DB6", 3u), std::make_tuple("DB7", 3u), std::make_tuple("DB8", 3u)};
72 
73  sopt::LinearTransform<Vector<t_complex>> m_Psi =
74  sopt::linear_transform<t_complex>(m_sara, m_imsizey, m_imsizex);
75 
76  // Get the number of wavelet coefs
77  t_uint const n_wave_coeff = m_sara.size() * m_imsizex * m_imsizey;
78 
79  // Apply Psi to a temporary vector
80  Vector<t_complex> temp;
81  Vector<t_complex> const x = Vector<t_complex>::Random(n_wave_coeff);
82 
83  while (state.KeepRunning()) {
84  auto start = std::chrono::high_resolution_clock::now();
85  temp = m_Psi * x;
86  auto end = std::chrono::high_resolution_clock::now();
87  state.SetIterationTime(b_utilities::duration(start, end));
88  }
89 }
90 
91 BENCHMARK_DEFINE_F(WaveletOperatorAdjointFixture, Apply)(benchmark::State& state) {
92  t_uint m_imsizex = state.range(0);
93  t_uint m_imsizey = state.range(0);
94  sopt::wavelets::SARA m_sara{
95  std::make_tuple("Dirac", 3u), std::make_tuple("DB1", 3u), std::make_tuple("DB2", 3u),
96  std::make_tuple("DB3", 3u), std::make_tuple("DB4", 3u), std::make_tuple("DB5", 3u),
97  std::make_tuple("DB6", 3u), std::make_tuple("DB7", 3u), std::make_tuple("DB8", 3u)};
98 
99  sopt::LinearTransform<Vector<t_complex>> m_Psi =
100  sopt::linear_transform<t_complex>(m_sara, m_imsizey, m_imsizex);
101 
102  // Get the number of wavelet coefs
103  t_uint const n_wave_coeff = m_sara.size() * m_imsizex * m_imsizey;
104 
105  // Apply Psi to a temporary vector
106  Vector<t_complex> temp;
107  Vector<t_complex> const x = Vector<t_complex>::Random(m_imsizex * m_imsizey);
108 
109  while (state.KeepRunning()) {
110  auto start = std::chrono::high_resolution_clock::now();
111  temp = m_Psi.adjoint() * x;
112  auto end = std::chrono::high_resolution_clock::now();
113  state.SetIterationTime(b_utilities::duration(start, end));
114  }
115 }
116 
117 BENCHMARK_REGISTER_F(WaveletOperatorFixture, Apply)
118  //->Apply(b_utilities::Arguments)
119  ->RangeMultiplier(2)
120  ->Range(1024, 1024 << 10)
121  ->UseManualTime()
122  ->Repetitions(10)
123  ->ReportAggregatesOnly(true)
124  ->Unit(benchmark::kMillisecond);
125 
126 BENCHMARK_REGISTER_F(WaveletOperatorAdjointFixture, Apply)
127  //->Apply(b_utilities::Arguments)
128  ->RangeMultiplier(2)
129  ->Range(1024, 1024 << 10)
130  ->UseManualTime()
131  ->Repetitions(10)
132  ->ReportAggregatesOnly(true)
133  ->Unit(benchmark::kMillisecond);
134 
void TearDown(const ::benchmark::State &state)
void SetUp(const ::benchmark::State &state)
void SetUp(const ::benchmark::State &state)
void TearDown(const ::benchmark::State &state)
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)
Definition: utilities.cc:26
void wavelet_operator_constructor(benchmark::State &state)
BENCHMARK_DEFINE_F(WaveletOperatorFixture, Apply)(benchmark
BENCHMARK_MAIN()