Skip to content

Commit bbef250

Browse files
Added Buffer merge modes
1 parent d63c5ae commit bbef250

File tree

3 files changed

+86
-24
lines changed

3 files changed

+86
-24
lines changed

apps/coarser_plotter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ int main(int argc, char *argv[]) {
5353
params.leniency = 0.005;
5454
params.maxWeight = 15000;
5555
params.smallWeightThreshold = 4000;
56-
params.use_buffer_merge = true;
56+
params.buffer_merge_mode = SarkarParams::BufferMergeMode::HOMOGENEOUS;
5757

5858
SarkarMul<Graph_t, Graph_t> coarser;
5959
coarser.setParameters(params);

apps/test_suite_runner/StringToScheduler/get_coarser.hpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,11 @@ get_coarser_by_name(const ConfigParser &, const boost::property_tree::ptree &coa
148148
if (auto params_opt = coarser_algorithm.get_child_optional("parameters")) {
149149
const auto &params_pt = params_opt.get();
150150
params.commCost = params_pt.get_optional<v_workw_t<Graph_t_in>>("commCost").value_or(params.commCost);
151+
params.maxWeight = params_pt.get_optional<v_workw_t<Graph_t_in>>("maxWeight").value_or(params.maxWeight);
152+
params.smallWeightThreshold = params_pt.get_optional<v_workw_t<Graph_t_in>>("smallWeightThreshold").value_or(params.smallWeightThreshold);
151153
params.useTopPoset = params_pt.get_optional<bool>("useTopPoset").value_or(params.useTopPoset);
154+
params.geomDecay = params_pt.get_optional<double>("geomDecay").value_or(params.geomDecay);
155+
params.leniency = params_pt.get_optional<double>("leniency").value_or(params.leniency);
152156

153157
if (auto mode_str_opt = params_pt.get_optional<std::string>("mode")) {
154158
const std::string &mode_str = mode_str_opt.get();
@@ -161,8 +165,9 @@ get_coarser_by_name(const ConfigParser &, const boost::property_tree::ptree &coa
161165
else if (mode_str == "LEVEL_ODD") params.mode = SarkarParams::Mode::LEVEL_ODD;
162166
else if (mode_str == "FAN_IN_BUFFER") params.mode = SarkarParams::Mode::FAN_IN_BUFFER;
163167
else if (mode_str == "FAN_OUT_BUFFER") params.mode = SarkarParams::Mode::FAN_OUT_BUFFER;
168+
else if (mode_str == "HOMOGENEOUS_BUFFER") params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
164169
else throw std::invalid_argument("Invalid Sarkar mode: " + mode_str
165-
+ "!\nChoose from: LINES, FAN_IN_FULL, FAN_IN_PARTIAL, FAN_OUT_FULL, FAN_OUT_PARTIAL, LEVEL_EVEN, LEVEL_ODD, FAN_IN_BUFFER, FAN_OUT_BUFFER.");
170+
+ "!\nChoose from: LINES, FAN_IN_FULL, FAN_IN_PARTIAL, FAN_OUT_FULL, FAN_OUT_PARTIAL, LEVEL_EVEN, LEVEL_ODD, FAN_IN_BUFFER, FAN_OUT_BUFFER, HOMOGENEOUS_BUFFER.");
166171
}
167172
}
168173
return std::make_unique<Sarkar<Graph_t_in, Graph_t_out>>(params);
@@ -216,11 +221,22 @@ get_multilevel_coarser_by_name(const ConfigParser &, const boost::property_tree:
216221
}
217222
ml_params.maxWeight =
218223
params_pt.get_optional<v_workw_t<Graph_t_in>>("maxWeight").value_or(ml_params.maxWeight);
224+
ml_params.smallWeightThreshold =
225+
params_pt.get_optional<v_workw_t<Graph_t_in>>("smallWeightThreshold").value_or(ml_params.smallWeightThreshold);
219226
ml_params.max_num_iteration_without_changes =
220227
params_pt.get_optional<unsigned>("max_num_iteration_without_changes")
221228
.value_or(ml_params.max_num_iteration_without_changes);
222-
ml_params.use_buffer_merge =
223-
params_pt.get_optional<bool>("use_buffer_merge").value_or(ml_params.use_buffer_merge);
229+
230+
if (auto mode_str_opt = params_pt.get_optional<std::string>("buffer_merge_mode")) {
231+
const std::string &mode_str = mode_str_opt.get();
232+
if (mode_str == "OFF") ml_params.buffer_merge_mode = SarkarParams::BufferMergeMode::OFF;
233+
else if (mode_str == "FAN_IN") ml_params.buffer_merge_mode = SarkarParams::BufferMergeMode::FAN_IN;
234+
else if (mode_str == "FAN_OUT") ml_params.buffer_merge_mode = SarkarParams::BufferMergeMode::FAN_OUT;
235+
else if (mode_str == "HOMOGENEOUS") ml_params.buffer_merge_mode = SarkarParams::BufferMergeMode::HOMOGENEOUS;
236+
else if (mode_str == "MIX") ml_params.buffer_merge_mode = SarkarParams::BufferMergeMode::MIX;
237+
else throw std::invalid_argument("Invalid Sarkar Buffer Merge mode: " + mode_str
238+
+ "!\nChoose from: OFF, FAN_IN, FAN_OUT, HOMOGENEOUS, MIX.");
239+
}
224240
}
225241

226242
coarser->setParameters(ml_params);

include/osp/coarser/Sarkar/SarkarMul.hpp

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ namespace osp {
2626

2727
namespace SarkarParams {
2828

29+
enum class BufferMergeMode { OFF, FAN_IN, FAN_OUT, HOMOGENEOUS, MIX };
30+
2931
template<typename commCostType>
3032
struct MulParameters {
3133
std::size_t seed{42U};
@@ -35,7 +37,7 @@ struct MulParameters {
3537
commCostType maxWeight{ std::numeric_limits<commCostType>::max() };
3638
commCostType smallWeightThreshold{ std::numeric_limits<commCostType>::lowest() };
3739
unsigned max_num_iteration_without_changes{3U};
38-
bool use_buffer_merge{false};
40+
BufferMergeMode buffer_merge_mode{BufferMergeMode::OFF};
3941
};
4042
} // end namespace SarkarParams
4143

@@ -60,6 +62,7 @@ class SarkarMul : public MultilevelCoarser<Graph_t, Graph_t_coarse> {
6062
void updateParams();
6163

6264
RETURN_STATUS run_single_contraction_mode(vertex_idx_t<Graph_t> &diff_vertices);
65+
RETURN_STATUS run_buffer_merges();
6366
RETURN_STATUS run_contractions(v_workw_t<Graph_t> commCost);
6467
RETURN_STATUS run_contractions() override;
6568

@@ -231,35 +234,78 @@ RETURN_STATUS SarkarMul<Graph_t, Graph_t_coarse>::run_contractions(v_workw_t<Gra
231234
};
232235

233236

237+
template<typename Graph_t, typename Graph_t_coarse>
238+
RETURN_STATUS SarkarMul<Graph_t, Graph_t_coarse>::run_buffer_merges() {
239+
RETURN_STATUS status = RETURN_STATUS::OSP_SUCCESS;
240+
241+
unsigned no_change = 0;
242+
while (no_change < ml_params.max_num_iteration_without_changes) {
243+
switch (ml_params.buffer_merge_mode)
244+
{
245+
case SarkarParams::BufferMergeMode::FAN_IN:
246+
{
247+
params.mode = SarkarParams::Mode::FAN_IN_BUFFER;
248+
}
249+
break;
250+
251+
case SarkarParams::BufferMergeMode::FAN_OUT:
252+
{
253+
params.mode = SarkarParams::Mode::FAN_OUT_BUFFER;
254+
}
255+
break;
256+
257+
case SarkarParams::BufferMergeMode::HOMOGENEOUS:
258+
{
259+
params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
260+
}
261+
break;
262+
263+
case SarkarParams::BufferMergeMode::MIX:
264+
{
265+
if (thue_coin.get_flip()) {
266+
params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
267+
} else {
268+
params.mode = thue_coin.get_flip() ? SarkarParams::Mode::FAN_IN_BUFFER : SarkarParams::Mode::FAN_OUT_BUFFER;
269+
}
270+
}
271+
break;
272+
273+
default:
274+
{
275+
params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
276+
}
277+
break;
278+
}
279+
updateParams();
280+
281+
vertex_idx_t<Graph_t> diff = 0;
282+
status = std::max(status, run_single_contraction_mode(diff));
283+
284+
if (diff > 0) {
285+
no_change = 0;
286+
} else {
287+
no_change++;
288+
}
289+
290+
status = std::max(status, run_contractions( ml_params.commCostVec.back() ));
291+
}
292+
293+
return status;
294+
}
295+
296+
234297
template<typename Graph_t, typename Graph_t_coarse>
235298
RETURN_STATUS SarkarMul<Graph_t, Graph_t_coarse>::run_contractions() {
236299
initParams();
237300

238301
RETURN_STATUS status = RETURN_STATUS::OSP_SUCCESS;
239-
vertex_idx_t<Graph_t> diff = 0;
240302

241303
for (const v_workw_t<Graph_t> commCost : ml_params.commCostVec) {
242304
status = std::max(status, run_contractions(commCost));
243305
}
244306

245-
if (ml_params.use_buffer_merge) {
246-
unsigned no_change = 0;
247-
248-
while (no_change < ml_params.max_num_iteration_without_changes) {
249-
params.mode = SarkarParams::Mode::HOMOGENEOUS_BUFFER;
250-
// params.mode = thue_coin.get_flip()? SarkarParams::Mode::FAN_IN_BUFFER : SarkarParams::Mode::FAN_OUT_BUFFER;
251-
updateParams();
252-
253-
status = std::max(status, run_single_contraction_mode(diff));
254-
255-
if (diff > 0) {
256-
no_change = 0;
257-
} else {
258-
no_change++;
259-
}
260-
261-
status = std::max(status, run_contractions( ml_params.commCostVec.back() ));
262-
}
307+
if (ml_params.buffer_merge_mode != SarkarParams::BufferMergeMode::OFF) {
308+
status = std::max(status, run_buffer_merges());
263309
}
264310

265311
return status;

0 commit comments

Comments
 (0)