xgboost
|
一个设备和主机向量抽象层。 更多...
#include <xgboost/context.h>
#include <xgboost/span.h>
#include <initializer_list>
#include <type_traits>
#include <vector>
类 | |
类 | 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' 更容易。