From d8e9cbfe278898d3a302f5f7d62dba946eafd573 Mon Sep 17 00:00:00 2001 From: Daniel Seemaier Date: Thu, 26 Sep 2024 19:08:54 +0200 Subject: [PATCH] fix(shm): sequential allocs in the greedy balancer --- kaminpar-common/datastructures/binary_heap.h | 26 ++++++++++++------- kaminpar-common/datastructures/marker.h | 21 +++++++++++---- .../refinement/balancer/greedy_balancer.cc | 4 +-- .../refinement/balancer/greedy_balancer.h | 4 +-- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/kaminpar-common/datastructures/binary_heap.h b/kaminpar-common/datastructures/binary_heap.h index 0dc01241..1785ca59 100644 --- a/kaminpar-common/datastructures/binary_heap.h +++ b/kaminpar-common/datastructures/binary_heap.h @@ -460,7 +460,12 @@ template using BinaryMaxHeap = BinaryHeap using BinaryMinHeap = BinaryHeap; -template typename Comparator> +template < + typename ID, + typename Key, + template + typename Comparator, + template typename Container = std::vector> class DynamicBinaryForest { static constexpr std::size_t kTreeArity = 4; static constexpr ID kInvalidID = std::numeric_limits::max(); @@ -645,18 +650,21 @@ class DynamicBinaryForest { std::swap(_heaps[heap][a], _heaps[heap][b]); } - std::vector _id_pos; + Container _id_pos; std::vector> _heaps; Comparator _comparator{}; }; -template -using DynamicBinaryMaxForest = DynamicBinaryForest; +template typename Container = std::vector> +using DynamicBinaryMaxForest = + DynamicBinaryForest; -template -using DynamicBinaryMinForest = DynamicBinaryForest; +template typename Container = std::vector> +using DynamicBinaryMinForest = + DynamicBinaryForest; -template class DynamicBinaryMinMaxForest { +template typename Container = std::vector> +class DynamicBinaryMinMaxForest { public: DynamicBinaryMinMaxForest() {} @@ -763,8 +771,8 @@ template class DynamicBinaryMinMaxForest { } private: - DynamicBinaryMaxForest _max_forest; - DynamicBinaryMinForest _min_forest; + DynamicBinaryMaxForest _max_forest; + DynamicBinaryMinForest _min_forest; }; //! Dynamic binary heap, not addressable diff --git a/kaminpar-common/datastructures/marker.h b/kaminpar-common/datastructures/marker.h index 20c986ec..325fa6c7 100644 --- a/kaminpar-common/datastructures/marker.h +++ b/kaminpar-common/datastructures/marker.h @@ -12,11 +12,17 @@ #include #include +#include + #include "kaminpar-common/assert.h" #include "kaminpar-common/heap_profiler.h" namespace kaminpar { -template class Marker { +template < + std::size_t kNumConcurrentMarkers = 1, + typename Value = std::size_t, + template typename Container = std::vector> +class Marker { public: explicit Marker() : _marker_id(0), _first_unmarked_element{0} { RECORD_DATA_STRUCT(0, _struct); @@ -80,9 +86,14 @@ template c if ((_marker_id | ((1u << kNumConcurrentMarkers) - 1u)) == std::numeric_limits::max()) { _marker_id = 0; - const auto capacity = _data.size(); - _data.clear(); - _data.resize(capacity, 0); + + if constexpr (std::is_same_v, std::vector>) { + const auto capacity = _data.size(); + _data.clear(); + _data.resize(capacity, 0); + } else { + tbb::parallel_for(0, _data.size(), [&](const std::size_t i) { _data[i] = 0; }); + } } } @@ -96,7 +107,7 @@ template c } private: - std::vector _data; + Container _data; Value _marker_id; std::array _first_unmarked_element; diff --git a/kaminpar-shm/refinement/balancer/greedy_balancer.cc b/kaminpar-shm/refinement/balancer/greedy_balancer.cc index 16675615..fa755b22 100644 --- a/kaminpar-shm/refinement/balancer/greedy_balancer.cc +++ b/kaminpar-shm/refinement/balancer/greedy_balancer.cc @@ -438,10 +438,10 @@ template class GreedyBalancerImpl { PartitionedGraph *_p_graph; const Graph *_graph; - DynamicBinaryMinMaxForest _pq; + DynamicBinaryMinMaxForest _pq; mutable tbb::enumerable_thread_specific> _rating_map; tbb::enumerable_thread_specific> _feasible_target_blocks; - Marker<> _marker; + Marker<1, std::size_t, StaticArray> _marker; std::vector _pq_weight; Statistics _stats; diff --git a/kaminpar-shm/refinement/balancer/greedy_balancer.h b/kaminpar-shm/refinement/balancer/greedy_balancer.h index 7b26aa69..b199385f 100644 --- a/kaminpar-shm/refinement/balancer/greedy_balancer.h +++ b/kaminpar-shm/refinement/balancer/greedy_balancer.h @@ -22,10 +22,10 @@ namespace kaminpar::shm { template class GreedyBalancerImpl; struct GreedyBalancerMemoryContext { - DynamicBinaryMinMaxForest pq; + DynamicBinaryMinMaxForest pq; tbb::enumerable_thread_specific> rating_map; tbb::enumerable_thread_specific> feasible_target_blocks; - Marker<> marker; + Marker<1, std::size_t, StaticArray> marker; std::vector pq_weight; NormalSparseGainCache *gain_cache = nullptr; };