Skip to content

Commit 2ab41d3

Browse files
committed
Add a logging adaptor unique_ptr in memory_manager to make sure it gets cleaned up.
1 parent f4d31ef commit 2ab41d3

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

include/rmm/detail/memory_manager.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ namespace rmm
240240
bool is_initialized{false};
241241

242242
std::unique_ptr<rmm::mr::device_memory_resource> initialized_resource{};
243+
std::unique_ptr<rmm::mr::device_memory_resource> logging_adaptor{};
243244
};
244245
}
245246

src/memory_manager.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,21 @@ rmmError_t Manager::registerStream(cudaStream_t stream) {
103103
}
104104

105105
// reset the initialized resource, optionally enabling logging via logging_resource_adaptor
106+
// note this is a template function so we avoid a vtable lookup on every logging allocation
107+
// That means it needs to be a free function since memory_manager.hpp cannot include
108+
// `logging_resource_adaptor.hpp` (since it depends on spdlog)
106109
template <typename MemoryResource>
107110
void reset_resource(std::unique_ptr<mr::device_memory_resource>& initialized_resource,
111+
std::unique_ptr<mr::device_memory_resource>& logging_resource,
108112
MemoryResource *mr,
109113
bool enable_logging) {
114+
initialized_resource.reset(mr);
110115
if (enable_logging) {
111-
initialized_resource.reset(new rmm::mr::logging_resource_adaptor<MemoryResource>(mr));
116+
auto lmr = new rmm::mr::logging_resource_adaptor<MemoryResource>(mr);
117+
logging_resource.reset(lmr);
118+
rmm::mr::set_default_resource(lmr);
112119
} else {
113-
initialized_resource.reset(mr);
120+
rmm::mr::set_default_resource(mr);
114121
}
115122
}
116123

@@ -130,14 +137,16 @@ void Manager::initialize(const rmmOptions_t* new_options) {
130137
auto const& devices = getOptions().devices;
131138

132139
if (useManagedMemory()) {
133-
reset_resource(initialized_resource, new pool_managed_mr(pool_size, devices), enable_logging);
140+
reset_resource(initialized_resource, logging_adaptor,
141+
new pool_managed_mr(pool_size, devices), enable_logging);
134142
} else {
135-
reset_resource(initialized_resource, new pool_mr(pool_size, devices), enable_logging);
143+
reset_resource(initialized_resource, logging_adaptor,
144+
new pool_mr(pool_size, devices), enable_logging);
136145
}
137146
} else if (rmm::Manager::useManagedMemory()) {
138-
reset_resource(initialized_resource, new managed_mr(), enable_logging);
147+
reset_resource(initialized_resource, logging_adaptor, new managed_mr(), enable_logging);
139148
} else {
140-
reset_resource(initialized_resource, new cuda_mr(), enable_logging);
149+
reset_resource(initialized_resource, logging_adaptor, new cuda_mr(), enable_logging);
141150
}
142151

143152
rmm::mr::set_default_resource(initialized_resource.get());

0 commit comments

Comments
 (0)