Skip to content

Commit 597b45a

Browse files
committed
#5: LB: add memory to summary for clusters
1 parent 2ea8fcc commit 597b45a

File tree

3 files changed

+113
-7
lines changed

3 files changed

+113
-7
lines changed

src/vt-lb/algo/temperedlb/cluster_summarizer.cc

Lines changed: 108 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
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>
5758
ClusterSummarizer::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;

src/vt-lb/algo/temperedlb/cluster_summarizer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
#include <vt-lb/model/PhaseData.h>
4848
#include <vt-lb/model/Communication.h>
49+
#include <vt-lb/algo/temperedlb/configuration.h>
4950

5051
#include <unordered_map>
5152
#include <vector>
@@ -98,12 +99,14 @@ struct ClusterSummarizer {
9899
* @param[in] pd Phase data
99100
* @param[in] clusterer_ Clusterer instance
100101
* @param[in] global_max_clusters Global maximum number of clusters
102+
* @param[in] config Configuration object
101103
*
102104
* @return Map from global cluster ID to summary info
103105
*/
104106
static std::unordered_map<int, TaskClusterSummaryInfo>
105107
buildClusterSummaries(
106108
model::PhaseData const& pd,
109+
Configuration const& config,
107110
Clusterer const* clusterer_,
108111
int global_max_clusters
109112
);

src/vt-lb/algo/temperedlb/temperedlb.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ struct TemperedLB final : baselb::BaseLB {
222222

223223
std::unordered_map<int, TaskClusterSummaryInfo> buildClusterSummaries() {
224224
return ClusterSummarizer::buildClusterSummaries(
225-
this->getPhaseData(), getClusterer(), global_max_clusters_
225+
this->getPhaseData(), config_, getClusterer(), global_max_clusters_
226226
);
227227
}
228228

@@ -279,7 +279,7 @@ struct TemperedLB final : baselb::BaseLB {
279279
// Run the clustering algorithm if appropiate for the configuration
280280
doClustering();
281281

282-
// Generate visualization after symmetrization/clustering
282+
// Generate visualization after clustering
283283
visualizeGraph("temperedlb_rank" + std::to_string(comm_.getRank()) + "_trial" + std::to_string(trial));
284284

285285
auto& wm = config_.work_model_;

0 commit comments

Comments
 (0)