Optimized Belief Propagation (CPU and GPU)
RunImpMultInputsBp.cpp
Go to the documentation of this file.
1 /*
2 Copyright (C) 2024 Scott Grauer-Gray
3 
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13 
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18 
27 #include "RunImpOnInputBp.h"
28 #include "RunImpMultInputsBp.h"
29 
30 MultRunData RunImpMultInputsBp::RunEvalImpMultDataSets(
31  const run_environment::RunImpSettings& run_imp_settings,
32  size_t data_type_size) const
33 {
35  return RunEvalImpMultDataSets<run_environment::AccSetting::kCUDA>(run_imp_settings, data_type_size);
36  }
38  return RunEvalImpMultDataSets<run_environment::AccSetting::kAVX512>(run_imp_settings, data_type_size);
39  }
41  return RunEvalImpMultDataSets<run_environment::AccSetting::kAVX512_F16>(run_imp_settings, data_type_size);
42  }
44  return RunEvalImpMultDataSets<run_environment::AccSetting::kAVX256>(run_imp_settings, data_type_size);
45  }
47  return RunEvalImpMultDataSets<run_environment::AccSetting::kAVX256_F16>(run_imp_settings, data_type_size);
48  }
50  return RunEvalImpMultDataSets<run_environment::AccSetting::kNEON>(run_imp_settings, data_type_size);
51  }
52  //else (this->opt_imp_accel_ == run_environment::AccSetting::kNone)
53  return RunEvalImpMultDataSets<run_environment::AccSetting::kNone>(run_imp_settings, data_type_size);
54 }
55 
56 template <run_environment::AccSetting OPT_IMP_ACCEL>
57 MultRunData RunImpMultInputsBp::RunEvalImpMultDataSets(
58  const run_environment::RunImpSettings& run_imp_settings,
59  size_t data_type_size) const
60 {
61  if (data_type_size == sizeof(float)) {
62  return RunEvalImpMultDataSets<float, OPT_IMP_ACCEL>(run_imp_settings);
63  }
64  else if (data_type_size == sizeof(double)) {
65  return RunEvalImpMultDataSets<double, OPT_IMP_ACCEL>(run_imp_settings);
66  }
67  else {
68  //if using x86 CPU that supports AVX vectorization, need to check if using
69  //float16 vectorization data stored as _Float16 if using float16
70  //vectorization and as short if not
71 #if (defined(OPTIMIZED_CPU_RUN) && (!(defined(COMPILING_FOR_ARM))))
72  if constexpr ((OPT_IMP_ACCEL == run_environment::AccSetting::kAVX512) ||
73  (OPT_IMP_ACCEL == run_environment::AccSetting::kAVX256))
74  {
75  return RunEvalImpMultDataSets<short, OPT_IMP_ACCEL>(run_imp_settings);
76  }
77 #if defined(FLOAT16_VECTORIZATION)
78  else if constexpr ((OPT_IMP_ACCEL == run_environment::AccSetting::kAVX512_F16) ||
79  (OPT_IMP_ACCEL == run_environment::AccSetting::kAVX256_F16) ||
80  (OPT_IMP_ACCEL == run_environment::AccSetting::kNone))
81  {
82  std::cout << "FLOAT16 USED" << std::endl;
83  return RunEvalImpMultDataSets<_Float16, OPT_IMP_ACCEL>(run_imp_settings);
84  }
85 #endif //FLOAT16_VECTORIZATION
86 #endif //(defined(OPTIMIZED_CPU_RUN) && (!(defined(COMPILING_FOR_ARM))))
87  return RunEvalImpMultDataSets<halftype, OPT_IMP_ACCEL>(run_imp_settings);
88  }
89 }
90 
91 //run and evaluate optimized bp implementation on evaluation stereo sets
92 template <RunData_t T, run_environment::AccSetting OPT_IMP_ACCEL>
93 MultRunData RunImpMultInputsBp::RunEvalImpMultDataSets(
94  const run_environment::RunImpSettings& run_imp_settings) const
95 {
96  //run and evaluate bp implementation on all stereo sets used for benchmarking
97  std::vector<MultRunData> run_results;
98  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 0>().operator()(run_imp_settings));
99  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 1>().operator()(run_imp_settings));
100  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 2>().operator()(run_imp_settings));
101  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 3>().operator()(run_imp_settings));
102  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 4>().operator()(run_imp_settings));
103 #ifndef SMALLER_SETS_ONLY
104  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 5>().operator()(run_imp_settings));
105  run_results.push_back(RunImpOnInputBp<T, OPT_IMP_ACCEL, 6>().operator()(run_imp_settings));
106 #endif //SMALLER_SETS_ONLY
107 
108  //merge results for each input to overall results
109  MultRunData run_data_all_runs;
110  for (auto& run_result : run_results) {
111  run_data_all_runs.merge(run_result);
112  }
113 
114  return run_data_all_runs;
115 }
std::map< InputSignature, std::optional< std::map< run_environment::ParallelParamsSetting, RunData > >> MultRunData
Alias mapping input signature to run data for each parallel parameters setting Run data is null if r...
Declares child class of RunImpMultInputs to run specified belief propagation implementation on a numb...
const run_environment::AccSetting opt_imp_accel_
Child class of RunImpOnInput to run and evaluate belief propagation implementation on a specified inp...
Structure that stores settings for current implementation run.
Definition: RunSettings.h:84