xgboost
| 命名空间 | 枚举
host_device_vector.h 文件参考

一个设备和主机向量抽象层。 更多...

#include <xgboost/context.h>
#include <xgboost/span.h>
#include <initializer_list>
#include <type_traits>
#include <vector>
host_device_vector.h 的包含依赖图
此图显示了哪些文件直接或间接包含此文件

转到此文件的源代码。

类  xgboost::HostDeviceVector< T >
 

命名空间

 xgboost
 用于多目标树的核心数据结构。
 

枚举

枚举  xgboost::GPUAccess { xgboost::kNone , xgboost::kRead , xgboost::kWrite }
 控制来自 GPU 的数据访问。 更多...
 

详细描述

一个设备和主机向量抽象层。

版权所有 2017-2019 XGBoost 贡献者

为什么选择 HostDeviceVector?
使用 CUDA 时,必须通过 'cudaMemcpy' 调用显式管理内存。此包装类对用户隐藏了这种管理,从而使其易于在单个接口下集成 GPU/CPU 的使用。

初始化/分配
可以在构造函数期间选择在 CPU 或 GPU 上初始化向量。(使用 'devices' 参数)或者,可以选择使用 'Resize' 方法显式分配/调整内存大小,并使用 'SetDevice' 方法指定设备。

访问底层数据
使用 'HostVector' 方法显式查询底层的 std::vector。如果需要原始设备指针,请使用 'DevicePointer' 方法。有关这些调用的性能影响,请参阅下文。

访问底层数据及其性能影响
这里有 4 种情况需要考虑: HostVector 和数据在 CPU 上 --> 没有问题,std::vector 会立即返回 HostVector 但数据在 GPU 上 --> 这会在内部触发一次 cudaMemcpy 调用。随后的 HostVector 调用不会产生此开销。(假设中间没有调用 'DevicePointer') DevicePointer 但数据在 CPU 上 --> 这会在内部触发一次 cudaMemcpy 调用。随后的 DevicePointer 调用不会产生此开销。(假设中间没有调用 'HostVector') DevicePointer 和数据在 GPU 上 --> 没有问题,设备指针会立即返回。

如果在没有 CUDA 的情况下编译 xgboost 会怎样?
在这种情况下,有一个特殊实现总是回退到使用 std::vector。此逻辑可在 host_device_vector.cc 中找到

为什么不考虑 CUDA 统一内存?
我们确实考虑过。但是,如果我们需要同时支持使用和不使用 CUDA 工具包编译,这会带来复杂性。在 host_device_vector.cc 中使用特殊实现的 'HostDeviceVector' 更容易。

注意
:Size 和 Devices 方法是线程安全的。