函数
per_device_resource.hpp 文件参考

管理每设备 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>
per_device_resource.hpp 的包含依赖图
此图显示了哪些文件直接或间接包含了此文件

转到此文件的源代码。

函数

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`,并将它们设置为该设备的每设备资源。

std::vector<unique_ptr<pool_memory_resource>> per_device_pools;
for(int i = 0; i < N; ++i) {
cudaSetDevice(i);
per_device_pools.push_back(std::make_unique<pool_memory_resource>());
set_per_device_resource(cuda_device_id{i}, &per_device_pools.back());
}
device_memory_resource * set_per_device_resource(cuda_device_id device_id, device_memory_resource *new_mr)
为指定设备设置 device_memory_resource。
定义: per_device_resource.hpp:248
std::vector<unique_ptr<pool_mr>> per_device_pools;
for(int i = 0; i < N; ++i) {
cudaSetDevice(i);
// 注意:为简洁起见,省略了 upstream 的创建和 initial_size 的计算
per_device_pools.push_back(std::make_unique<pool_mr>(upstream, initial_size));
set_per_device_resource(cuda_device_id{i}, &per_device_pools.back());
}
一个合并最佳适配子分配器,它使用从上游内存资源分配的内存池...
定义: pool_memory_resource.hpp:105

函数文档

◆ get_map()

auto& rmm::mr::detail::get_map ( )
inline

设备 ID 到资源的映射的引用。

返回值
设备 ID 到资源的映射的引用

◆ get_ref_map()

auto& rmm::mr::detail::get_ref_map ( )
inline

设备 ID 到 resource_ref 的映射的引用。

返回值
设备 ID 到 resource_ref 的映射的引用

◆ initial_resource()

device_memory_resource* rmm::mr::detail::initial_resource ( )
inline

返回指向初始资源的指针。

返回 `cuda_memory_resource` 的全局实例作为函数局部静态。

返回值
指向用作初始默认资源的静态 cuda_memory_resource 的指针

◆ map_lock()

std::mutex& rmm::mr::detail::map_lock ( )
inline

锁的引用。

返回值
锁的引用

◆ ref_map_lock()

std::mutex& rmm::mr::detail::ref_map_lock ( )
inline

锁的引用。

返回值
锁的引用