PURIFY
Next-generation radio interferometric imaging
measurement_operator_wproj.cc
Go to the documentation of this file.
1 #include <chrono>
2 #include <sstream>
3 #include <benchmark/benchmark.h>
4 #include "benchmarks/utilities.h"
5 #include "purify/directories.h"
6 #include "purify/operators.h"
9 #include <sopt/imaging_padmm.h>
10 #include <sopt/mpi/communicator.h>
11 #include <sopt/mpi/session.h>
12 #include <sopt/wavelets.h>
13 
14 using namespace purify;
15 
16 // ----------------- Degrid operator constructor fixture -----------------------//
17 
18 class DegridOperatorCtorFixturePar : public ::benchmark::Fixture {
19  public:
20  void SetUp(const ::benchmark::State &state) {
21  // Keep count of the benchmark repetitions
22  m_counter++;
23  // Data needed for the creation of the measurement operator
24  const t_real FoV = 25; // deg
25  m_cellsize = FoV / m_imsizex * 60. * 60.;
26  m_w_term = true;
27 
28  m_imsizex = state.range(0);
29  m_imsizey = state.range(0);
30 
31  // Generating random uv(w) coverage
32  b_utilities::update_comm(m_world);
33  t_real const sigma_m = constant::pi / 3;
34  const t_real du = widefield::pixel_to_lambda(m_cellsize, m_imsizex, 2);
35  const t_real max_w = 300.; // lambda
36  auto const uv_data = b_utilities::random_measurements(state.range(1), max_w, m_world.rank());
37  const auto cost = [](t_real x) -> t_real { return std::abs(x * x); };
38  m_uv_data = utilities::w_stacking(uv_data, m_world, 100, cost);
39  std::tie(m_uv_data_all_to_all, m_image_index, m_w_stacks) =
40  utilities::w_stacking_with_all_to_all(uv_data, du, 4, 100, m_world, 100, 1.01, cost);
41  }
42 
43  void TearDown(const ::benchmark::State &state) {}
44 
45  t_uint m_counter;
46  sopt::mpi::Communicator m_world;
47  t_uint m_imsizex;
48  t_uint m_imsizey;
49  utilities::vis_params m_uv_data;
51  std::vector<t_real> m_w_stacks;
52  std::vector<t_int> m_image_index;
53  t_real m_cellsize;
54  bool m_w_term;
55 };
56 
57 // -------------- Constructor benchmarks -------------------------//
58 
59 BENCHMARK_DEFINE_F(DegridOperatorCtorFixturePar, Distr)(benchmark::State &state) {
60  // benchmark the creation of the distributed measurement operator
61  if ((m_counter % 10) == 1) {
62  auto sky_measurements = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
63  m_world, m_uv_data, m_imsizey, m_imsizex, m_cellsize, m_cellsize, 2, kernels::kernel::kb,
64  state.range(2), 100, m_w_term, 1e-6, 1e-6, dde_type::wkernel_radial);
65  }
66  while (state.KeepRunning()) {
67  auto start = std::chrono::high_resolution_clock::now();
68  auto sky_measurements = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
69  m_world, m_uv_data, m_imsizey, m_imsizex, m_cellsize, m_cellsize, 2, kernels::kernel::kb,
70  state.range(2), 100, m_w_term, 1e-6, 1e-6, dde_type::wkernel_radial);
71  auto end = std::chrono::high_resolution_clock::now();
72  state.SetIterationTime(b_utilities::duration(start, end, m_world));
73  }
74 
75  state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizex * m_imsizey) *
76  sizeof(t_complex));
77 }
78 
79 BENCHMARK_DEFINE_F(DegridOperatorCtorFixturePar, MPI)(benchmark::State &state) {
80  // benchmark the creation of the distributed MPI measurement operator
81  if ((m_counter % 10) == 1) {
82  auto sky_measurements =
83  measurementoperator::init_degrid_operator_2d_all_to_all<Vector<t_complex>>(
84  m_world, m_image_index, m_w_stacks, m_uv_data_all_to_all, m_imsizey, m_imsizex,
85  m_cellsize, m_cellsize, 2, kernels::kernel::kb, state.range(2), 100, m_w_term, 1e-6,
87  }
88  while (state.KeepRunning()) {
89  auto start = std::chrono::high_resolution_clock::now();
90  auto sky_measurements =
91  measurementoperator::init_degrid_operator_2d_all_to_all<Vector<t_complex>>(
92  m_world, m_image_index, m_w_stacks, m_uv_data_all_to_all, m_imsizey, m_imsizex,
93  m_cellsize, m_cellsize, 2, kernels::kernel::kb, state.range(2), 100, m_w_term, 1e-6,
95  auto end = std::chrono::high_resolution_clock::now();
96  state.SetIterationTime(b_utilities::duration(start, end, m_world));
97  }
98 
99  state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizex * m_imsizey) *
100  sizeof(t_complex));
101 }
102 
103 // -------------- Register benchmarks -------------------------//
104 
105 BENCHMARK_REGISTER_F(DegridOperatorCtorFixturePar, Distr)
106  //->Apply(b_utilities::Arguments)
107  ->Args({64, 1000, 4})
108  // ->Args({1024, 10000, 4})
109  ->UseManualTime()
110  ->Repetitions(10)
111  //->ReportAggregatesOnly(true)
112  ->Unit(benchmark::kMillisecond);
113 
114 BENCHMARK_REGISTER_F(DegridOperatorCtorFixturePar, MPI)
115  //->Apply(b_utilities::Arguments)
116  ->Args({64, 1000, 4})
117  // ->Args({1024, 10000, 4})
118  ->UseManualTime()
119  ->Repetitions(10)
120  //->ReportAggregatesOnly(true)
121  ->Unit(benchmark::kMillisecond);
void SetUp(const ::benchmark::State &state)
void TearDown(const ::benchmark::State &state)
BENCHMARK_DEFINE_F(DegridOperatorCtorFixturePar, Distr)(benchmark
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)
Definition: utilities.cc:26
utilities::vis_params random_measurements(t_int size, const t_real max_w, const t_int id, const bool cache_visibilities)
Definition: utilities.cc:96
const t_real pi
mathematical constant
Definition: types.h:70
utilities::vis_params w_stacking(utilities::vis_params const &params, sopt::mpi::Communicator const &comm, const t_int iters, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
std::tuple< utilities::vis_params, std::vector< t_int >, std::vector< t_real > > w_stacking_with_all_to_all(utilities::vis_params const &params, const t_real du, const t_int min_support, const t_int max_support, sopt::mpi::Communicator const &comm, const t_int iters, const t_real fill_relaxation, const std::function< t_real(t_real)> &cost, const t_real k_means_rel_diff)
t_real pixel_to_lambda(const t_real cell, const t_uint imsize, const t_real oversample_ratio)
return factors to convert between arcsecond pixel size image space and lambda for uv space