| xgboost | 
一个设备与主机向量抽象层。更多...
#include <xgboost/context.h>#include <xgboost/span.h>#include <initializer_list>#include <type_traits>#include <vector>

| 类 | |
| 类 | xgboost::HostDeviceVector< T > | 
| 命名空间 | |
| xgboost | |
| Learner 接口,将目标、gbm 和评估整合在一起。这是用户界面 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 上 --> 没问题,将立即返回设备指针。
如果 xgboost 在没有 CUDA 的情况下编译怎么办?
在这种情况下,有一个特殊的实现,它总是回退到使用 std::vector。此逻辑可以在 host_device_vector.cc 中找到。
为什么不考虑 CUDA 统一内存?
我们确实考虑过。然而,如果我们需要同时支持有和没有 CUDA 工具包的编译,它会带来复杂性。使用 host_device_vector.cc 中的特殊实现“HostDeviceVector”更容易。