18 #include <rmm/detail/error.hpp>
19 #include <rmm/detail/export.hpp>
20 #include <rmm/detail/stack_trace.hpp>
21 #include <rmm/logger.hpp>
30 #include <shared_mutex>
33 namespace RMM_NAMESPACE {
55 template <
typename Upstream>
59 std::shared_lock<std::shared_mutex>;
61 std::unique_lock<std::shared_mutex>;
69 std::unique_ptr<rmm::detail::stack_trace>
strace;
81 return capture_stack ? std::make_unique<rmm::detail::stack_trace>() :
nullptr;
83 allocation_size{size} {};
94 : capture_stacks_{capture_stacks}, allocated_bytes_{0}, upstream_{upstream}
108 : capture_stacks_{capture_stacks},
168 std::ostringstream oss;
170 if (!allocations_.empty()) {
171 for (
auto const& alloc : allocations_) {
172 oss << alloc.first <<
": " << alloc.second.allocation_size <<
" B";
173 if (alloc.second.strace !=
nullptr) {
174 oss <<
" : callstack:" << std::endl << *alloc.second.strace;
189 #if RMM_LOG_ACTIVE_LEVEL <= RMM_LOG_LEVEL_DEBUG
190 RMM_LOG_DEBUG(
"Outstanding Allocations: %s", get_outstanding_allocations_str());
210 void* ptr = get_upstream_resource().allocate_async(bytes, stream);
213 write_lock_t lock(mtx_);
214 allocations_.emplace(ptr, allocation_info{bytes, capture_stacks_});
216 allocated_bytes_ += bytes;
228 void do_deallocate(
void* ptr, std::size_t bytes, cuda_stream_view stream)
override
230 get_upstream_resource().deallocate_async(ptr, bytes, stream);
232 write_lock_t lock(mtx_);
234 const auto found = allocations_.find(ptr);
237 if (found == allocations_.end()) {
241 "Deallocating a pointer that was not tracked. Ptr: %p [%zuB], Current Num. Allocations: "
245 this->allocations_.size());
247 allocations_.erase(found);
249 auto allocated_bytes = found->second.allocation_size;
251 if (allocated_bytes != bytes) {
255 "Alloc bytes (%zu) and Dealloc bytes (%zu) do not match", allocated_bytes, bytes);
257 bytes = allocated_bytes;
261 allocated_bytes_ -= bytes;
271 bool do_is_equal(device_memory_resource
const& other)
const noexcept
override
273 if (
this == &other) {
return true; }
274 auto cast =
dynamic_cast<tracking_resource_adaptor<Upstream> const*
>(&other);
275 if (cast ==
nullptr) {
return false; }
276 return get_upstream_resource() == cast->get_upstream_resource();
279 bool capture_stacks_;
280 std::map<void*, allocation_info> allocations_;
281 std::atomic<std::size_t> allocated_bytes_;
282 std::shared_mutex
mutable mtx_;
CUDA 流的强类型非拥有包装器,带默认构造函数。
定义: cuda_stream_view.hpp:39
所有 librmm 设备内存分配的基类。
定义: device_memory_resource.hpp:92
使用 Upstream 分配内存并跟踪分配的资源。
定义: tracking_resource_adaptor.hpp:56
tracking_resource_adaptor(Upstream *upstream, bool capture_stacks=false)
构造一个新的跟踪资源适配器,使用 upstream 来满足分配请求。
定义: tracking_resource_adaptor.hpp:107
tracking_resource_adaptor(device_async_resource_ref upstream, bool capture_stacks=false)
构造一个新的跟踪资源适配器,使用 upstream 来满足分配请求。
定义: tracking_resource_adaptor.hpp:93
std::size_t get_allocated_bytes() const noexcept
查询已分配的字节数。请注意,这不能用于了解有多大...
定义: tracking_resource_adaptor.hpp:152
std::unique_lock< std::shared_mutex > write_lock_t
用于同步写访问的锁类型。
定义: tracking_resource_adaptor.hpp:61
tracking_resource_adaptor(tracking_resource_adaptor &&) noexcept=default
默认移动构造函数。
std::string get_outstanding_allocations_str() const
获取一个字符串,其中包含未完成的分配指针、它们的大小以及可选的调用栈...
定义: tracking_resource_adaptor.hpp:164
std::map< void *, allocation_info > const & get_outstanding_allocations() const noexcept
获取未完成的分配映射。
定义: tracking_resource_adaptor.hpp:138
void log_outstanding_allocations() const
通过 RMM_LOG_DEBUG 记录任何未完成的分配。
定义: tracking_resource_adaptor.hpp:187
std::shared_lock< std::shared_mutex > read_lock_t
用于同步读访问的锁类型。
定义: tracking_resource_adaptor.hpp:59
cuda::mr::async_resource_ref< cuda::mr::device_accessible > device_async_resource_ref
具有 cuda::mr::device_accessible 属性的 cuda::mr::async_resource_ref 的别名。
定义: resource_ref.hpp:40
device_async_resource_ref to_device_async_resource_ref_checked(Resource *res)
将内存资源指针转换为 device_async_resource_ref,检查是否为 nullptr
定义: resource_ref.hpp:78
管理每设备的 device_memory_resource。
关于分配存储的信息。包括大小以及如果跟踪资源启用了捕获调用栈,则还包括调用栈。
定义: tracking_resource_adaptor.hpp:68
std::unique_ptr< rmm::detail::stack_trace > strace
分配的调用栈。
定义: tracking_resource_adaptor.hpp:69
std::size_t allocation_size
分配的大小。
定义: tracking_resource_adaptor.hpp:70
allocation_info(std::size_t size, bool capture_stack)
构造一个新的 allocation info 对象。
定义: tracking_resource_adaptor.hpp:79