xgboost
|
Span 类实现,基于 ISO++20 span<T>。接口应保持一致。 更多...
#include <span.h>
公共类型 | |
using | element_type = T |
using | value_type = typename std::remove_cv< T >::type |
using | index_type = std::size_t |
using | difference_type = detail::ptrdiff_t |
using | pointer = T * |
using | reference = T & |
using | iterator = detail::SpanIterator< Span< T, Extent >, false > |
using | const_iterator = const detail::SpanIterator< Span< T, Extent >, true > |
using | reverse_iterator = std::reverse_iterator< iterator > |
using | const_reverse_iterator = const std::reverse_iterator< const_iterator > |
公共成员函数 | |
constexpr | Span ()=default |
XGBOOST_DEVICE | Span (pointer _ptr, index_type _count) |
XGBOOST_DEVICE | Span (pointer _first, pointer _last) |
template<std::size_t N> | |
constexpr XGBOOST_DEVICE | Span (element_type(&arr)[N]) __span_noexcept |
template<class Container > | |
Span (Container &_cont) | |
template<class Container > | |
Span (const Container &_cont) | |
template<class U , std::size_t OtherExtent, class = typename std::enable_if_t< detail::IsAllowedElementTypeConversion<U, T>::value && detail::IsAllowedExtentConversion<OtherExtent, Extent>::value>> | |
constexpr XGBOOST_DEVICE | Span (const Span< U, OtherExtent > &_other) __span_noexcept |
constexpr | Span (Span const &_other) noexcept(true)=default |
constexpr Span & | operator= (Span const &_other) noexcept(true)=default |
constexpr | Span (Span &&_other) noexcept(true)=default |
constexpr Span & | operator= (Span &&_other) noexcept(true)=default |
~Span () noexcept(true)=default | |
constexpr XGBOOST_DEVICE iterator | begin () const __span_noexcept |
constexpr XGBOOST_DEVICE iterator | end () const __span_noexcept |
constexpr XGBOOST_DEVICE const_iterator | cbegin () const __span_noexcept |
constexpr XGBOOST_DEVICE const_iterator | cend () const __span_noexcept |
constexpr reverse_iterator | rbegin () const __span_noexcept |
constexpr reverse_iterator | rend () const __span_noexcept |
constexpr XGBOOST_DEVICE const_reverse_iterator | crbegin () const __span_noexcept |
constexpr XGBOOST_DEVICE const_reverse_iterator | crend () const __span_noexcept |
XGBOOST_DEVICE reference | front () const |
XGBOOST_DEVICE reference | back () const |
XGBOOST_DEVICE reference | operator[] (index_type _idx) const |
XGBOOST_DEVICE reference | operator() (index_type _idx) const |
constexpr XGBOOST_DEVICE pointer | data () const __span_noexcept |
constexpr XGBOOST_DEVICE index_type | size () const __span_noexcept |
constexpr XGBOOST_DEVICE index_type | size_bytes () const __span_noexcept |
constexpr XGBOOST_DEVICE bool | empty () const __span_noexcept |
template<std::size_t Count> | |
XGBOOST_DEVICE Span< element_type, Count > | first () const |
XGBOOST_DEVICE Span< element_type, dynamic_extent > | first (std::size_t _count) const |
template<std::size_t Count> | |
XGBOOST_DEVICE Span< element_type, Count > | last () const |
XGBOOST_DEVICE Span< element_type, dynamic_extent > | last (std::size_t _count) const |
template<std::size_t Offset, std::size_t Count = dynamic_extent> | |
XGBOOST_DEVICE auto | subspan () const -> Span< element_type, detail::ExtentValue< Extent, Offset, Count >::value > |
XGBOOST_DEVICE Span< element_type, dynamic_extent > | subspan (index_type _offset, index_type _count=dynamic_extent) const |
Span 类实现,基于 ISO++20 span<T>。接口应保持一致。
与 Guidelines Support Library (GSL) 中的 span<T> 有何不同
接口可能略有不同,我们遵循 ISO 标准。
GSL 使用 C++14/17 特性,这些特性在此不可用。GSL 大量使用 constexpr,这受 C++11 限制而无法实现。GSL 不考虑 CUDA。
GSL 的实现和测试更全面。GSL 的优化更好,特别是对于静态范围。
GSL 在出错时使用 __buildin_unreachable(),Span<T> 使用 dmlc LOG 和定制的 CUDA 日志记录。
与 ISO++20 (ISO) 中的 span<T> 有何不同
ISO 使用 std 库中的函数/结构,这些在 CUDA 中可能不可用。不支持从 std::array 初始化。
ISO 大量使用 constexpr,这受 C++11 限制而无法实现。ISO 使用 C++14/17 特性,这些特性在此不可用。ISO 不考虑 CUDA。
ISO 使用 std::terminate(),Span<T> 使用 dmlc LOG 和定制的 CUDA 日志记录。
限制:使用 thrust 时:不建议直接用 host_vector 初始化 Span,因为 host_vector::data() 是一个主机函数。无法直接用 device_vector 初始化 Span,因为 device_vector::data() 返回一个包装指针。不清楚可以使用哪种 thrust 算法而不会出现内存错误。请参阅测试用例 "GPUSpan.WithTrust"。
将迭代器传递给内核:不可能。请改用 subspan。
SpanIterator 中的底层 Span 是一个指针,但 CUDA 按值传递内核参数。如果我们要持有 Span 值而不是指针,以下代码片段将会崩溃,这违反了 Span 的安全目的。
虽然持有指针或引用可以避免这个问题,但这是一种折衷。由于我们有 subspan,不支持传递迭代器是可以接受的。
using xgboost::common::Span< T, Extent >::const_iterator = const detail::SpanIterator<Span<T, Extent>, true> |
using xgboost::common::Span< T, Extent >::const_reverse_iterator = const std::reverse_iterator<const_iterator> |
using xgboost::common::Span< T, Extent >::difference_type = detail::ptrdiff_t |
using xgboost::common::Span< T, Extent >::element_type = T |
using xgboost::common::Span< T, Extent >::index_type = std::size_t |
using xgboost::common::Span< T, Extent >::iterator = detail::SpanIterator<Span<T, Extent>, false> |
using xgboost::common::Span< T, Extent >::pointer = T* |
using xgboost::common::Span< T, Extent >::reference = T& |
using xgboost::common::Span< T, Extent >::reverse_iterator = std::reverse_iterator<iterator> |
using xgboost::common::Span< T, Extent >::value_type = typename std::remove_cv<T>::type |
|
constexprdefault |
|
inline |
|
inline |
|
inlineconstexpr |
|
inline |
|
inline |
|
inlineconstexpr |
|
constexprdefaultnoexcept |
|
constexprdefaultnoexcept |
|
defaultnoexcept |
|
inline |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
constexprdefaultnoexcept |
|
constexprdefaultnoexcept |
|
inline |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inline |
如果 Count 是 std::dynamic_extent,则 r.size() == this->size() - Offset;否则 r.size() == Count。
|
inline |