PURIFY
Next-generation radio interferometric imaging
degridding.cc
Go to the documentation of this file.
1 #include <chrono>
2 #include <benchmark/benchmark.h>
3 #include "benchmarks/utilities.h"
4 #include "purify/operators.h"
5 
6 using namespace purify;
7 
8 // ----------------- Application benchmarks -----------------------//
9 
10 class GridOperatorFixture : public ::benchmark::Fixture {
11  public:
12  void SetUp(const ::benchmark::State& state) {
13  const t_uint Ju = 4;
14  const t_uint Jv = 4;
15  const t_real oversample_ratio = 2;
16  std::function<t_real(t_real)> kernelu, kernelv, ftkernelu, ftkernelv;
17  std::tie(kernelu, kernelv, ftkernelu, ftkernelv) =
18  purify::create_kernels(kernels::kernel::kb, Ju, Jv, m_imsizey, m_imsizey, oversample_ratio);
19  t_real const sigma_m = constant::pi / 3;
20  if (M != state.range(0)) {
21  M = state.range(0);
22  auto uv_vis = utilities::random_sample_density(M, 0, sigma_m, 0.);
23  uv_vis.units = utilities::vis_units::radians;
24  Gop = purify::operators::init_on_the_fly_gridding_matrix_2d<Vector<t_complex>>(
25  uv_vis.u, uv_vis.v, uv_vis.weights, m_imsizey, m_imsizex, oversample_ratio, kernelu, Ju,
26  4e5);
27  }
28  }
29 
30  void TearDown(const ::benchmark::State& state) {}
31 
32  // A bunch of useful variables
33  t_uint m_counter;
34  t_uint M;
35  t_uint m_imsizey = 1024;
36  t_uint m_imsizex = 1024;
37  std::tuple<sopt::OperatorFunction<Vector<t_complex>>, sopt::OperatorFunction<Vector<t_complex>>>
38  Gop;
39 };
40 
41 BENCHMARK_DEFINE_F(GridOperatorFixture, Apply)(benchmark::State& state) {
42  const t_real oversample_ratio = 2;
43  const t_uint N = m_imsizex * m_imsizey * oversample_ratio * oversample_ratio;
44  const auto& forward = std::get<0>(Gop);
45 
46  const Vector<t_complex> input = Vector<t_complex>::Random(N);
47  Vector<t_complex> output = Vector<t_complex>::Zero(M);
48  forward(output, input);
49  while (state.KeepRunning()) {
50  auto start = std::chrono::high_resolution_clock::now();
51  forward(output, input);
52  auto end = std::chrono::high_resolution_clock::now();
53  state.SetIterationTime(b_utilities::duration(start, end));
54  }
55 }
56 
57 BENCHMARK_DEFINE_F(GridOperatorFixture, ApplyAdjoint)(benchmark::State& state) {
58  const t_real oversample_ratio = 2;
59  const t_uint N = m_imsizex * m_imsizey * oversample_ratio * oversample_ratio;
60  const auto& backward = std::get<1>(Gop);
61 
62  const Vector<t_complex> input = Vector<t_complex>::Random(M);
63  Vector<t_complex> output = Vector<t_complex>::Zero(N);
64  backward(output, input);
65  while (state.KeepRunning()) {
66  auto start = std::chrono::high_resolution_clock::now();
67  backward(output, input);
68  auto end = std::chrono::high_resolution_clock::now();
69  state.SetIterationTime(b_utilities::duration(start, end));
70  }
71 }
72 BENCHMARK_REGISTER_F(GridOperatorFixture, Apply)
73  //->Apply(b_utilities::Arguments)
74  ->RangeMultiplier(2)
75  ->Range(100000, 100000 << 11)
76  ->UseManualTime()
77  ->Repetitions(10)
78  ->ReportAggregatesOnly(true)
79  ->Unit(benchmark::kMillisecond);
80 
81 BENCHMARK_REGISTER_F(GridOperatorFixture, ApplyAdjoint)
82  //->Apply(b_utilities::Arguments)
83  ->RangeMultiplier(2)
84  ->Range(100000, 100000 << 11)
85  ->UseManualTime()
86  ->Repetitions(10)
87  ->ReportAggregatesOnly(true)
88  ->Unit(benchmark::kMillisecond);
89 
void TearDown(const ::benchmark::State &state)
Definition: degridding.cc:30
void SetUp(const ::benchmark::State &state)
Definition: degridding.cc:12
std::tuple< sopt::OperatorFunction< Vector< t_complex > >, sopt::OperatorFunction< Vector< t_complex > > > Gop
Definition: degridding.cc:38
BENCHMARK_DEFINE_F(GridOperatorFixture, Apply)(benchmark
Definition: degridding.cc:41
BENCHMARK_MAIN()
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)
Definition: utilities.cc:26
const t_real pi
mathematical constant
Definition: types.h:70
utilities::vis_params random_sample_density(const t_int vis_num, const t_real mean, const t_real standard_deviation, const t_real rms_w)
Generates a random visibility coverage.
std::tuple< std::function< t_real(t_real)>, std::function< t_real(t_real)>, std::function< t_real(t_real)>, std::function< t_real(t_real)> > create_kernels(const kernels::kernel kernel_name_, const t_uint Ju_, const t_uint Jv_, const t_real imsizey_, const t_real imsizex_, const t_real oversample_ratio)
Definition: kernels.cc:249