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
 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”更容易。

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