@@ -26,6 +26,8 @@ namespace osp {
2626
2727namespace SarkarParams {
2828
29+ enum class BufferMergeMode { OFF, FAN_IN, FAN_OUT, HOMOGENEOUS, MIX };
30+
2931template <typename commCostType>
3032struct 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+
234297template <typename Graph_t, typename Graph_t_coarse>
235298RETURN_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