254 using namespace shamrock::patch;
256 std::vector<Patch> plist;
258 std::mt19937 eng(0x1111);
259 std::uniform_real_distribution<f32> split_val(0, 1);
261 using namespace shamrock::scheduler;
267 .load_value = total_dtcnt,
268 .coord_min = {0, 0, 0},
276 bool listchanged =
true;
279 while (listchanged) {
282 std::vector<Patch> to_add;
284 for (
Patch &p : plist) {
285 if (p.load_value > div_limit) {
295 u64 min_x = p.coord_min[0];
296 u64 min_y = p.coord_min[1];
297 u64 min_z = p.coord_min[2];
299 u64 split_x = (((p.coord_max[0] - p.coord_min[0]) + 1) / 2) - 1 + min_x;
300 u64 split_y = (((p.coord_max[1] - p.coord_min[1]) + 1) / 2) - 1 + min_y;
301 u64 split_z = (((p.coord_max[2] - p.coord_min[2]) + 1) / 2) - 1 + min_z;
303 u64 max_x = p.coord_max[0];
304 u64 max_y = p.coord_max[1];
305 u64 max_z = p.coord_max[2];
307 u32 qte_m = split_val(eng) * p.load_value;
308 u32 qte_p = p.load_value - qte_m;
310 u32 qte_mm = split_val(eng) * qte_m;
311 u32 qte_mp = qte_m - qte_mm;
313 u32 qte_pm = split_val(eng) * qte_p;
314 u32 qte_pp = qte_p - qte_pm;
316 u32 qte_mmm = split_val(eng) * qte_mm;
317 u32 qte_mmp = qte_mm - qte_mmm;
319 u32 qte_mpm = split_val(eng) * qte_mp;
320 u32 qte_mpp = qte_mp - qte_mpm;
322 u32 qte_pmm = split_val(eng) * qte_pm;
323 u32 qte_pmp = qte_pm - qte_pmm;
325 u32 qte_ppm = split_val(eng) * qte_pp;
326 u32 qte_ppp = qte_pp - qte_ppm;
331 .load_value = qte_mmm,
332 .coord_min = {min_x, min_y, min_z},
333 .coord_max = {split_x, split_y, split_z},
341 .load_value = qte_mmp,
342 .coord_min = {min_x, min_y, split_z + 1},
343 .coord_max = {split_x, split_y, max_z},
351 .load_value = qte_mpm,
352 .coord_min = {min_x, split_y + 1, min_z},
353 .coord_max = {split_x, max_y, split_z},
361 .load_value = qte_mpp,
362 .coord_min = {min_x, split_y + 1, split_z + 1},
363 .coord_max = {split_x, max_y, max_z},
371 .load_value = qte_pmm,
372 .coord_min = {split_x + 1, min_y, min_z},
373 .coord_max = {max_x, split_y, split_z},
381 .load_value = qte_pmp,
382 .coord_min = {split_x + 1, min_y, split_z + 1},
383 .coord_max = {max_x, split_y, max_z},
391 .load_value = qte_ppm,
392 .coord_min = {split_x + 1, split_y + 1, min_z},
393 .coord_max = {max_x, max_y, split_z},
401 .load_value = qte_ppp,
402 .coord_min = {split_x + 1, split_y + 1, split_z + 1},
403 .coord_max = {max_x, max_y, max_z},
409 to_add.push_back(child_mmp);
410 to_add.push_back(child_mpm);
411 to_add.push_back(child_mpp);
412 to_add.push_back(child_pmm);
413 to_add.push_back(child_pmp);
414 to_add.push_back(child_ppm);
415 to_add.push_back(child_ppp);
419 if (!to_add.empty()) {
422 plist.insert(plist.end(), to_add.begin(), to_add.end());