18 #include <rmm/detail/export.hpp>
24 namespace RMM_NAMESPACE {
42 template <
typename Resource,
typename UpstreamTuple, std::size_t... Indices,
typename... Args>
44 std::index_sequence<Indices...>,
47 return std::make_unique<Resource>(std::get<Indices>(upstreams).get()...,
48 std::forward<Args>(args)...);
63 template <
typename Resource,
typename... Upstreams,
typename... Args>
64 auto make_resource(std::tuple<std::shared_ptr<Upstreams>...>
const& upstreams, Args&&... args)
66 return make_resource_impl<Resource>(
67 upstreams, std::index_sequence_for<Upstreams...>{}, std::forward<Args>(args)...);
104 template <
typename Resource,
typename... Upstreams>
108 std::tuple<std::shared_ptr<Upstreams>...>;
143 template <
typename... Args>
145 : upstreams_{std::move(upstreams)},
146 wrapped_{detail::make_resource<Resource>(upstreams_, std::forward<Args>(args)...)}
153 [[nodiscard]] Resource
const&
wrapped() const noexcept {
return *wrapped_; }
158 [[nodiscard]] Resource&
wrapped() noexcept {
return *wrapped_; }
173 return wrapped().allocate(bytes, stream);
185 void do_deallocate(
void* ptr, std::size_t bytes,
cuda_stream_view stream)
override
187 wrapped().deallocate(ptr, bytes, stream);
199 [[nodiscard]]
bool do_is_equal(device_memory_resource
const& other)
const noexcept
override
201 if (
this == &other) {
return true; }
202 auto casted =
dynamic_cast<owning_wrapper<Resource, Upstreams...
> const*>(&other);
203 if (
nullptr != casted) {
return wrapped().is_equal(casted->wrapped()); }
204 return wrapped().is_equal(other);
207 upstream_tuple upstreams_;
208 std::unique_ptr<Resource> wrapped_;
243 template <
template <
typename...>
class Resource,
typename... Upstreams,
typename... Args>
246 return std::make_shared<
owning_wrapper<Resource<Upstreams...>, Upstreams...>>(
247 std::move(upstreams), std::forward<Args>(args)...);
265 template <
template <
typename>
class Resource,
typename Upstream,
typename... Args>
268 return make_owning_wrapper<Resource>(std::make_tuple(std::move(upstream)),
269 std::forward<Args>(args)...);
CUDA 流的强类型非拥有包装器,带默认构造函数。
定义: cuda_stream_view.hpp:39
librmm 设备内存分配的所有基类。
定义: device_memory_resource.hpp:92
维护上游资源生命周期的资源适配器。
定义: owning_wrapper.hpp:105
Resource const & wrapped() const noexcept
对包装资源的常量引用。
定义: owning_wrapper.hpp:153
std::tuple< std::shared_ptr< Upstreams >... > upstream_tuple
上游内存资源的元组。
定义: owning_wrapper.hpp:108
Resource & wrapped() noexcept
对包装资源的引用。
定义: owning_wrapper.hpp:158
owning_wrapper(upstream_tuple upstreams, Args &&... args)
使用提供的上游资源和任何转发的其他参数构建包装的资源...
定义: owning_wrapper.hpp:144
auto make_owning_wrapper(std::shared_ptr< Upstream > upstream, Args &&... args)
当 Resource 只有一个上游资源时,owning_wrapper 的附加便利工厂。
定义: owning_wrapper.hpp:266
auto make_resource(std::tuple< std::shared_ptr< Upstreams >... > const &upstreams, Args &&... args)
创建指向 Resource 的 std::unique_ptr,使用给定的上游资源和参数。
定义: owning_wrapper.hpp:64
auto make_resource_impl(UpstreamTuple const &upstreams, std::index_sequence< Indices... >, Args &&... args)
将元组转换为参数包。
定义: owning_wrapper.hpp:43