18 #include <rmm/detail/aligned.hpp>
19 #include <rmm/mr/device/device_memory_resource.hpp>
20 #include <rmm/mr/device/fixed_size_memory_resource.hpp>
22 #include <cuda_runtime_api.h>
38 template <
typename Upstream>
52 : upstream_mr_{[upstream_resource]() {
53 RMM_EXPECTS(
nullptr != upstream_resource,
"Unexpected null upstream pointer.");
54 return upstream_resource;
72 int8_t min_size_exponent,
73 int8_t max_size_exponent)
74 : upstream_mr_{[upstream_resource]() {
75 RMM_EXPECTS(
nullptr != upstream_resource,
"Unexpected null upstream pointer.");
76 return upstream_resource;
79 for (
auto i = min_size_exponent; i <= max_size_exponent; i++) {
116 [[nodiscard]] Upstream*
get_upstream() const noexcept {
return upstream_mr_; }
137 rmm::detail::align_up(allocation_size, rmm::detail::CUDA_ALLOCATION_ALIGNMENT);
139 if (
nullptr != bin_resource) {
140 resource_bins_.insert({allocation_size, bin_resource});
141 }
else if (resource_bins_.count(allocation_size) == 0) {
143 owned_bin_resources_.push_back(
145 resource_bins_.insert({allocation_size, owned_bin_resources_.back().get()});
160 auto iter = resource_bins_.lower_bound(bytes);
161 return (iter != resource_bins_.cend()) ? iter->second
176 if (bytes <= 0) {
return nullptr; }
177 return get_resource(bytes)->
allocate(bytes, stream);
190 void do_deallocate(
void* ptr, std::size_t bytes, cuda_stream_view stream)
override
192 auto res = get_resource(bytes);
193 if (res !=
nullptr) { res->deallocate(ptr, bytes, stream); }
204 [[nodiscard]] std::pair<std::size_t, std::size_t> do_get_mem_info(
205 cuda_stream_view stream)
const override
207 return std::make_pair(0, 0);
210 Upstream* upstream_mr_;
212 std::vector<std::unique_ptr<fixed_size_memory_resource<Upstream>>> owned_bin_resources_;
214 std::map<std::size_t, device_memory_resource*> resource_bins_;