Attention
The vector search and clustering algorithms in RAFT are being migrated to a new library dedicated to vector search called cuVS. We will continue to support the vector search algorithms in RAFT during this move, but will no longer update them after the RAPIDS 24.06 (June) release. We plan to complete the migration by RAPIDS 24.08 (August) release.
Resources#
All resources which are specific to a computing environment like host or device are contained within, and managed by,
raft::resources
. This design simplifies the APIs and eases user burden by making the APIs opaque by default but allowing customization based on user preference.
Vocabulary#
#include <raft/core/resource/resource_types.hpp>
namespace raft::resource
- enum resource_type#
Resource types can apply to any resource and don’t have to be host- or device-specific.
Values:
- enumerator CUBLAS_HANDLE#
- enumerator CUSOLVER_DN_HANDLE#
- enumerator CUSOLVER_SP_HANDLE#
- enumerator CUSPARSE_HANDLE#
- enumerator CUDA_STREAM_VIEW#
- enumerator CUDA_STREAM_POOL#
- enumerator CUDA_STREAM_SYNC_EVENT#
- enumerator COMMUNICATOR#
- enumerator SUB_COMMUNICATOR#
- enumerator DEVICE_PROPERTIES#
- enumerator DEVICE_ID#
- enumerator STREAM_VIEW#
- enumerator THRUST_POLICY#
- enumerator WORKSPACE_RESOURCE#
- enumerator CUBLASLT_HANDLE#
- enumerator CUSTOM#
- enumerator LAST_KEY#
- class resource#
#include <resource_types.hpp>A resource constructs and contains an instance of some pre-determined object type and facades that object behind a common API.
Subclassed by raft::resource::comms_resource, raft::resource::cublas_resource, raft::resource::cublaslt_resource, raft::resource::cuda_event_resource, raft::resource::cuda_stream_pool_resource, raft::resource::cuda_stream_resource, raft::resource::cusolver_dn_resource, raft::resource::cusolver_sp_resource, raft::resource::cusparse_resource, raft::resource::custom_resource, raft::resource::device_id_resource, raft::resource::device_properties_resource, raft::resource::empty_resource, raft::resource::limiting_memory_resource, raft::resource::stream_view_resource, raft::resource::sub_comms_resource, raft::resource::thrust_policy_resource
- class resource_factory#
#include <resource_types.hpp>A resource factory knows how to construct an instance of a specific raft::resource::resource.
Subclassed by raft::resource::comms_resource_factory, raft::resource::cublas_resource_factory, raft::resource::cublaslt_resource_factory, raft::resource::cuda_stream_pool_resource_factory, raft::resource::cuda_stream_resource_factory, raft::resource::cusolver_dn_resource_factory, raft::resource::cusolver_sp_resource_factory, raft::resource::cusparse_resource_factory, raft::resource::custom_resource_factory, raft::resource::device_id_resource_factory, raft::resource::device_properties_resource_factory, raft::resource::empty_resource_factory, raft::resource::stream_view_resource_factory, raft::resource::sub_comms_resource_factory, raft::resource::thrust_policy_resource_factory, raft::resource::workspace_resource_factory
Public Functions
- virtual resource_type get_resource_type() = 0#
Return the resource_type associated with the current factory.
- Returns:
resource_type corresponding to the current factory
- virtual resource *make_resource() = 0#
Construct an instance of the factory’s underlying resource.
- Returns:
resource instance
- class empty_resource_factory : public raft::resource::resource_factory#
#include <resource_types.hpp>A resource factory knows how to construct an instance of a specific raft::resource::resource.
Public Functions
- inline virtual resource_type get_resource_type() override#
Return the resource_type associated with the current factory.
- Returns:
resource_type corresponding to the current factory
- inline virtual resource *make_resource() override#
Construct an instance of the factory’s underlying resource.
- Returns:
resource instance
Device Resources#
raft::device_resources
is a convenience over using raft::resources
directly. It provides accessor methods to retrieve resources such as the CUDA stream, stream pool, and handles to the various CUDA math libraries like cuBLAS and cuSOLVER.
#include <raft/core/device_resources.hpp>
namespace raft::core
-
class device_resources : public raft::resources#
Main resource container object that stores all necessary resources used for calling necessary device functions, cuda kernels and/or libraries.
Public Functions
Construct a resources instance with a stream view and stream pool.
- Parameters:
stream_view – the default stream (which has the default per-thread stream if unspecified)
stream_pool – [in] the stream pool used (which has default of nullptr if unspecified)
workspace_resource – [in] an optional resource used by some functions for allocating temporary workspaces.
allocation_limit – [in] the total amount of memory in bytes available to the temporary workspace resources.
-
inline virtual ~device_resources()#
Destroys all held-up resources
-
inline void sync_stream(rmm::cuda_stream_view stream) const#
synchronize a stream on the current container
-
inline void sync_stream() const#
synchronize main stream on the current container
-
inline rmm::cuda_stream_view get_stream() const#
returns main stream on the current container
-
inline bool is_stream_pool_initialized() const#
returns whether stream pool was initialized on the current container
-
inline const rmm::cuda_stream_pool &get_stream_pool() const#
returns stream pool on the current container
-
inline rmm::cuda_stream_view get_stream_from_stream_pool() const#
return stream from pool
-
inline rmm::cuda_stream_view get_stream_from_stream_pool(std::size_t stream_idx) const#
return stream from pool at index
-
inline rmm::cuda_stream_view get_next_usable_stream() const#
return stream from pool if size > 0, else main stream on current container
-
inline rmm::cuda_stream_view get_next_usable_stream(std::size_t stream_idx) const#
return stream from pool at index if size > 0, else main stream on current container
- Parameters:
stream_idx – [in] the required index of the stream in the stream pool if available
-
inline void sync_stream_pool() const#
synchronize the stream pool on the current container
-
inline void sync_stream_pool(const std::vector<std::size_t> stream_indices) const#
synchronize subset of stream pool
- Parameters:
stream_indices – [in] the indices of the streams in the stream pool to synchronize
-
inline void wait_stream_pool_on_stream() const#
ask stream pool to wait on last event in main stream
Device Resources Manager#
While raft::device_resources
provides a convenient way to access
device-related resources for a sequence of RAFT calls, it is sometimes useful
to be able to limit those resources across an entire application. For
instance, in highly multi-threaded applications, it can be helpful to limit
the total number of streams rather than relying on the default stream per
thread. raft::device_resources_manager
offers a way to access
raft::device_resources
instances that draw from a limited pool of
underlying device resources.
#include <raft/core/device_resources_manager.hpp>
namespace raft::core
Warning
doxygenclass: Cannot find class “raft::device_resources_manager” in doxygen xml output for project “RAFT” from directory: ../../cpp/doxygen/_xml/
Resource Functions#
Comms#
#include <raft/core/resource/comms.hpp>
namespace raft::resource
cuBLAS Handle#
#include <raft/core/resource/cublas_handle.hpp>
namespace raft::resource
- inline cublasHandle_t get_cublas_handle(resources const &res)#
Load a
cublasHandle_t
from raft res if it exists, otherwise add it and return it.
- Parameters:
res – [in] the raft resources object
- Returns:
cublas handle
cuBLASLt Handle#
#include <raft/core/resource/cublaslt_handle.hpp>
namespace raft::resource
- inline auto get_cublaslt_handle(resources const &res) -> cublasLtHandle_t#
Load a
cublasLtHandle_t
from raft res if it exists, otherwise add it and return it.
- Parameters:
res – [in] the raft resources object
- Returns:
cublasLt handle
CUDA Stream#
#include <raft/core/resource/cuda_stream.hpp>
namespace raft::resource
- inline rmm::cuda_stream_view get_cuda_stream(resources const &res)#
Load a rmm::cuda_stream_view from a resources instance (and populate it on the res if needed).
- Parameters:
res – raft res object for managing resources
- Returns:
- inline void set_cuda_stream(resources const &res, rmm::cuda_stream_view stream_view)#
Load a rmm::cuda_stream_view from a resources instance (and populate it on the res if needed).
- Parameters:
res – [in] raft resources object for managing resources
stream_view – cuda stream view
- inline void sync_stream(const resources &res, rmm::cuda_stream_view stream)#
synchronize a specific stream
- Parameters:
res – [in] the raft resources object
stream – [in] stream to synchronize
- inline void sync_stream(const resources &res)#
synchronize main stream on the resources instance
CUDA Stream Pool#
#include <raft/core/resource/cuda_stream_pool.hpp>
namespace raft::resource
-
inline const rmm::cuda_stream_pool &get_cuda_stream_pool(const resources &res)#
Load a cuda_stream_pool, and create a new one if it doesn’t already exist
- Parameters:
res – raft res object for managing resources
- Returns:
Explicitly set a stream pool on the current res. Note that this will overwrite an existing stream pool on the res.
- Parameters:
res –
stream_pool –
-
inline std::size_t get_stream_pool_size(const resources &res)#
-
inline rmm::cuda_stream_view get_stream_from_stream_pool(const resources &res)#
return stream from pool
-
inline rmm::cuda_stream_view get_stream_from_stream_pool(const resources &res, std::size_t stream_idx)#
return stream from pool at index
-
inline rmm::cuda_stream_view get_next_usable_stream(const resources &res)#
return stream from pool if size > 0, else main stream on res
-
inline rmm::cuda_stream_view get_next_usable_stream(const resources &res, std::size_t stream_idx)#
return stream from pool at index if size > 0, else main stream on res
- Parameters:
res – [in] the raft resources object
stream_idx – [in] the required index of the stream in the stream pool if available
-
inline void sync_stream_pool(const resources &res)#
synchronize the stream pool on the res
- Parameters:
res – [in] the raft resources object
-
inline void sync_stream_pool(const resources &res, const std::vector<std::size_t> stream_indices)#
synchronize subset of stream pool
- Parameters:
res – [in] the raft resources object
stream_indices – [in] the indices of the streams in the stream pool to synchronize
-
inline void wait_stream_pool_on_stream(const resources &res)#
ask stream pool to wait on last event in main stream
- Parameters:
res – [in] the raft resources object
cuSolverDn Handle#
#include <raft/core/resource/cusolver_dn_handle.hpp>
namespace raft::resource
- inline cusolverDnHandle_t get_cusolver_dn_handle(resources const &res)#
Load a cusolverSpres_t from raft res if it exists, otherwise add it and return it.
- Parameters:
res – [in] the raft resources object
- Returns:
cusolver dn handle
- class cusolver_dn_resource_factory : public raft::resource::resource_factory#
#include <cusolver_dn_handle.hpp>Factory that knows how to construct a specific raft::resource to populate the res_t.
Public Functions
- inline virtual resource_type get_resource_type() override#
Return the resource_type associated with the current factory.
- Returns:
resource_type corresponding to the current factory
- inline virtual resource *make_resource() override#
Construct an instance of the factory’s underlying resource.
- Returns:
resource instance
cuSolverSp Handle#
#include <raft/core/resource/cusolver_sp_handle.hpp>
namespace raft::resource
- inline cusolverSpHandle_t get_cusolver_sp_handle(resources const &res)#
Load a cusolverSpres_t from raft res if it exists, otherwise add it and return it.
- Parameters:
res – [in] the raft resources object
- Returns:
cusolver sp handle
cuSparse Handle#
#include <raft/core/resource/cusparse_handle.hpp>
namespace raft::resource
- inline cusparseHandle_t get_cusparse_handle(resources const &res)#
Load a cusparseres_t from raft res if it exists, otherwise add it and return it.
- Parameters:
res – [in] the raft resources object
- Returns:
cusparse handle
Device ID#
#include <raft/core/resource/device_id.hpp>
namespace raft::resource
- inline int get_device_id(resources const &res)#
Load a device id from a res (and populate it on the res if needed).
- Parameters:
res – raft res object for managing resources
- Returns:
device id
Device Memory Resource#
#include <raft/core/resource/device_memory_resource.hpp>
namespace raft::resource
- inline auto get_workspace_resource(resources const &res) -> rmm::mr::limiting_resource_adaptor<rmm::mr::device_memory_resource>*#
Load a temp workspace resource from a resources instance (and populate it on the res if needed).
- Parameters:
res – raft resources object for managing resources
- Returns:
device memory resource object
- inline auto get_workspace_total_bytes(resources const &res) -> size_t#
Get the total size of the workspace resource.
- inline auto get_workspace_used_bytes(resources const &res) -> size_t#
Get the already allocated size of the workspace resource.
- inline auto get_workspace_free_bytes(resources const &res) -> size_t#
Get the available size of the workspace resource.
Set a temporary workspace resource on a resources instance.
- Parameters:
res – raft resources object for managing resources
mr – an optional RMM device_memory_resource
allocation_limit – the total amount of memory in bytes available to the temporary workspace resources.
alignment – optional alignment requirements passed to RMM allocations
- inline void set_workspace_to_pool_resource(resources const &res, std::optional<std::size_t> allocation_limit = std::nullopt)#
Set the temporary workspace resource to a pool on top of the global memory resource (
rmm::mr::get_current_device_resource()
.
- Parameters:
res – raft resources object for managing resources
allocation_limit – the total amount of memory in bytes available to the temporary workspace resources; if not provided, a last used or default limit is used.
- inline void set_workspace_to_global_resource(resources const &res, std::optional<std::size_t> allocation_limit = std::nullopt)#
Set the temporary workspace resource the same as the global memory resource (
rmm::mr::get_current_device_resource()
.Note, the workspace resource is always limited; the limit here defines how much of the global memory resource can be consumed by the workspace allocations.
- Parameters:
res – raft resources object for managing resources
allocation_limit – the total amount of memory in bytes available to the temporary workspace resources.
- class limiting_memory_resource : public raft::resource::resource#
#include <device_memory_resource.hpp>
- class workspace_resource_factory : public raft::resource::resource_factory#
#include <device_memory_resource.hpp>Factory that knows how to construct a specific raft::resource to populate the resources instance.
Public Functions
- inline virtual auto get_resource_type() -> resource_type override#
Return the resource_type associated with the current factory.
- Returns:
resource_type corresponding to the current factory
- inline virtual auto make_resource() -> resource* override#
Construct an instance of the factory’s underlying resource.
- Returns:
resource instance
Public Static Functions
- static inline auto default_pool_resource(std::size_t limit) -> std::shared_ptr<rmm::mr::device_memory_resource>#
Construct a sensible default pool memory resource.
- static inline auto default_plain_resource() -> std::shared_ptr<rmm::mr::device_memory_resource>#
Get the global memory resource wrapped into an unmanaged shared_ptr (with no deleter).
Note: the lifetime of the underlying
rmm::mr::get_current_device_resource()
is managed somewhere else, since it’s passed by a raw pointer. Hence, this shared_ptr wrapper is not allowed to delete the pointer on destruction.
Device Properties#
#include <raft/core/resource/device_properties.hpp>
namespace raft::resource
- inline cudaDeviceProp &get_device_properties(resources const &res)#
Load a cudaDeviceProp from a res (and populate it on the res if needed).
- Parameters:
res – raft res object for managing resources
- Returns:
populated cuda device properties instance
- class device_properties_resource_factory : public raft::resource::resource_factory#
#include <device_properties.hpp>Factory that knows how to construct a specific raft::resource to populate the res_t.
Public Functions
- inline virtual resource_type get_resource_type() override#
Return the resource_type associated with the current factory.
- Returns:
resource_type corresponding to the current factory
- inline virtual resource *make_resource() override#
Construct an instance of the factory’s underlying resource.
- Returns:
resource instance
Sub Communicators#
#include <raft/core/resource/sub_comms.hpp>
namespace raft::resource
- inline const comms::comms_t &get_subcomm(const resources &res, std::string key)#
Thrust Exec Policy#
#include <raft/core/resource/thrust_policy.hpp>
namespace raft::resource
- inline rmm::exec_policy &get_thrust_policy(resources const &res)#
Load a thrust policy from a res (and populate it on the res if needed).
- Parameters:
res – raft res object for managing resources
- Returns:
thrust execution policy