xgboost
公共类型 | 公共成员函数 | 所有成员列表
xgboost::common::Span< T, Extent > 类模板参考

Span 类实现,基于 ISO++20 span<T>。接口应保持一致。 更多...

#include <span.h>

xgboost::common::Span< T, Extent > 的协作图
Collaboration graph

公共类型

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 Spanoperator= (Span const &_other) noexcept(true)=default
 
constexpr Span (Span &&_other) noexcept(true)=default
 
constexpr Spanoperator= (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_extentfirst (std::size_t _count) const
 
template<std::size_t Count>
XGBOOST_DEVICE Span< element_type, Count > last () const
 
XGBOOST_DEVICE Span< element_type, dynamic_extentlast (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_extentsubspan (index_type _offset, index_type _count=dynamic_extent) const
 

详细描述

template<typename T, std::size_t Extent = dynamic_extent>
class xgboost::common::Span< T, Extent >

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 的安全目的。

Span<float> span {arr_a};
auto beg = span.begin();
Span<float> span_b = arr_b;
span = span_b;
delete arr_a;
beg++; // crash

虽然持有指针或引用可以避免这个问题,但这是一种折衷。由于我们有 subspan,不支持传递迭代器是可以接受的。

成员类型定义文档

◆ const_iterator

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::const_iterator = const detail::SpanIterator<Span<T, Extent>, true>

◆ const_reverse_iterator

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::const_reverse_iterator = const std::reverse_iterator<const_iterator>

◆ difference_type

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::difference_type = detail::ptrdiff_t

◆ element_type

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::element_type = T

◆ index_type

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::index_type = std::size_t

◆ iterator

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::iterator = detail::SpanIterator<Span<T, Extent>, false>

◆ pointer

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::pointer = T*

◆ reference

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::reference = T&

◆ reverse_iterator

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::reverse_iterator = std::reverse_iterator<iterator>

◆ value_type

template<typename T , std::size_t Extent = dynamic_extent>
using xgboost::common::Span< T, Extent >::value_type = typename std::remove_cv<T>::type

构造函数和析构函数文档

◆ Span() [1/9]

template<typename T , std::size_t Extent = dynamic_extent>
constexpr xgboost::common::Span< T, Extent >::Span ( )
constexprdefault

◆ Span() [2/9]

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE xgboost::common::Span< T, Extent >::Span ( pointer  _ptr,
index_type  _count 
)
inline

◆ Span() [3/9]

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE xgboost::common::Span< T, Extent >::Span ( pointer  _first,
pointer  _last 
)
inline

◆ Span() [4/9]

template<typename T , std::size_t Extent = dynamic_extent>
template<std::size_t N>
constexpr XGBOOST_DEVICE xgboost::common::Span< T, Extent >::Span ( element_type(&)  arr[N])
inlineconstexpr

◆ Span() [5/9]

template<typename T , std::size_t Extent = dynamic_extent>
template<class Container >
xgboost::common::Span< T, Extent >::Span ( Container &  _cont)
inline

◆ Span() [6/9]

template<typename T , std::size_t Extent = dynamic_extent>
template<class Container >
xgboost::common::Span< T, Extent >::Span ( const Container &  _cont)
inline

◆ Span() [7/9]

template<typename T , std::size_t Extent = dynamic_extent>
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 xgboost::common::Span< T, Extent >::Span ( const Span< U, OtherExtent > &  _other)
inlineconstexpr

◆ Span() [8/9]

template<typename T , std::size_t Extent = dynamic_extent>
constexpr xgboost::common::Span< T, Extent >::Span ( Span< T, Extent > const &  _other)
constexprdefaultnoexcept

◆ Span() [9/9]

template<typename T , std::size_t Extent = dynamic_extent>
constexpr xgboost::common::Span< T, Extent >::Span ( Span< T, Extent > &&  _other)
constexprdefaultnoexcept

◆ ~Span()

template<typename T , std::size_t Extent = dynamic_extent>
xgboost::common::Span< T, Extent >::~Span ( )
defaultnoexcept

成员函数文档

◆ back()

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE reference xgboost::common::Span< T, Extent >::back ( ) const
inline

◆ begin()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE iterator xgboost::common::Span< T, Extent >::begin ( ) const
inlineconstexpr

◆ cbegin()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE const_iterator xgboost::common::Span< T, Extent >::cbegin ( ) const
inlineconstexpr

◆ cend()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE const_iterator xgboost::common::Span< T, Extent >::cend ( ) const
inlineconstexpr

◆ crbegin()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE const_reverse_iterator xgboost::common::Span< T, Extent >::crbegin ( ) const
inlineconstexpr

◆ crend()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE const_reverse_iterator xgboost::common::Span< T, Extent >::crend ( ) const
inlineconstexpr

◆ data()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE pointer xgboost::common::Span< T, Extent >::data ( ) const
inlineconstexpr

◆ empty()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE bool xgboost::common::Span< T, Extent >::empty ( ) const
inlineconstexpr

◆ end()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE iterator xgboost::common::Span< T, Extent >::end ( ) const
inlineconstexpr

◆ first() [1/2]

template<typename T , std::size_t Extent = dynamic_extent>
template<std::size_t Count>
XGBOOST_DEVICE Span<element_type, Count> xgboost::common::Span< T, Extent >::first ( ) const
inline

◆ first() [2/2]

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE Span<element_type, dynamic_extent> xgboost::common::Span< T, Extent >::first ( std::size_t  _count) const
inline

◆ front()

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE reference xgboost::common::Span< T, Extent >::front ( ) const
inline

◆ last() [1/2]

template<typename T , std::size_t Extent = dynamic_extent>
template<std::size_t Count>
XGBOOST_DEVICE Span<element_type, Count> xgboost::common::Span< T, Extent >::last ( ) const
inline

◆ last() [2/2]

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE Span<element_type, dynamic_extent> xgboost::common::Span< T, Extent >::last ( std::size_t  _count) const
inline

◆ operator()()

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE reference xgboost::common::Span< T, Extent >::operator() ( index_type  _idx) const
inline

◆ operator=() [1/2]

template<typename T , std::size_t Extent = dynamic_extent>
constexpr Span& xgboost::common::Span< T, Extent >::operator= ( Span< T, Extent > &&  _other)
constexprdefaultnoexcept

◆ operator=() [2/2]

template<typename T , std::size_t Extent = dynamic_extent>
constexpr Span& xgboost::common::Span< T, Extent >::operator= ( Span< T, Extent > const &  _other)
constexprdefaultnoexcept

◆ operator[]()

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE reference xgboost::common::Span< T, Extent >::operator[] ( index_type  _idx) const
inline

◆ rbegin()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr reverse_iterator xgboost::common::Span< T, Extent >::rbegin ( ) const
inlineconstexpr

◆ rend()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr reverse_iterator xgboost::common::Span< T, Extent >::rend ( ) const
inlineconstexpr

◆ size()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE index_type xgboost::common::Span< T, Extent >::size ( ) const
inlineconstexpr

◆ size_bytes()

template<typename T , std::size_t Extent = dynamic_extent>
constexpr XGBOOST_DEVICE index_type xgboost::common::Span< T, Extent >::size_bytes ( ) const
inlineconstexpr

◆ subspan() [1/2]

template<typename T , std::size_t Extent = dynamic_extent>
template<std::size_t Offset, std::size_t Count = dynamic_extent>
XGBOOST_DEVICE auto xgboost::common::Span< T, Extent >::subspan ( ) const -> Span<element_type, detail::ExtentValue<Extent, Offset, Count>::value>
inline

如果 Count 是 std::dynamic_extent,则 r.size() == this->size() - Offset;否则 r.size() == Count。

◆ subspan() [2/2]

template<typename T , std::size_t Extent = dynamic_extent>
XGBOOST_DEVICE Span<element_type, dynamic_extent> xgboost::common::Span< T, Extent >::subspan ( index_type  _offset,
index_type  _count = dynamic_extent 
) const
inline

本类的文档生成自以下文件