27 #include <boost/program_options.hpp> 28 #include <boost/timer/timer.hpp> 37 #if BOOST_VERSION < 105600 38 #include <boost/units/detail/utility.hpp> 39 using boost::units::detail::demangle;
41 using boost::core::demangle;
44 namespace po = boost::program_options;
45 namespace timer = boost::timer;
58 po::options_description 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");
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));
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>();
94 for (
int img_step = 0; img_step < img_nsteps; ++img_step) {
95 auto img_size = img_start + img_step * img_step_size;
96 auto image = generateImage(img_size);
97 auto variance = generateImage(img_size);
99 for (
int krn_step = 0; krn_step < krn_nsteps; ++krn_step) {
100 auto krn_size = krn_start + krn_step * krn_step_size;
102 logger.
info() <<
"Using an image of " << img_size <<
"x" << img_size;
103 logger.
info() <<
"Using a kernel of " << krn_size <<
"x" << krn_size;
105 auto kernel = generateImage(krn_size);
107 logger.
info() <<
"Timing Direct implementation";
108 auto direct_result = benchmark<BgConvolutionImageSource>(image, variance, kernel, repeat, measures);
111 auto dft_result = benchmark<BgDFTConvolutionImageSource>(image, variance, kernel, repeat, measures);
114 verifyResults(direct_result, dft_result);
121 template<
typename BackgroundConvolution>
127 auto bg_convolution = std::make_shared<BackgroundConvolution>(image, variance, 0.5, kernel);
131 for (
int m = 0;
m < measures; ++
m) {
132 logger.
info() << conv_name <<
" " <<
m + 1 <<
"/" << measures;
133 timer::cpu_timer timer;
136 for (
int r = 0; r < repeat; ++r) {
138 result = bg_convolution->getImageTile(0, 0, image->getWidth(), image->getHeight())->getImage();
142 std::cout << image->getWidth() <<
',' << kernel->getWidth() <<
",\"" << conv_name <<
"\"," << timer.elapsed().wall
150 bool all_equal =
true;
151 for (
int x = 0;
x < a->getWidth(); ++
x) {
152 for (
int y = 0;
y < a->getHeight(); ++
y) {
153 auto av = a->getValue(
x,
y);
154 auto bv = b->getValue(
x,
y);
156 logger.
info() <<
"Mismatch at " <<
x <<
',' <<
y <<
": " 157 << av <<
" != " << bv;
165 logger.
warn() <<
"Convoluted images are not equal!";
std::default_random_engine random_generator
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
void info(const std::string &logMessage)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
void verifyResults(std::shared_ptr< VectorImage< SeFloat >> a, std::shared_ptr< VectorImage< SeFloat >> b)
#define MAIN_FOR(ELEMENTS_PROGRAM_NAME)
void warn(const std::string &logMessage)
std::shared_ptr< VectorImage< SeFloat > > generateImage(int size)
Elements::ExitCode mainMethod(std::map< std::string, po::variable_value > &args) override
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)
static Logging getLogger(const std::string &name="")