55 RCP<ParameterList> topValidParamList = rcp(
new ParameterList());
56 ParameterList validParamList;
58 ParameterList pl_dummy;
59 Teuchos::Array<std::string> ar_dummy;
63 validParamList.set<Teuchos::Array<std::string>>(
"input variables", ar_dummy,
"Names of the input variables for Kokkos tuning");
65 validParamList.set<
size_t>(
"kokkos context id", Teuchos::OrdinalTraits<size_t>::invalid(),
"Context ID for Kokkos tuning");
68 std::ostringstream oss;
70 const std::string name = oss.str();
73 validParamList.set<Teuchos::ParameterList>(name, pl_dummy,
"Parameter-specific sublist");
76 topValidParamList->set<Teuchos::ParameterList>(
"kokkos tuning: muelu parameter mapping", validParamList,
"Sublist for Kokkos tuning of MueLu");
78 return topValidParamList;
92 const Teuchos::ParameterList& pL =
params_.get<Teuchos::ParameterList>(
"kokkos tuning: muelu parameter mapping");
93 namespace KTE = Kokkos::Tools::Experimental;
102 std::ostringstream oss;
104 const std::string name = oss.str();
106 if (pL.isSublist(name)) {
107 const Teuchos::ParameterList& sublist = pL.sublist(name);
108 std::string muelu_param = sublist.get<std::string>(
"muelu parameter");
111 if (sublist.isType<
int>(
"initial guess")) {
113 int guess = sublist.get<
int>(
"initial guess");
114 const Teuchos::Array<int>& range = sublist.get<Teuchos::Array<int>>(
"discrete range");
115 TEUCHOS_TEST_FOR_EXCEPTION(range.size() != 3,
Exceptions::RuntimeError,
"MueLu::KokkosTuningInterface: 'discrete range' needs to be (low, high, step)");
118 KTE::VariableInfo out_info;
119 out_info.type = KTE::ValueType::kokkos_value_int64;
120 out_info.category = KTE::StatisticalCategory::kokkos_value_interval;
121 out_info.valueQuantity = KTE::CandidateValueType::kokkos_value_range;
125 out_info.candidates = KTE::make_candidate_range((int64_t)range[0], (int64_t)range[1], (int64_t)range[2],
false,
false);
126 size_t var_id = KTE::declare_output_type(muelu_param, out_info);
127 out_variables.push_back(KTE::make_variable_value(var_id, int64_t(guess)));
130 }
else if (sublist.isType<
double>(
"initial guess")) {
132 double guess = sublist.get<
double>(
"initial guess");
133 const Teuchos::Array<double>& range = sublist.get<Teuchos::Array<double>>(
"continuous range");
134 TEUCHOS_TEST_FOR_EXCEPTION(range.size() != 3,
Exceptions::RuntimeError,
"MueLu::KokkosTuningInterface: 'continuous range' needs to be (low, high, step)");
137 KTE::VariableInfo out_info;
138 out_info.type = KTE::ValueType::kokkos_value_double;
139 out_info.category = KTE::StatisticalCategory::kokkos_value_interval;
140 out_info.valueQuantity = KTE::CandidateValueType::kokkos_value_range;
144 out_info.candidates = KTE::make_candidate_range(range[0], range[1], range[2],
false,
false);
145 size_t var_id = KTE::declare_output_type(muelu_param, out_info);
146 out_variables.push_back(KTE::make_variable_value(var_id, guess));
152 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::KokkosTuningInterface: We currently only handle int and double ranges.");
171 const Teuchos::Array<std::string>& inputs = pL.get<Teuchos::Array<std::string>>(
"input variables");
173 for (
int i = 0; i < (int)inputs.size(); i++) {
175 KTE::VariableInfo in_info;
176 in_info.type = KTE::ValueType::kokkos_value_string;
177 size_t var_id = KTE::declare_input_type(inputs[i].c_str(), in_info);
178 in_variables.push_back(KTE::make_variable_value(var_id, inputs[i].c_str()));
184 std::vector<std::string> tokens;
187 size_t end = base_string.find(delimiter);
189 while (end != std::string::npos) {
190 tokens.push_back(base_string.substr(start, end - start));
191 start = end + delimiter.length();
192 end = base_string.find(delimiter, start);
196 tokens.push_back(base_string.substr(start, end));
203 namespace KTE = Kokkos::Tools::Experimental;
204 Teuchos::ParameterList tunedParams;
206 if (
comm_->getRank() == 0) {
231 for (
int i = 0; i < (int)
out_names.size(); i++) {
234 Teuchos::ParameterList* activeList = &tunedParams;
238 for (
int j = 0; j < (int)treeWalk.size() - 1; j++) {
239 activeList = &(activeList->sublist(treeWalk[j]));
242 std::string activeName = treeWalk[treeWalk.size() - 1];
245 activeList->set(activeName, (
int)
out_variables[i].value.int_value);
247 activeList->set(activeName,
out_variables[i].value.double_value);
249 TEUCHOS_TEST_FOR_EXCEPTION(
true,
Exceptions::RuntimeError,
"MueLu::KokkosTuningInterface: Unknown variable output type");
254 Teuchos::updateParametersAndBroadcast(outArg(tunedParams), outArg(mueluParams), *
comm_, 0, overwrite);