Skip to content

Commit 7fdf698

Browse files
committed
Trim CuPy memory pool during elevation mapping
1 parent cf08648 commit 7fdf698

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

elevation_mapping_cupy/elevation_mapping_cupy/elevation_mapping.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,12 +699,18 @@ def copy_to_cpu(self, array, data, stream=None):
699699
stream (Union[None, cupy.cuda.stream.Stream, None, None, None, None, None, None, None]):
700700
"""
701701
if type(array) == np.ndarray:
702-
data[...] = array.astype(np.float32)
702+
data[...] = array.astype(np.float32, copy=False)
703703
elif type(array) == cp.ndarray:
704+
source = array.astype(np.float32, copy=False)
704705
if stream is not None:
705-
data[...] = cp.asnumpy(array.astype(np.float32), stream=stream)
706+
cp.asnumpy(source, stream=stream, out=data)
706707
else:
707-
data[...] = cp.asnumpy(array.astype(np.float32))
708+
cp.asnumpy(source, out=data)
709+
710+
def trim_memory_pool(self):
711+
"""Release cached CuPy allocator blocks that are not currently in use."""
712+
pool.free_all_blocks()
713+
cp.get_default_pinned_memory_pool().free_all_blocks()
708714

709715
def exists_layer(self, name):
710716
"""Check if the layer exists in elevation map or in the semantic map.

elevation_mapping_cupy/elevation_mapping_cupy/elevation_mapping_node.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ def get_ros_params(self) -> None:
152152
self.update_variance_fps = self.get_parameter('update_variance_fps').get_parameter_value().double_value
153153
self.time_interval = self.get_parameter('time_interval').get_parameter_value().double_value
154154
self.update_pose_fps = self.get_parameter('update_pose_fps').get_parameter_value().double_value
155+
if not self.has_parameter('cupy_memory_pool_trim_interval_s'):
156+
self.declare_parameter('cupy_memory_pool_trim_interval_s', 5.0)
157+
self.cupy_memory_pool_trim_interval_s = float(
158+
self.get_parameter('cupy_memory_pool_trim_interval_s').value
159+
)
155160
self.initialize_tf_grid_size = self.get_parameter('initialize_tf_grid_size').get_parameter_value().double_value
156161
self.map_acquire_fps = self.get_parameter('map_acquire_fps').get_parameter_value().double_value
157162
self.publish_statistics_fps = self.get_parameter('publish_statistics_fps').get_parameter_value().double_value
@@ -406,6 +411,12 @@ def register_timers(self) -> None:
406411
self.time_interval,
407412
self.update_time
408413
)
414+
self.timer_cupy_memory_pool = None
415+
if self.cupy_memory_pool_trim_interval_s > 0.0:
416+
self.timer_cupy_memory_pool = self.create_timer(
417+
self.cupy_memory_pool_trim_interval_s,
418+
self.trim_cupy_memory_pool
419+
)
409420

410421
def register_services(self) -> None:
411422
service_masked = self._resolve_service_name('masked_replace')
@@ -990,6 +1001,9 @@ def update_variance(self) -> None:
9901001
def update_time(self) -> None:
9911002
self._map.update_time()
9921003

1004+
def trim_cupy_memory_pool(self) -> None:
1005+
self._map.trim_memory_pool()
1006+
9931007
def destroy_node(self) -> None:
9941008
super().destroy_node()
9951009

0 commit comments

Comments
 (0)