56 auto edges = get_edges();
57 auto &ghost_layer = edges.ghost_layer;
59 std::vector<u64_3> debug_infos;
60 ghost_layer.patchdatas.for_each(
62 debug_infos.push_back(u64_3{sender, receiver, pdat.get_obj_cnt()});
64 std::vector<u64_3> collected;
65 shamalgs::collective::vector_allgatherv(debug_infos, collected, MPI_COMM_WORLD);
67 std::vector<u64_3> object_counts;
68 edges.object_counts.values.for_each([&](
u64 id,
u64 count) {
71 std::vector<u64_3> collected_object_counts;
72 shamalgs::collective::vector_allgatherv(
73 object_counts, collected_object_counts, MPI_COMM_WORLD);
75 auto compute_threshold = [&]() -> std::tuple<u64, u64, u64> {
76 std::vector<u64> values;
77 values.reserve(collected.size());
79 for (
const u64_3 &info : collected) {
80 values.push_back(info.z());
83 std::sort(values.begin(), values.end());
85 auto percentile = [&](
double p) ->
u64 {
86 size_t idx =
static_cast<size_t>(p * (values.size() - 1));
90 u64 p50 = percentile(0.50);
91 u64 p80 = percentile(0.80);
92 u64 p95 = percentile(0.95);
94 return {p50, p80, p95};
97 auto [p50, p80, p95] = compute_threshold();
102 =
" --- ExchangeGhostLayerDebugDotGraph debug infos (comm sizes) --- \n";
104 logger::raw_ln(
"p50: ", p50,
"p80: ", p80,
"p95: ", p95);
114 u32 current_subgraph = 0;
115 log += shambase::format("subgraph cluster_{0} {{\n", current_subgraph);
117 for (u64_3 &info : collected_object_counts) {
118 if (info.z() != current_subgraph) {
120 current_subgraph = info.z();
121 log += shambase::format(
"subgraph cluster_{0} {{\n", current_subgraph);
123 log += shambase::format(
124 "p_{0} [label=\"Patch {0} N={1}\"];\n", info.x(), info.y());
129 for (u64_3 &info : collected) {
131 const char *edge_color =
"green";
132 if (info.z() >= p95) {
134 }
else if (info.z() >= p80) {
135 edge_color =
"darkgoldenrod";
136 }
else if (info.z() >= p50) {
140 log += shambase::format(
141 "p_{0} -> p_{1} [xlabel={2}, color={3}, fontcolor={3}];\n",
147 log +=
" --- ExchangeGhostLayerDebugDotGraph debug infos (comm sizes) --- \n";