4545#include < vt-lb/model/Communication.h>
4646#include < vt-lb/algo/temperedlb/cluster_summarizer.h>
4747#include < vt-lb/algo/temperedlb/clustering.h>
48+ #include < vt-lb/algo/temperedlb/configuration.h>
4849
4950#include < unordered_map>
5051#include < vector>
@@ -55,7 +56,10 @@ namespace vt_lb::algo::temperedlb {
5556
5657/* static*/ std::unordered_map<int , TaskClusterSummaryInfo>
5758ClusterSummarizer::buildClusterSummaries (
58- model::PhaseData const & pd, Clusterer const * clusterer_, int global_max_clusters
59+ model::PhaseData const & pd,
60+ Configuration const & config,
61+ Clusterer const * clusterer_,
62+ int global_max_clusters
5963) {
6064 assert (clusterer_ != nullptr && " Clusterer must be initialized to build summaries" );
6165 int const rank = pd.getRank ();
@@ -133,13 +137,112 @@ ClusterSummarizer::buildClusterSummaries(
133137 }
134138 }
135139
140+ // Memory summaries per cluster (only if enabled)
141+ if (config.hasMemoryInfo ()) {
142+ // Precompute a full set of task IDs for outside-cluster checks
143+ std::unordered_set<model::TaskType> all_tasks;
144+ for (auto const & kv : pd.getTasksMap ()) {
145+ all_tasks.insert (kv.first );
146+ }
147+
148+ for (auto const & cl : clusterer_->clusters ()) {
149+ auto & sum = summary_by_local.at (cl.id );
150+
151+ // Build set of tasks in this cluster
152+ std::unordered_set<model::TaskType> cluster_tasks (cl.members .begin (), cl.members .end ());
153+
154+ // Initialize maxima and footprint
155+ model::BytesType max_working_inside = 0 ;
156+ model::BytesType max_serialized_inside = 0 ;
157+ model::BytesType max_working_outside = 0 ;
158+ model::BytesType max_serialized_outside = 0 ;
159+ model::BytesType total_footprint = 0 ;
160+
161+ // Collect shared blocks used by cluster tasks
162+ std::unordered_set<model::SharedBlockType> shared_blocks_in_cluster;
163+
164+ // Iterate tasks to compute inside values and shared blocks
165+ for (auto t : cl.members ) {
166+ auto it = pd.getTasksMap ().find (t);
167+ if (it == pd.getTasksMap ().end ()) continue ;
168+ auto const & task = it->second ;
169+
170+ // Footprint sum
171+ if (config.hasTaskFootprintMemoryInfo ()) {
172+ total_footprint += task.getMemory ().getFootprint ();
173+ }
174+
175+ // Max inside working/serialized
176+ if (config.hasTaskWorkingMemoryInfo ()) {
177+ max_working_inside = std::max (max_working_inside, task.getMemory ().getWorking ());
178+ }
179+ if (config.hasTaskSerializedMemoryInfo ()) {
180+ max_serialized_inside = std::max (max_serialized_inside, task.getMemory ().getSerialized ());
181+ }
182+
183+ // Shared blocks union
184+ if (config.hasSharedBlockMemoryInfo ()) {
185+ for (auto const & sb : task.getSharedBlocks ()) {
186+ shared_blocks_in_cluster.insert (sb);
187+ }
188+ }
189+ }
190+
191+ // Compute max outside values by scanning tasks not in this cluster
192+ if (config.hasTaskWorkingMemoryInfo () || config.hasTaskSerializedMemoryInfo ()) {
193+ for (auto const & kv : pd.getTasksMap ()) {
194+ auto const & task = kv.second ;
195+ if (cluster_tasks.find (task.getId ()) != cluster_tasks.end ()) continue ; // skip inside
196+ if (config.hasTaskWorkingMemoryInfo ()) {
197+ max_working_outside = std::max (max_working_outside, task.getMemory ().getWorking ());
198+ }
199+ if (config.hasTaskSerializedMemoryInfo ()) {
200+ max_serialized_outside = std::max (max_serialized_outside, task.getMemory ().getSerialized ());
201+ }
202+ }
203+ }
204+
205+ // Fill shared_block_bytes_ with sizes
206+ if (config.hasSharedBlockMemoryInfo ()) {
207+ for (auto const & sb : shared_blocks_in_cluster) {
208+ if (!pd.hasSharedBlock (sb)) continue ;
209+ auto info = pd.getSharedBlock (sb);
210+ sum.shared_block_bytes_ [sb] = info->getSize ();
211+ }
212+ }
213+
214+ // Store computed values on summary
215+ sum.max_object_working_bytes = max_working_inside;
216+ sum.max_object_serialized_bytes = max_serialized_inside;
217+ sum.max_object_working_bytes_outside = max_working_outside;
218+ sum.max_object_serialized_bytes_outside = max_serialized_outside;
219+ sum.cluster_footprint = total_footprint;
220+ }
221+ }
222+
136223 // Emit summaries
137224 for (auto const & cl : clusterer_->clusters ()) {
138225 auto const & sum = summary_by_local.at (cl.id );
139- printf (" %d: buildClusterSummaries cluster %d size=%zu load=%.2f intra_send=%.2f intra_recv=%.2f inter_edges=%zu\n " ,
140- rank, cl.id , cl.members .size (), cl.load ,
141- sum.cluster_intra_send_bytes , sum.cluster_intra_recv_bytes ,
142- sum.inter_edges_ .size ());
226+ printf (
227+ " %d: buildClusterSummaries cluster %d size=%zu load=%.2f "
228+ " intra_send=%.2f intra_recv=%.2f "
229+ " inter_edges=%zu "
230+ " footprint=%.0f "
231+ " max_work_in=%.0f "
232+ " max_work_out=%.0f "
233+ " max_ser_in=%.0f "
234+ " max_ser_out=%.0f "
235+ " shared_block_count=%zu\n " ,
236+ rank, cl.id , cl.members .size (), cl.load ,
237+ sum.cluster_intra_send_bytes , sum.cluster_intra_recv_bytes ,
238+ sum.inter_edges_ .size (),
239+ sum.cluster_footprint ,
240+ sum.max_object_working_bytes ,
241+ sum.max_object_working_bytes_outside ,
242+ sum.max_object_serialized_bytes ,
243+ sum.max_object_serialized_bytes_outside ,
244+ sum.shared_block_bytes_ .size ()
245+ );
143246 }
144247
145248 return summary_by_local;
0 commit comments