SourceXtractorPlusPlus 0.21
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
BenchBackgroundConvolution.cpp
Go to the documentation of this file.
1
24#include <map>
25#include <string>
26
27#include <boost/program_options.hpp>
28#include <boost/timer/timer.hpp>
29#include <random>
30#include "ElementsKernel/ProgramHeaders.h"
31#include "ElementsKernel/Real.h"
35#include "SEUtils/IsClose.h"
36
37#if BOOST_VERSION < 105600
38#include <boost/units/detail/utility.hpp>
39using boost::units::detail::demangle;
40#else
41using boost::core::demangle;
42#endif
43
44namespace po = boost::program_options;
45namespace timer = boost::timer;
46using namespace SourceXtractor;
47
48static Elements::Logging logger = Elements::Logging::getLogger("BenchBackgroundConvolution");
49
51private:
54
55public:
56
57 po::options_description defineSpecificProgramOptions() override {
58 po::options_description options{};
59 options.add_options()
60 ("image-start", po::value<int>()->default_value(100), "Image start size")
61 ("image-step-size", po::value<int>()->default_value(3), "Image step size")
62 ("image-nsteps", po::value<int>()->default_value(1), "Number of steps for the image")
63 ("kernel-start", po::value<int>()->default_value(3), "Kernel start size")
64 ("kernel-step-size", po::value<int>()->default_value(4), "Kernel step size")
65 ("kernel-nsteps", po::value<int>()->default_value(2), "Number of steps for the kernel")
66 ("repeat", po::value<int>()->default_value(5), "Repeat")
67 ("measures", po::value<int>()->default_value(10), "Number of measures");
68 return options;
69 }
70
72 auto img = VectorImage<SeFloat>::create(size, size);
73 for (int x = 0; x < size; ++x) {
74 for (int y = 0; y < size; ++y) {
75 img->setValue(x, y, random_dist(random_generator));
76 }
77 }
78 return img;
79 }
80
82
83 auto img_start = args["image-start"].as<int>();
84 auto img_step_size = args["image-step-size"].as<int>();
85 auto img_nsteps = args["image-nsteps"].as<int>();
86 auto krn_start = args["kernel-start"].as<int>();
87 auto krn_step_size = args["kernel-step-size"].as<int>();
88 auto krn_nsteps = args["kernel-nsteps"].as<int>();
89 auto repeat = args["repeat"].as<int>();
90 auto measures = args["measures"].as<int>();
91
92 std::cout << "Image,Kernel,Implementation,Time" << std::endl;
93
94 for (int img_step = 0; img_step < img_nsteps; ++img_step) {
98
99 for (int krn_step = 0; krn_step < krn_nsteps; ++krn_step) {
101
102 logger.info() << "Using an image of " << img_size << "x" << img_size;
103 logger.info() << "Using a kernel of " << krn_size << "x" << krn_size;
104
106
107 logger.info() << "Timing Direct implementation";
109
110 logger.info() << "Timing DFT implementation";
112
113 logger.info() << "Comparing results";
115 }
116 }
117
119 }
120
121 template<typename BackgroundConvolution>
125 auto conv_name = demangle(typeid(BackgroundConvolution).name());
126
128
130
131 for (int m = 0; m < measures; ++m) {
132 logger.info() << conv_name << " " << m + 1 << "/" << measures;
133 timer::cpu_timer timer;
134 timer.stop();
135
136 for (int r = 0; r < repeat; ++r) {
137 timer.start();
139 bg_convolution->getImageTile(0, 0, image->getWidth(), image->getHeight()));
140 auto result = tile->getImage();
141 timer.stop();
142 }
143
144 std::cout << image->getWidth() << ',' << kernel->getWidth() << ",\"" << conv_name << "\"," << timer.elapsed().wall
145 << std::endl;
146 }
147
148 return result;
149 }
150
152 bool all_equal = true;
153 for (int x = 0; x < a->getWidth(); ++x) {
154 for (int y = 0; y < a->getHeight(); ++y) {
155 auto av = a->getValue(x, y);
156 auto bv = b->getValue(x, y);
157 if (!isClose(av, bv, 1e-3, 1e-3)) {
158 logger.info() << "Mismatch at " << x << ',' << y << ": "
159 << av << " != " << bv;
160 all_equal = false;
161 }
162 }
163 }
164 if (all_equal) {
165 logger.info() << "All elements are equal!";
166 } else {
167 logger.warn() << "Convoluted images are not equal!";
168 }
169 }
170};
171
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
po::options_description defineSpecificProgramOptions() override
std::shared_ptr< VectorImage< SeFloat > > benchmark(std::shared_ptr< VectorImage< SeFloat > > &image, std::shared_ptr< VectorImage< SeFloat > > &variance, std::shared_ptr< VectorImage< SeFloat > > &kernel, int repeat, int measures)
std::shared_ptr< VectorImage< SeFloat > > generateImage(int size)
Elements::ExitCode mainMethod(std::map< std::string, po::variable_value > &args) override
std::default_random_engine random_generator
std::uniform_real_distribution< SeFloat > random_dist
void verifyResults(std::shared_ptr< VectorImage< SeFloat > > a, std::shared_ptr< VectorImage< SeFloat > > b)
static Logging getLogger(const std::string &name="")
static std::shared_ptr< VectorImage< T > > create(Args &&... args)
T endl(T... args)
#define MAIN_FOR(ELEMENTS_PROGRAM_NAME)
static Elements::Logging logger
bool isClose(double a, double b, double atol=1e-8, double rtol=1e-5)
Definition IsClose.h:28