Optimized Belief Propagation (CPU and GPU)
RunImpOnInput.h
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 
28 #ifndef RUN_IMP_ON_INPUT_H_
29 #define RUN_IMP_ON_INPUT_H_
30 
31 #include <utility>
32 #include <memory>
33 #include <optional>
34 #include <vector>
35 #include <array>
36 #include <string>
37 #include <set>
43 
52 template<RunData_t T, run_environment::AccSetting OPT_IMP_ACCEL, unsigned int NUM_INPUT>
54 public:
56  const run_environment::RunImpSettings& run_imp_settings) = 0;
57 
58 protected:
65  virtual std::shared_ptr<ParallelParams> SetUpParallelParams(
66  const run_environment::RunImpSettings& run_imp_settings) const = 0;
67 
76  bool loop_iters_templated) const = 0;
77 
88  virtual std::optional<RunData> RunImpsAndCompare(
89  std::shared_ptr<ParallelParams> parallel_params,
90  bool run_opt_imp_only,
91  bool run_imp_templated_loop_iters) const = 0;
92 
99  RunData InputAndParamsRunData(bool loop_iters_templated) const {
100  RunData curr_run_data;
101  curr_run_data.AddDataWHeader(
102  std::string(run_eval::kDatatypeHeader),
103  std::string(run_environment::kDataSizeToNameMap.at(sizeof(T))));
104  curr_run_data.AppendData(run_environment::RunSettings<OPT_IMP_ACCEL>());
105  curr_run_data.AddDataWHeader(
106  std::string(run_eval::kLoopItersTemplatedHeader), loop_iters_templated);
107  return curr_run_data;
108  }
109 
120  MultRunData::mapped_type RunEvalBenchmark(
121  const run_environment::RunImpSettings& run_imp_settings,
122  bool run_w_loop_iters_templated) const
123  {
124  MultRunData::mapped_type::value_type out_run_data;
125  enum class RunType { ONLY_RUN, OPTIMIZED_RUN, TEST_PARAMS };
126 
127  //set up parallel parameters for specific benchmark
128  std::shared_ptr<ParallelParams> parallel_params =
129  SetUpParallelParams(run_imp_settings);
130 
131  //get constant references to default and optimized options
132  //for parallel parameters
133  const auto& [default_p_params, alt_p_params] =
134  run_imp_settings.p_params_default_alt_options;
135 
136  //generate set with default parallel parameters and all
137  //alternate parallel parameter options
138  auto p_param_options = alt_p_params;
139  p_param_options.insert(default_p_params);
140 
141  //if optimizing parallel parameters, run BP for each parallel parameters
142  //option, retrieve best parameters for each kernel or overall for the run,
143  //and then run BP with best found parallel parameters
144  //if not optimizing parallel parameters, run BP once using default parallel
145  //parameters
146  for (auto [p_params_iter, run_num] = std::tuple{p_param_options.cbegin(), 0u};
147  run_num < (p_param_options.size() + 1);
148  p_params_iter++, run_num++)
149  {
150  //initialize current run type to specify if current run is only run,
151  //run with default params, test params run, or final run with optimized
152  //params and get and set parallel parameters for current run if not final
153  //run that uses optimized parameters
154  RunType curr_run_type;
155  if (alt_p_params.size() == 0) {
156  //no alternate parallel parameters to test
157  //so only one run with default parameters
158  curr_run_type = RunType::ONLY_RUN;
159  parallel_params->SetParallelDims(
160  default_p_params);
161  }
162  else if (run_num == p_param_options.size()) {
163  //last run with optimized parallel parameters
164  curr_run_type = RunType::OPTIMIZED_RUN;
165  //optimized parallel parameters are determined from previous evaluation
166  //runs using multiple evaluation parallel parameters
167  parallel_params->SetOptimizedParams();
168  }
169  else {
170  //run with test parallel parameters that will be used to determine
171  //optimized parallel parameters
172  curr_run_type = RunType::TEST_PARAMS;
173  //set parallel parameters to parameters corresponding to current run
174  //for each BP processing level
175  parallel_params->SetParallelDims(*p_params_iter);
176  }
177 
178  //run results are output as part of run evaluation if run is not using
179  //test parallel parameters or is using test parallel parameters that
180  //match default parallel parameters
181  const bool run_results_output{
182  ((curr_run_type != RunType::TEST_PARAMS) ||
183  (*p_params_iter == default_p_params))};
184 
185  //store input params data if current run results are output
186  RunData curr_run_data;
187  if (run_results_output)
188  {
189  //add input and parameters data for specific benchmark to current run
190  //data
191  curr_run_data.AddDataWHeader(
192  std::string(run_eval::kInputIdxHeader),
193  std::to_string(NUM_INPUT));
194  curr_run_data.AppendData(
195  InputAndParamsForCurrBenchmark(run_w_loop_iters_templated));
196  if ((alt_p_params.size() > 0) &&
197  (run_imp_settings.opt_parallel_params_setting ==
200  {
201  //add parallel parameters for each kernel to current input data if
202  //allowing different parallel parameters for each kernel
203  //in the same run
204  curr_run_data.AppendData(parallel_params->AsRunData());
205  }
206  }
207 
208  //run benchmark implementation(s) and return null output if error in run
209  //detailed results stored to file that is generated using stream
210  //only run optimized implementation if run results are not output as part
211  //of evaluation
212  const auto run_imps_results =
214  parallel_params,
215  !run_results_output, //if true, only run optimized implementation
216  run_w_loop_iters_templated);
217 
218  //if error in run and run is type where results are output as part of
219  //evaluation, exit function with null output to indicate error
220  if ((!run_imps_results) && run_results_output) {
221  return {};
222  }
223 
224  //add data results from current run if run successful
225  if (run_imps_results) {
226  curr_run_data.AppendData(*run_imps_results);
227  }
228 
229  if (curr_run_type == RunType::TEST_PARAMS) {
230  //current run using test parallel parameters, so add test results
231  //including runtimes for each kernel to parallel parameters object to
232  //use for computation of optimal parallel parameters
233  //if error in run, don't add results for current parallel parameters to
234  //results set
235  if (run_imps_results) {
236  parallel_params->AddTestResultsForParallelParams(
237  *p_params_iter, curr_run_data);
238  }
239  if (*p_params_iter == default_p_params) {
240  //set output for run with default parallel parameters if current test
241  //params runs is run with default parallel parameters
243  std::move(curr_run_data);
244  }
245  }
246  else if (curr_run_type == RunType::ONLY_RUN) {
247  //if current run is only run due to setting of not optimizing parallel
248  //parameters, set optimized and default parallel parameters output to
249  //current run data, resulting in same run data mapped to default and
250  //optimized parallel parameters enums
252  curr_run_data;
254  std::move(curr_run_data);
255 
256  //exit loop since only running with default parameters and that is done
257  break;
258  }
259  else if (curr_run_type == RunType::OPTIMIZED_RUN) {
260  //set output for final run with optimized parallel parameters
262  std::move(curr_run_data);
263 
264  //exit loop since run with optimized parameters is final run
265  break;
266  }
267  }
268 
269  return out_run_data;
270  }
271 };
272 
273 #endif //RUN_IMP_ON_INPUT_H_
Header for defining aliases for storing run results and evaluating implementations.
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 abstract class for holding and processing parallelization parameters.
Contains namespace with enums and constants for implementation run evaluation.
Declares and defines structure that stores settings for current implementation run as well as functio...
Define constraints for data type in processing.
Class to store headers with data corresponding to current program run and evaluation.
Definition: RunData.h:42
void AppendData(const RunData &rundata)
Append current RunData with input RunData.
Definition: RunData.cpp:99
void AddDataWHeader(const std::string &header, const std::string &data)
Add string data with header describing added data.
Definition: RunData.cpp:49
Virtual class to run and evaluate implementation on a input specified by index number.
Definition: RunImpOnInput.h:53
virtual std::optional< RunData > RunImpsAndCompare(std::shared_ptr< ParallelParams > parallel_params, bool run_opt_imp_only, bool run_imp_templated_loop_iters) const =0
Run one or two implementations of benchmark and compare results if running multiple implementations.
virtual std::shared_ptr< ParallelParams > SetUpParallelParams(const run_environment::RunImpSettings &run_imp_settings) const =0
Set up parallel parameters for benchmark.
virtual RunData InputAndParamsForCurrBenchmark(bool loop_iters_templated) const =0
Retrieve input and parameters for run of current benchmark.
virtual MultRunData operator()(const run_environment::RunImpSettings &run_imp_settings)=0
RunData InputAndParamsRunData(bool loop_iters_templated) const
Get current run inputs and parameters in RunData structure.
Definition: RunImpOnInput.h:99
MultRunData::mapped_type RunEvalBenchmark(const run_environment::RunImpSettings &run_imp_settings, bool run_w_loop_iters_templated) const
Run optimized and single threaded implementations using multiple sets of parallel parameters in optim...
const std::map< std::size_t, std::string_view > kDataSizeToNameMap
Mapping from data size to data type string.
constexpr std::string_view kInputIdxHeader
constexpr std::string_view kDatatypeHeader
constexpr std::string_view kLoopItersTemplatedHeader
Structure that stores settings for current implementation run.
Definition: RunSettings.h:84
std::pair< std::array< unsigned int, 2 >, std::set< std::array< unsigned int, 2 > > > p_params_default_alt_options
Definition: RunSettings.h:89
OptParallelParamsSetting opt_parallel_params_setting
Definition: RunSettings.h:87