51 std::vector<shamrock::patch::Patch> &global_patch_list) {
54 using namespace shamrock::patch;
59 using Torder = hilbert_num;
64 std::vector<LBTile> patch_dt(global_patch_list.size());
66#pragma omp parallel for
67 for (
u64 i = 0; i < global_patch_list.size(); i++) {
69 const Patch &p = global_patch_list[i];
72 = {SFC::icoord_to_hilbert(p.coord_min[0], p.coord_min[1], p.coord_min[2]),
76 std::vector<i32> new_owner_table =
load_balance(std::move(patch_dt));
79 apply_node_patch_packing(global_patch_list, new_owner_table);
86 for (
u64 i = 0; i < global_patch_list.size(); i++) {
88 i32 old_owner = global_patch_list[i].node_owner_id;
89 i32 new_owner = new_owner_table[i];
93 if (new_owner != old_owner) {
99 op.patch_id = global_patch_list[i].id_patch;
100 op.rank_owner_new = new_owner;
101 op.rank_owner_old = old_owner;
102 op.tag_comm = tags_it_node[old_owner];
104 change_list.change_ops.push_back(op);
105 tags_it_node[old_owner]++;
108 load_per_node[new_owner_table[i]] += global_patch_list[i].load_value;
119#pragma omp parallel for reduction(min : min) reduction(max : max) reduction(+ : avg)
120 for (
i32 nid = 0; nid < world_size; nid++) {
121 f64 val = load_per_node[nid];
122 min = sycl::fmin(min, val);
123 max = sycl::fmax(max, val);
129 for (
i32 nid = 0; nid < world_size; nid++) {
131 "HilbertLoadBalance",
"node :", nid,
"load :", load_per_node[nid]);
136#pragma omp parallel for reduction(+ : var)
137 for (
i32 nid = 0; nid < world_size; nid++) {
138 f64 val = load_per_node[nid];
139 var += (val - avg) * (val - avg);
144 std::string str =
"Loadbalance stats : \n";
145 str += shambase::format(
" npatch = {}\n", global_patch_list.size());
146 str += shambase::format(
" min = {}\n", min);
147 str += shambase::format(
" max = {}\n", max);
148 str += shambase::format(
" avg = {}\n", avg);
150 str +=
" efficiency = ???%";
152 str += shambase::format(
153 " efficiency = {:.2f}%", 100 - (100 * (max - min) / max));
155 logger::info_ln(
"LoadBalance", str);