owning_wrapper.hpp
前往此文件的文档。
1 /*
2  * 版权所有 (c) 2020-2025, NVIDIA CORPORATION.
3  *
4  * 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
5  * 除非遵守许可证的规定,否则您不得使用此文件。
6  * 您可以获取许可证的副本,网址为
7  *
8  * https://apache.ac.cn/licenses/LICENSE-2.0
9  *
10  * 除非适用法律要求或书面同意,否则,软件
11  * 根据许可证分发,是按“现状”基础分发,
12  * 不带任何明示或暗示的担保或条件。
13  * 有关管理权限和
14  * 限制的特定语言,请参见许可证。
15  */
16 #pragma once
17 
18 #include <rmm/detail/export.hpp>
20 
21 #include <memory>
22 #include <utility>
23 
24 namespace RMM_NAMESPACE {
25 namespace mr {
26 namespace detail {
42 template <typename Resource, typename UpstreamTuple, std::size_t... Indices, typename... Args>
43 auto make_resource_impl(UpstreamTuple const& upstreams,
44  std::index_sequence<Indices...>,
45  Args&&... args)
46 {
47  return std::make_unique<Resource>(std::get<Indices>(upstreams).get()...,
48  std::forward<Args>(args)...);
49 }
50 
63 template <typename Resource, typename... Upstreams, typename... Args>
64 auto make_resource(std::tuple<std::shared_ptr<Upstreams>...> const& upstreams, Args&&... args)
65 {
66  return make_resource_impl<Resource>(
67  upstreams, std::index_sequence_for<Upstreams...>{}, std::forward<Args>(args)...);
68 }
69 } // namespace detail
70 
104 template <typename Resource, typename... Upstreams>
106  public
108  std::tuple<std::shared_ptr<Upstreams>...>;
109 
143  template <typename... Args>
144  owning_wrapper(upstream_tuple upstreams, Args&&... args)
145  : upstreams_{std::move(upstreams)},
146  wrapped_{detail::make_resource<Resource>(upstreams_, std::forward<Args>(args)...)}
147  {
148  }
149 
153  [[nodiscard]] Resource const& wrapped() const noexcept { return *wrapped_; }
154 
158  [[nodiscard]] Resource& wrapped() noexcept { return *wrapped_; }
159 
160  private
171  void* do_allocate(std::size_t bytes, cuda_stream_view stream) override
172  {
173  return wrapped().allocate(bytes, stream);
174  }
175 
185  void do_deallocate(void* ptr, std::size_t bytes, cuda_stream_view stream) override
186  {
187  wrapped().deallocate(ptr, bytes, stream);
188  }
189 
199  [[nodiscard]] bool do_is_equal(device_memory_resource const& other) const noexcept override
200  {
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);
205  }
206 
207  upstream_tuple upstreams_;
208  std::unique_ptr<Resource> wrapped_;
209 };
210 
243 template <template <typename...> class Resource, typename... Upstreams, typename... Args>
244 auto make_owning_wrapper(std::tuple<std::shared_ptr<Upstreams>...> upstreams, Args&&... args)
245 {
246  return std::make_shared<owning_wrapper<Resource<Upstreams...>, Upstreams...>>(
247  std::move(upstreams), std::forward<Args>(args)...);
248 }
249 
265 template <template <typename> class Resource, typename Upstream, typename... Args>
266 auto make_owning_wrapper(std::shared_ptr<Upstream> upstream, Args&&... args)
267 {
268  return make_owning_wrapper<Resource>(std::make_tuple(std::move(upstream)),
269  std::forward<Args>(args)...);
270 }
271  // end of group
273 } // namespace mr
274 } // namespace RMM_NAMESPACE
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