column_view.hpp
前往此文件的文档。
1 /*
2  * 版权所有 (c) 2019-2025, NVIDIA CORPORATION.
3  *
4  * 遵循 Apache License, Version 2.0 ("许可证") 许可。
5  * 除非符合许可证的规定,否则不得使用此文件。
6  * 您可以在以下网址获取许可证副本:
7  *
8  * https://apache.ac.cn/licenses/LICENSE-2.0
9  *
10  * 除非适用法律要求或书面同意,否则根据许可证
11  * 分发的软件按“原样”分发,
12  * 不附带任何明示或暗示的担保或条件。
13  * 有关管理权限和限制的特定语言,请参见许可证。
14  *
15  */
16 #pragma once
17 
18 #include <cudf/types.hpp>
19 #include <cudf/utilities/error.hpp>
20 #include <cudf/utilities/prefetch.hpp>
21 #include <cudf/utilities/span.hpp>
24 
25 #include <limits>
26 #include <type_traits>
27 #include <vector>
28 
33 namespace CUDF_EXPORT cudf {
34 namespace detail {
54  public
71  template <typename T = void,
72  CUDF_ENABLE_IF(std::is_same_v<T, void> or is_rep_layout_compatible<T>())>
73  T const* head() const noexcept
74  {
75  return static_cast<T const*>(get_data());
76  }
77 
90  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
91  T const* data() const noexcept
92  {
93  return head<T>() + _offset;
94  }
95 
106  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
107  T const* begin() const noexcept
108  {
109  return data<T>();
110  }
111 
122  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
123  T const* end() const noexcept
124  {
125  return begin<T>() + size();
126  }
127 
133  [[nodiscard]] size_type size() const noexcept { return _size; }
134 
140  [[nodiscard]] bool is_empty() const noexcept { return size() == 0; }
141 
147  [[nodiscard]] data_type type() const noexcept { return _type; }
148 
158  [[nodiscard]] bool nullable() const noexcept { return nullptr != _null_mask; }
159 
165  [[nodiscard]] size_type null_count() const { return _null_count; }
166 
182  [[nodiscard]] size_type null_count(
183  size_type begin,
184  size_type end,
186 
194  [[nodiscard]] bool has_nulls() const { return null_count() > 0; }
195 
209  [[nodiscard]] bool has_nulls(size_type begin,
210  size_type end,
212  {
213  return null_count(begin, end, stream) > 0;
214  }
215 
224  [[nodiscard]] bitmask_type const* null_mask() const noexcept { return _null_mask; }
225 
232  [[nodiscard]] size_type offset() const noexcept { return _offset; }
233 
234  protected
244  [[nodiscard]] virtual void const* get_data() const noexcept { return _data; }
245 
246  data_type _type{type_id::EMPTY};
247  size_type _size{};
248  void const* _data{};
249  bitmask_type const* _null_mask{};
252  mutable size_type _null_count{};
253  size_type _offset{};
255 
256  column_view_base() = default;
257  virtual ~column_view_base() = default;
272 
298  size_type size,
299  void const* data,
300  bitmask_type const* null_mask,
302  size_type offset = 0);
303 };
304 
305 } // 命名空间 detail
306 
328  public
329  column_view() = default;
330 
331  // 这些 pragma 解决 nvcc 的问题,即如果在 __device__ 代码路径中使用了 column_view,
332  // 这些函数最终会被创建为 __host__ __device__,因为它们是显式 default 的。但是,如果
333  // 它们最终被简单的 __host__ 函数调用
334  // (例如 std::vector 析构函数),则会出现编译错误,因为您正在尝试从 __host__ 函数调用 __host__ __device__ 函数。
335  //
336  //
337 #ifdef __CUDACC__
338 #pragma nv_exec_check_disable
339 #endif
340  ~column_view() override = default;
341 #ifdef __CUDACC__
342 #pragma nv_exec_check_disable
343 #endif
344  column_view(column_view const&) = default;
345  column_view(column_view&&) = default;
351  column_view& operator=(column_view const&) = default;
358 
386  size_type size,
387  void const* data,
388  bitmask_type const* null_mask,
390  size_type offset = 0,
391  std::vector<column_view> const& children = {});
392 
399  [[nodiscard]] column_view child(size_type child_index) const noexcept
400  {
401  return _children[child_index];
402  }
403 
409  [[nodiscard]] size_type num_children() const noexcept { return _children.size(); }
410 
416  auto child_begin() const noexcept { return _children.cbegin(); }
417 
423  auto child_end() const noexcept { return _children.cend(); }
424 
433  template <typename T, CUDF_ENABLE_IF(cudf::is_numeric<T>() or cudf::is_chrono<T>())>
434  column_view(device_span<T const> data)
435  : column_view(
436  cudf::data_type{cudf::type_to_id<T>()}, data.size(), data.data(), nullptr, 0, 0, {})
437  {
438  CUDF_EXPECTS(
439  data.size() <= static_cast<std::size_t>(std::numeric_limits<cudf::size_type>::max()),
440  "Data exceeds the column size limit",
441  std::overflow_error);
442  }
443 
455  template <typename T, CUDF_ENABLE_IF(cudf::is_numeric<T>() or cudf::is_chrono<T>())>
456  [[nodiscard]] operator device_span<T const>() const
457  {
458  CUDF_EXPECTS(type() == cudf::data_type{cudf::type_to_id<T>()},
459  "Device span type must match column view type.");
460  CUDF_EXPECTS(!nullable(), "A nullable column view cannot be converted to a device span.");
461  return device_span<T const>(data<T>(), size());
462  }
463 
464  protected
474  void const* get_data() const noexcept override;
475 
476  private
477  friend column_view bit_cast(column_view const& input, data_type type);
478 
479  std::vector<column_view> _children{};
481 }; // 命名空间 cudf
482 
504  public
505  mutable_column_view() = default;
506 
507  ~mutable_column_view() override{
508  // 需要此项,以确保任何 TU 的隐式析构函数的第一个实例不会从标记为 host+device 的 host+device 函数“构建”出来。
509  //
510  };
511 
526 
553  size_type size,
554  void* data,
555  bitmask_type* null_mask,
557  size_type offset = 0,
558  std::vector<mutable_column_view> const& children = {});
559 
575  template <typename T = void,
576  CUDF_ENABLE_IF(std::is_same_v<T, void> or is_rep_layout_compatible<T>())>
577  T* head() const noexcept
578  {
579  return const_cast<T*>(detail::column_view_base::head<T>());
580  }
581 
594  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
595  T* data() const noexcept
596  {
597  return const_cast<T*>(detail::column_view_base::data<T>());
598  }
599 
610  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
611  T* begin() const noexcept
612  {
613  return const_cast<T*>(detail::column_view_base::begin<T>());
614  }
615 
626  template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
627  T* end() const noexcept
628  {
629  return const_cast<T*>(detail::column_view_base::end<T>());
630  }
631 
641  [[nodiscard]] bitmask_type* null_mask() const noexcept
642  {
643  return const_cast<bitmask_type*>(detail::column_view_base::null_mask());
644  }
645 
653  void set_null_count(size_type new_null_count);
654 
661  [[nodiscard]] mutable_column_view child(size_type child_index) const noexcept
662  {
663  return mutable_children[child_index];
664  }
665 
671  [[nodiscard]] size_type num_children() const noexcept { return mutable_children.size(); }
672 
678  auto child_begin() const noexcept { return mutable_children.begin(); }
679 
685  auto child_end() const noexcept { return mutable_children.cend(); }
686 
692  operator column_view() const;
693 
694  protected
704  [[nodiscard]] void const* get_data() const noexcept override;
705 
706  private
708 
709  std::vector<mutable_column_view> mutable_children;
710 };
711 
719 
742 
765 
766 namespace detail {
782 std::size_t shallow_hash(column_view const& input);
783 
805 bool is_shallow_equivalent(column_view const& lhs, column_view const& rhs);
806 
807 } // 命名空间 detail
808 } // 命名空间 CUDF_EXPORT cudf
设备的非拥有、不可变数据视图,表示为一个元素列,其中一些元素可能为空,指示...(此描述已截断)
column_view(column_view &&)=default
移动构造函数。
size_type num_children() const noexcept
返回子列的数量。
auto child_begin() const noexcept
返回指向按顺序排列的子 column-view 序列开头的迭代器。
column_view & operator=(column_view &&)=default
移动赋值运算符。
column_view & operator=(column_view const &)=default
复制赋值运算符。
void const * get_data() const noexcept override
返回指向基础设备内存分配的指针。
auto child_end() const noexcept
返回指向按顺序排列的子 column-view 序列末尾的迭代器。
column_view child(size_type child_index) const noexcept
返回指定的子列。
column_view(data_type type, size_type size, void const *data, bitmask_type const *null_mask, size_type null_count, size_type offset=0, std::vector< column_view > const &children={})
从指向列元素和位掩码的设备内存指针构造 column_view。
column_view(column_view const &)=default
复制构造函数。
指示列中元素的逻辑数据类型。
定义: types.hpp:243
设备的非拥有、不可变数据视图,表示为一个元素列,其中一些元素可能为空,指示...(此描述已截断)
T const * end() const noexcept
将基础数据转换为指定类型后,返回指向最后一个元素之后的指针。
data_type type() const noexcept
返回元素 data_type
bool has_nulls(size_type begin, size_type end, rmm::cuda_stream_view stream=cudf::get_default_stream()) const
指示列是否在范围 [begin, end) 内包含 null 元素,即 null_count(begin,...(此描述已截断)
column_view_base(column_view_base &&)=default
移动构造函数。
column_view_base(data_type type, size_type size, void const *data, bitmask_type const *null_mask, size_type null_count, size_type offset=0)
从指向列元素和位掩码的设备内存指针构造 column_view_base。(此描述已截断)
size_type null_count() const
返回 null 元素的数量。
size_type null_count(size_type begin, size_type end, rmm::cuda_stream_view stream=cudf::get_default_stream()) const
返回范围 [begin, end) 内 null 元素的数量。
column_view_base & operator=(column_view_base const &)=default
复制赋值运算符。
column_view_base & operator=(column_view_base &&)=default
移动赋值运算符。
size_type size() const noexcept
返回列中的元素数量。
T const * begin() const noexcept
将基础数据转换为指定类型后,返回第一个元素(考虑偏移量)。
T const * data() const noexcept
返回转换为指定类型的基础数据,加上偏移量。
size_type offset() const noexcept
返回相对于基础内存分配的第一个元素的索引,即...(此描述已截断)
virtual void const * get_data() const noexcept
返回指向基础设备内存分配的指针。
T const * head() const noexcept
返回转换为指定类型的基础设备内存分配的指针。
bool has_nulls() const
指示列是否包含 null 元素,即 null_count() > 0
bitmask_type const * null_mask() const noexcept
返回指向基础位掩码分配的原始指针。
bool nullable() const noexcept
指示列是否可以包含 null 元素,即是否已分配位掩码。
column_view_base(column_view_base const &)=default
复制构造函数。
bool is_empty() const noexcept
如果 size() 返回零,则返回 true,否则返回 false。
设备的非拥有、可变数据视图,表示为一个元素列,其中一些元素可能为空,指示...(此描述已截断)
T * head() const noexcept
返回转换为指定类型的基础设备内存分配的指针。
size_type num_children() const noexcept
返回子列的数量。
T * begin() const noexcept
将基础数据转换为指定类型后,返回第一个元素(考虑偏移量)。
void set_null_count(size_type new_null_count)
设置 null 计数。
auto child_begin() const noexcept
返回指向按顺序排列的子 column-view 序列开头的迭代器。
mutable_column_view(data_type type, size_type size, void *data, bitmask_type *null_mask, size_type null_count, size_type offset=0, std::vector< mutable_column_view > const &children={})
从指向列元素和位掩码的设备内存指针构造 mutable_column_view。(此描述已截断)
T * data() const noexcept
返回转换为指定类型的基础数据,加上偏移量。
mutable_column_view(mutable_column_view const &)=default
复制构造函数。
mutable_column_view & operator=(mutable_column_view &&)=default
移动赋值运算符。
mutable_column_view & operator=(mutable_column_view const &)=default
复制赋值运算符。
auto child_end() const noexcept
返回指向按顺序排列的子 column-view 序列末尾的迭代器。
bitmask_type * null_mask() const noexcept
返回指向基础位掩码分配的原始指针。
void const * get_data() const noexcept override
返回指向基础设备内存分配的指针。
mutable_column_view child(size_type child_index) const noexcept
返回指定子列的引用。
mutable_column_view(mutable_column_view &&)=default
移动构造函数。
T * end() const noexcept
将基础数据转换为指定类型后,返回指向最后一个元素之后的指针。
std::size_t shallow_hash(column_view const &input)
根据指定列的浅层状态计算哈希值。
bool is_shallow_equivalent(column_view const &lhs, column_view const &rhs)
仅使用浅层状态确定两个 column_view 是否视图等效列。
cudf::size_type null_count(bitmask_type const *bitmask, size_type start, size_type stop, rmm::cuda_stream_view stream=cudf::get_default_stream())
给定一个有效性位掩码,计算范围 [start,...(此描述已截断)内 null 元素的数量(未设置的位)。
rmm::cuda_stream_view const get_default_stream()
获取当前默认流。
#define CUDF_EXPECTS(...)
用于检查(前置)条件的宏,当条件被违反时抛出异常。
定义: error.hpp:178
int32_t size_type
列和表的行索引类型。
定义: types.hpp:95
uint32_t bitmask_type
存储为 32 位无符号整数的位掩码类型。
定义: types.hpp:96
constexpr CUDF_HOST_DEVICE bool is_chrono()
指示类型 T 是否为 chrono 类型。
定义: traits.hpp:501
#define CUDF_ENABLE_IF(...)
作为匿名模板参数的 SFINAE 的便捷宏。
定义: traits.hpp:50
cuDF 接口
定义: host_udf.hpp:37
bool nullable(table_view const &view)
如果表中的任何列可为空,则返回 True。(不包括整个层次结构)
mutable_column_view bit_cast(mutable_column_view const &input, data_type type)
在具有相同大小和兼容基础表示的类型之间进行零拷贝转换。
size_type count_descendants(column_view parent)
计算指定父元素的后代数量。
span 的 API。
C++20 std::span 的设备版本,功能集已简化。
定义: span.hpp:355
定义 cudf::type_id 运行时类型信息与具体 C++ 类型之间的映射。
libcudf 的类型声明。