管理每设备 device_memory_resource
。更多...
#include <rmm/cuda_device.hpp>
#include <rmm/detail/export.hpp>
#include <rmm/mr/device/cuda_memory_resource.hpp>
#include <rmm/mr/device/device_memory_resource.hpp>
#include <rmm/resource_ref.hpp>
#include <map>
#include <mutex>
函数 | |
device_memory_resource * | rmm::mr::detail::initial_resource () |
返回指向初始资源的指针。更多... | |
std::mutex & | rmm::mr::detail::map_lock () |
锁的引用。更多... | |
auto & | rmm::mr::detail::get_map () |
设备 ID 到资源的映射的引用。更多... | |
std::mutex & | rmm::mr::detail::ref_map_lock () |
锁的引用。更多... | |
auto & | rmm::mr::detail::get_ref_map () |
设备 ID 到 resource_ref 的映射的引用。更多... | |
device_memory_resource * | rmm::mr::get_per_device_resource (cuda_device_id device_id) |
获取指定设备的资源。更多... | |
device_memory_resource * | rmm::mr::set_per_device_resource (cuda_device_id device_id, device_memory_resource *new_mr) |
为指定设备设置 device_memory_resource 。更多... | |
device_memory_resource * | rmm::mr::get_current_device_resource () |
获取当前设备的内存资源。更多... | |
device_memory_resource * | rmm::mr::set_current_device_resource (device_memory_resource *new_mr) |
设置当前设备的内存资源。更多... | |
device_async_resource_ref | rmm::mr::get_per_device_resource_ref (cuda_device_id device_id) |
获取指定设备的 device_async_resource_ref 。更多... | |
device_async_resource_ref | rmm::mr::set_per_device_resource_ref (cuda_device_id device_id, device_async_resource_ref new_resource_ref) |
将指定设备的 device_async_resource_ref 设置为 new_resource_ref 。更多... | |
device_async_resource_ref | rmm::mr::get_current_device_resource_ref () |
获取当前设备的 device_async_resource_ref 。更多... | |
device_async_resource_ref | rmm::mr::set_current_device_resource_ref (device_async_resource_ref new_resource_ref) |
设置当前设备的 device_async_resource_ref 。更多... | |
device_async_resource_ref | rmm::mr::reset_per_device_resource_ref (cuda_device_id device_id) |
将指定设备的 device_async_resource_ref 重置为初始资源。更多... | |
device_async_resource_ref | rmm::mr::reset_current_device_resource_ref () |
将当前设备的 device_async_resource_ref 重置为初始资源。更多... | |
管理每设备 device_memory_resource
。
您可能希望构建一个 device_memory_resource
并将其用于(解除)分配,而无需显式依赖注入,即无需将该对象的引用传递到所有使用它的地方。相反,您可能希望将您的资源设置为“默认”资源,并在未显式指定其他资源的所有地方使用它。在同一进程中具有多个 GPU 的应用程序中,可能还需要为每个设备维护独立的默认资源。为此,`set_per_device_resource` 和 `get_per_device_resource` 函数能够将 CUDA 设备 ID 映射到 `device_memory_resource` 指针。
例如,给定指向 `device_memory_resource` 对象的指针 `mr`,调用 `set_per_device_resource(cuda_device_id{0}, mr)` 将在 CUDA 设备 0 和 `mr` 之间建立映射,以便将来所有对 `get_per_device_resource(cuda_device_id{0})` 的调用都将返回同一个指针 `mr`。通过这种方式,所有使用 `get_per_device_resource` 返回的资源进行(解除)分配的地方都将使用用户提供的资源 `mr`。
device_memory_resource
在进行 CUDA API 调用时不会设置当前的 CUDA 设备。因此,内存资源只能在其创建时处于活动状态的当前 CUDA 设备一起使用。只有当 `id` 指的是创建 `mr` 时处于活动状态的 CUDA 设备时,调用 `set_per_device_resource(id, mr)` 才有效。如果未为 `id` 指定的给定设备显式设置资源,则 `get_per_device_resource(id)` 将返回指向 `cuda_memory_resource` 的指针。
要获取和修改当前 CUDA 设备的资源,get_current_device_resource()
和 set_current_device_resource()
会自动使用 `cudaGetDevice()` 返回的当前 CUDA 设备 ID。
RMM 正在过渡到使用 `cuda::mr::async_resource_ref` 代替指向 `device_memory_resource` 的原始指针。`set_per_device_resource_ref`、`get_per_device_resource_ref`、`get_current_device_resource_ref`、`set_current_device_resource_ref` 和 `reset_current_device_resource_ref` 函数提供了与其 `device_memory_resource` 对应项相同的功能,但使用了 `device_async_resource_ref` 对象。原始指针版本和 `resource_ref` 版本维护不同的状态,不可互换。原始指针版本预计将在未来版本中弃用并移除。
为每个设备创建 `device_memory_resource` 需要注意在创建每个资源之前设置当前设备,并保持这些资源的生命周期,只要它们被设置为每设备资源。以下是一个示例循环,它为每个设备创建指向 `pool_memory_resource` 对象的 `unique_ptr`,并将它们设置为该设备的每设备资源。
|
inline |
设备 ID 到资源的映射的引用。
|
inline |
设备 ID 到 resource_ref 的映射的引用。
|
inline |
返回指向初始资源的指针。
返回 `cuda_memory_resource` 的全局实例作为函数局部静态。
|
inline |
锁的引用。
|
inline |
锁的引用。