Skip to content

Commit 7b5829b

Browse files
committed
Update the LPRec memory estimator
Integrate the power_of_2_cropping flag
1 parent b204eeb commit 7b5829b

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

httomo_backends/methods_database/packages/backends/httomolibgpu/supporting_funcs/recon/algorithm.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ def _calc_memory_bytes_LPRec3d_tomobar(
197197
min_mem_usage_ifft2 = False
198198
if "min_mem_usage_ifft2" in kwargs:
199199
min_mem_usage_ifft2 = kwargs["min_mem_usage_ifft2"]
200+
power_of_2_cropping = False
201+
if "power_of_2_cropping" in kwargs:
202+
power_of_2_cropping = kwargs["power_of_2_cropping"]
200203

201204
angles_tot = non_slice_dims_shape[0]
202205
DetectorsLengthH_prepad = non_slice_dims_shape[1]
@@ -205,6 +208,10 @@ def _calc_memory_bytes_LPRec3d_tomobar(
205208
_CENTER_SIZE_MIN = 192 # must be divisible by 8
206209

207210
n = DetectorsLengthH
211+
if(power_of_2_cropping):
212+
n_pow2 = 2 ** math.ceil(math.log2(n))
213+
if( 0.9 < n / n_pow2 ):
214+
n = n_pow2
208215

209216
odd_horiz = False
210217
if (n % 2) != 0:
@@ -407,9 +414,9 @@ def add_to_memory_counters(amount, per_slice: bool):
407414
add_to_memory_counters(after_recon_swapaxis_slice, True)
408415

409416
if min_mem_usage_filter and min_mem_usage_ifft2:
410-
return (tot_memory_bytes * 1.15, fixed_amount)
417+
return (tot_memory_bytes * 1.1, fixed_amount)
411418
elif min_mem_usage_filter and not min_mem_usage_ifft2:
412-
return (tot_memory_bytes + 60 * 1024 * 1024, fixed_amount)
419+
return (tot_memory_bytes + 50 * 1024 * 1024, fixed_amount)
413420
else:
414421
return (tot_memory_bytes * 1.1, fixed_amount)
415422

tests/test_httomolibgpu.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ def test_recon_FBP3d_tomobar_memoryhook(
544544

545545
@pytest.mark.cupy
546546
@pytest.mark.parametrize("min_mem_usage_filter_ifft2", [(False, False), (True, False), (True, True)])
547+
@pytest.mark.parametrize("power_of_2_cropping", [False, True])
547548
@pytest.mark.parametrize("padding_detx", [0, 10, 50, 100])
548549
@pytest.mark.parametrize("projections", [1500, 1801, 2560])
549550
@pytest.mark.parametrize("detX_size", [2560])
@@ -556,6 +557,7 @@ def test_recon_LPRec3d_tomobar_0_pi_memoryhook(
556557
projection_angle_range,
557558
min_mem_usage_filter_ifft2,
558559
padding_detx,
560+
power_of_2_cropping,
559561
ensure_clean_memory,
560562
):
561563
__test_recon_LPRec3d_tomobar_memoryhook_common(
@@ -565,13 +567,15 @@ def test_recon_LPRec3d_tomobar_0_pi_memoryhook(
565567
projection_angle_range,
566568
padding_detx,
567569
min_mem_usage_filter_ifft2,
570+
power_of_2_cropping,
568571
ensure_clean_memory,
569572
)
570573

571574

572575
@pytest.mark.full
573576
@pytest.mark.cupy
574577
@pytest.mark.parametrize("min_mem_usage_filter_ifft2", [(False, False), (True, False), (True, True)])
578+
@pytest.mark.parametrize("power_of_2_cropping", [False, True])
575579
@pytest.mark.parametrize("padding_detx", [0, 10, 50, 100, 800])
576580
@pytest.mark.parametrize("projections", [1500, 1801, 2560, 3601])
577581
@pytest.mark.parametrize("detX_size", [2560])
@@ -584,6 +588,7 @@ def test_recon_LPRec3d_tomobar_0_pi_memoryhook_full(
584588
projection_angle_range,
585589
padding_detx,
586590
min_mem_usage_filter_ifft2,
591+
power_of_2_cropping,
587592
ensure_clean_memory,
588593
):
589594
__test_recon_LPRec3d_tomobar_memoryhook_common(
@@ -593,13 +598,15 @@ def test_recon_LPRec3d_tomobar_0_pi_memoryhook_full(
593598
projection_angle_range,
594599
padding_detx,
595600
min_mem_usage_filter_ifft2,
601+
power_of_2_cropping,
596602
ensure_clean_memory,
597603
)
598604

599605

600606
@pytest.mark.full
601607
@pytest.mark.cupy
602608
@pytest.mark.parametrize("min_mem_usage_filter_ifft2", [(False, False), (True, False), (True, True)])
609+
@pytest.mark.parametrize("power_of_2_cropping", [False, True])
603610
@pytest.mark.parametrize("padding_detx", [0, 10, 50, 100, 800])
604611
@pytest.mark.parametrize("projections", [1500, 1801, 2560, 3601])
605612
@pytest.mark.parametrize("detX_size", [2560])
@@ -614,6 +621,7 @@ def test_recon_LPRec3d_tomobar_memoryhook_full(
614621
projection_angle_range,
615622
padding_detx,
616623
min_mem_usage_filter_ifft2,
624+
power_of_2_cropping,
617625
ensure_clean_memory,
618626
):
619627
__test_recon_LPRec3d_tomobar_memoryhook_common(
@@ -623,6 +631,7 @@ def test_recon_LPRec3d_tomobar_memoryhook_full(
623631
projection_angle_range,
624632
padding_detx,
625633
min_mem_usage_filter_ifft2,
634+
power_of_2_cropping,
626635
ensure_clean_memory,
627636
)
628637

@@ -634,6 +643,7 @@ def __test_recon_LPRec3d_tomobar_memoryhook_common(
634643
projection_angle_range,
635644
padding_detx,
636645
min_mem_usage_filter_ifft2,
646+
power_of_2_cropping,
637647
ensure_clean_memory,
638648
):
639649
angles_number = projections
@@ -646,6 +656,7 @@ def __test_recon_LPRec3d_tomobar_memoryhook_common(
646656
kwargs["detector_pad"] = padding_detx
647657
kwargs["min_mem_usage_filter"] = min_mem_usage_filter_ifft2[0]
648658
kwargs["min_mem_usage_ifft2"] = min_mem_usage_filter_ifft2[1]
659+
kwargs["power_of_2_cropping"] = power_of_2_cropping
649660
kwargs["recon_size"] = detX_size
650661
kwargs["recon_mask_radius"] = 0.8
651662

0 commit comments

Comments
 (0)