3 #include <benchmark/benchmark.h>
5 #include "purify/directories.h"
7 #include <sopt/imaging_padmm.h>
8 #include <sopt/mpi/communicator.h>
9 #include <sopt/mpi/session.h>
10 #include <sopt/wavelets.h>
18 void SetUp(const ::benchmark::State &state) {
23 m_imsizex = state.range(0);
24 m_imsizey = state.range(0);
31 m_cellsize = FoV / m_imsizex * 60. * 60.;
35 void TearDown(const ::benchmark::State &state) {}
50 if ((m_counter % 10) == 1) {
51 auto sky_measurements = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
53 state.range(2), state.range(2), m_w_term);
55 while (state.KeepRunning()) {
56 auto start = std::chrono::high_resolution_clock::now();
57 auto sky_measurements = measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
59 state.range(2), state.range(2), m_w_term);
60 auto end = std::chrono::high_resolution_clock::now();
64 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizex * m_imsizey) *
70 if ((m_counter % 10) == 1) {
71 auto sky_measurements = measurementoperator::init_degrid_operator_2d_mpi<Vector<t_complex>>(
73 state.range(2), state.range(2), m_w_term);
75 while (state.KeepRunning()) {
76 auto start = std::chrono::high_resolution_clock::now();
77 auto sky_measurements = measurementoperator::init_degrid_operator_2d_mpi<Vector<t_complex>>(
79 state.range(2), state.range(2), m_w_term);
80 auto end = std::chrono::high_resolution_clock::now();
84 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizex * m_imsizey) *
92 void SetUp(const ::benchmark::State &state) {
101 bool newKernel = m_kernel != state.range(2);
102 if (newImage || newMeasurements || newKernel) {
103 const t_real FoV = 1;
104 const t_real cellsize = FoV / m_imsizex * 60. * 60.;
105 const bool w_term =
false;
106 m_kernel = state.range(2);
107 m_degridOperator = measurementOperator(cellsize, w_term);
115 t_real cellsize,
bool w_term) = 0;
149 t_real cellsize,
bool w_term) {
150 return measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
152 m_kernel, m_kernel, w_term);
159 t_real cellsize,
bool w_term) {
160 return measurementoperator::init_degrid_operator_2d_mpi<Vector<t_complex>>(
162 m_kernel, m_kernel, w_term);
169 t_real cellsize,
bool w_term) {
170 return measurementoperator::init_degrid_operator_2d<Vector<t_complex>>(
172 m_kernel, m_kernel, w_term);
179 t_real cellsize,
bool w_term) {
180 return measurementoperator::init_degrid_operator_2d_mpi<Vector<t_complex>>(
182 m_kernel, m_kernel, w_term);
190 while (state.KeepRunning()) {
191 auto start = std::chrono::high_resolution_clock::now();
192 m_uv_data.vis = (*m_degridOperator) * Image<t_complex>::Map(m_image.data(), m_image.size(), 1);
193 auto end = std::chrono::high_resolution_clock::now();
197 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizey * m_imsizex) *
203 while (state.KeepRunning()) {
204 auto start = std::chrono::high_resolution_clock::now();
205 m_image = m_degridOperator->adjoint() * m_uv_data.vis;
206 auto end = std::chrono::high_resolution_clock::now();
210 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizey * m_imsizex) *
216 while (state.KeepRunning()) {
217 auto start = std::chrono::high_resolution_clock::now();
218 m_uv_data.vis = (*m_degridOperator) * Image<t_complex>::Map(m_image.data(), m_image.size(), 1);
219 auto end = std::chrono::high_resolution_clock::now();
223 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizey * m_imsizex) *
229 while (state.KeepRunning()) {
230 auto start = std::chrono::high_resolution_clock::now();
231 m_image = m_degridOperator->adjoint() * m_uv_data.vis;
232 auto end = std::chrono::high_resolution_clock::now();
236 state.SetBytesProcessed(int64_t(state.iterations()) * (state.range(1) + m_imsizey * m_imsizex) *
262 ->Args({1024,
static_cast<t_int
>(1e6), 4})
263 ->
Args({1024,
static_cast<t_int
>(1e7), 4})
269 ->Unit(benchmark::kMillisecond);
273 ->Args({1024,
static_cast<t_int
>(1e6), 4})
274 ->
Args({1024,
static_cast<t_int
>(1e7), 4})
280 ->Unit(benchmark::kMillisecond);
284 ->Args({1024,
static_cast<t_int
>(1e6), 4})
285 ->
Args({1024,
static_cast<t_int
>(1e7), 4})
291 ->Unit(benchmark::kMillisecond);
295 ->Args({1024,
static_cast<t_int
>(1e6), 4})
296 ->
Args({1024,
static_cast<t_int
>(1e7), 4})
302 ->Unit(benchmark::kMillisecond);
virtual std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > measurementOperator(t_real cellsize, bool w_term)
virtual std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > measurementOperator(t_real cellsize, bool w_term)
Vector< t_complex > m_image
virtual bool updateImage(t_uint newSize)
void SetUp(const ::benchmark::State &state)
sopt::mpi::Communicator m_world
utilities::vis_params m_uv_data
void TearDown(const ::benchmark::State &state)
virtual std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > measurementOperator(t_real cellsize, bool w_term)
virtual std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > measurementOperator(t_real cellsize, bool w_term)
Image< t_complex > m_image
virtual bool updateImage(t_uint newSize)
void TearDown(const ::benchmark::State &state)
sopt::mpi::Communicator m_world
virtual std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > measurementOperator(t_real cellsize, bool w_term)=0
void SetUp(const ::benchmark::State &state)
std::shared_ptr< sopt::LinearTransform< Vector< t_complex > > const > m_degridOperator
utilities::vis_params m_uv_data
virtual bool updateImage(t_uint newSize)=0
Args({1024, static_cast< t_int >(1e6), 4}) -> Args({1024, static_cast< t_int >(1e7), 4}) ->UseManualTime() ->MinTime(10.0) ->MinWarmUpTime(5.0) ->Repetitions(3) ->Unit(benchmark::kMillisecond)
BENCHMARK_DEFINE_F(DegridOperatorCtorFixturePar, Distr)(benchmark
bool updateMeasurements(t_uint newSize, utilities::vis_params &data)
bool updateImage(t_uint newSize, Image< t_complex > &image, t_uint &sizex, t_uint &sizey)
bool updateEmptyImage(t_uint newSize, Vector< t_complex > &image, t_uint &sizex, t_uint &sizey)
double duration(std::chrono::high_resolution_clock::time_point start, std::chrono::high_resolution_clock::time_point end)