20 #include <cudf/detail/utilities/alignment.hpp>
30 #include <thrust/iterator/counting_iterator.h>
31 #include <thrust/iterator/transform_iterator.h>
32 #include <thrust/pair.h>
41 namespace CUDF_EXPORT
cudf {
104 this->offset() + offset,
106 this->num_child_columns()};
126 template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
129 return base::element<T>(element_index);
143 template <
typename T, CUDF_ENABLE_IF(cuda::std::is_same_v<T,
string_view>)>
146 return base::element<T>(element_index);
159 template <typename T, CUDF_ENABLE_IF(cudf::is_fixed_point<T>())>
162 return base::element<T>(element_index);
171 struct index_element_fn {
172 template <
typename IndexType,
173 CUDF_ENABLE_IF(is_index_type<IndexType>() and cuda::std::is_signed_v<IndexType>)>
179 template <
typename IndexType,
181 CUDF_ENABLE_IF(not(is_index_type<IndexType>() and cuda::std::is_signed_v<IndexType>))>
182 __device__
size_type operator()(Args&&... args)
184 CUDF_UNREACHABLE(
"dictionary indices must be a signed integral type");
213 template <
typename T, CUDF_ENABLE_IF(cuda::std::is_same_v<T, dictionary32>)>
216 size_type index = element_index + offset();
217 auto const indices = child(0);
227 template <
typename T>
230 return has_element_accessor_impl<column_device_view, T>::value;
234 using count_it = thrust::counting_iterator<size_type>;
238 template <
typename T>
256 template <typename T, CUDF_ENABLE_IF(column_device_view::has_element_accessor<T>())>
276 template <typename T, CUDF_ENABLE_IF(column_device_view::has_element_accessor<T>())>
285 template <
typename T,
typename Nullate>
287 thrust::transform_iterator<detail::optional_accessor<T, Nullate>,
count_it>;
292 template <
typename T,
bool has_nulls>
294 thrust::transform_iterator<detail::pair_accessor<T, has_nulls>,
count_it>;
301 template <
typename T,
bool has_nulls>
303 thrust::transform_iterator<detail::pair_rep_accessor<T, has_nulls>,
count_it>;
359 template <
typename T,
389 template <
typename T,
421 template <
typename T,
446 template <
typename T,
466 template <
typename T,
487 template <
typename T,
552 return {
static_cast<column_device_view*
>(d_children),
static_cast<std::size_t
>(_num_children)};
562 return _num_children;
599 column_device_view(column_view source);
680 template <typename T, CUDF_ENABLE_IF(is_rep_layout_compatible<T>())>
683 return base::element<T>(element_index);
692 template <
typename T>
695 return has_element_accessor_impl<mutable_column_device_view, T>::value;
699 using count_it = thrust::counting_iterator<size_type>;
703 template <
typename T>
716 template <typename T, CUDF_ENABLE_IF(mutable_column_device_view::has_element_accessor<T>())>
732 template <typename T, CUDF_ENABLE_IF(mutable_column_device_view::has_element_accessor<T>())>
780 "column_device_view and raw_column_device_view must be bitwise-compatible");
784 "mutable_column_device_view and raw_mutable_column_device_view must be bitwise-compatible");
802 template <
typename T>
813 CUDF_EXPECTS(type_id_matches_device_storage_type<T>(col.
type().
id()),
"the data type mismatch");
850 template <
typename T,
typename Nullate>
863 CUDF_EXPECTS(type_id_matches_device_storage_type<T>(col.
type().
id()),
"the data type mismatch");
878 : cuda::std::optional<T>{cuda::std::nullopt};
880 return cuda::std::optional<T>{col.
element<T>(i)};
905 template <
typename T,
bool has_nulls = false>
916 CUDF_EXPECTS(type_id_matches_device_storage_type<T>(col.
type().
id()),
"the data type mismatch");
951 template <
typename T,
bool has_nulls = false>
964 CUDF_EXPECTS(type_id_matches_device_storage_type<T>(col.
type().
id()),
"the data type mismatch");
980 template <
typename R, std::enable_if_t<std::is_same_v<R, rep_type>,
void>* =
nullptr>
986 template <
typename R, std::enable_if_t<not std::is_same_v<R, rep_type>,
void>* =
nullptr>
989 return col.
element<R>(i).value();
1004 template <
typename T>
1015 CUDF_EXPECTS(type_id_matches_device_storage_type<T>(col.
type().
id()),
"the data type mismatch");
1052 template <
typename ColumnDeviceView,
typename ColumnViewIterator>
1054 ColumnViewIterator child_end,
1058 ColumnDeviceView* d_children = detail::align_ptr_for_type<ColumnDeviceView>(d_ptr);
1060 if (num_children > 0) {
1063 auto h_column = detail::align_ptr_for_type<ColumnDeviceView>(h_ptr);
1064 auto d_column = d_children;
1067 auto h_end =
reinterpret_cast<int8_t*
>(h_column + num_children);
1068 auto d_end =
reinterpret_cast<int8_t*
>(d_column + num_children);
1069 std::for_each(child_begin, child_end, [&](
auto const& col) {
1071 new (h_column) ColumnDeviceView(col, h_end, d_end);
1074 auto col_child_data_size = ColumnDeviceView::extent(col) -
sizeof(ColumnDeviceView);
1075 h_end += col_child_data_size;
1076 d_end += col_child_data_size;
An immutable, non-owning view of device data as a column of elements that is trivially copyable and u...
An immutable, non-owning view of device data as a column of elements that is trivially copyable and u...
static std::unique_ptr< column_device_view, std::function< void(column_device_view *)> > create(column_view source_view, rmm::cuda_stream_view stream=cudf::get_default_stream())
Factory to construct a column view that is usable in device memory.
column_device_view child(size_type child_index) const noexcept
Returns the specified child.
void destroy()
Destroy the column_device_view object.
column_device_view & operator=(column_device_view &&)=default
Move assignment operator.
thrust::counting_iterator< size_type > count_it
Counting iterator.
static constexpr CUDF_HOST_DEVICE bool has_element_accessor()
For a given T, indicates if column_device_view::element<T>() has a valid overload.
const_pair_iterator< T, has_nulls > pair_end() const
Return a pair iterator to the element following the last element of the column.
const_pair_rep_iterator< T, has_nulls > pair_rep_end() const
Return a pair iterator to the element following the last element of the column.
const_pair_iterator< T, has_nulls > pair_begin() const
Return a pair iterator to the first element of the column.
T element(size_type element_index) const noexcept
Returns reference to element at the specified index.
column_device_view & operator=(column_device_view const &)=default
Copy assignment operator.
CUDF_HOST_DEVICE column_device_view slice(size_type offset, size_type size) const noexcept
Get a new column_device_view which is a slice of this column.
thrust::transform_iterator< detail::value_accessor< T >, count_it > const_iterator
Iterator for navigating this column.
auto optional_end(Nullate has_nulls) const
Return an optional iterator to the element following the last element of the column.
thrust::transform_iterator< detail::pair_accessor< T, has_nulls >, count_it > const_pair_iterator
Pair iterator for navigating this column.
const_pair_rep_iterator< T, has_nulls > pair_rep_begin() const
Return a pair iterator to the first element of the column.
thrust::transform_iterator< detail::optional_accessor< T, Nullate >, count_it > const_optional_iterator
Optional iterator for navigating this column.
CUDF_HOST_DEVICE size_type num_child_columns() const noexcept
Returns the number of child columns.
auto optional_begin(Nullate has_nulls) const
Return an optional iterator to the first element of the column.
column_device_view(column_device_view const &)=default
Copy constructor.
column_device_view(column_device_view &&)=default
Move constructor.
const_iterator< T > begin() const
Return an iterator to the first element of the column.
thrust::transform_iterator< detail::pair_rep_accessor< T, has_nulls >, count_it > const_pair_rep_iterator
Pair rep iterator for navigating this column.
static std::size_t extent(column_view const &source_view)
Return the size in bytes of the amount of memory needed to hold a device view of the specified column...
column_device_view(column_view column, void *h_ptr, void *d_ptr)
Creates an instance of this class using the specified host memory pointer (h_ptr) to store child obje...
const_iterator< T > end() const
Returns an iterator to the element following the last element of the column.
device_span< column_device_view const > children() const noexcept
Returns a span containing the children of this column.
A non-owning, immutable view of device data as a column of elements, some of which may be null as ind...
A container of nullable device data as a column of elements.
Indicator for the logical data type of an element in a column.
constexpr CUDF_HOST_DEVICE type_id id() const noexcept
Returns the type identifier.
CUDF_HOST_DEVICE data_type type() const noexcept
Returns the element type.
bool is_valid_nocheck(size_type element_index) const noexcept
Returns whether the specified element holds a valid value (i.e., not null)
CUDF_HOST_DEVICE bool nullable() const noexcept
Indicates whether the column can contain null elements, i.e., if it has an allocated bitmask.
A mutable, non-owning view of device data as a column of elements that is trivially copyable and usab...
A mutable, non-owning view of device data as a column of elements that is trivially copyable and usab...
static constexpr CUDF_HOST_DEVICE bool has_element_accessor()
For a given T, indicates if mutable_column_device_view::element<T>() has a valid overload.
void destroy()
Destroy the mutable_column_device_view object.
mutable_column_device_view(mutable_column_view column, void *h_ptr, void *d_ptr)
Creates an instance of this class using the specified host memory pointer (h_ptr) to store child obje...
static std::size_t extent(mutable_column_view source_view)
Return the size in bytes of the amount of memory needed to hold a device view of the specified column...
thrust::counting_iterator< size_type > count_it
Counting iterator.
mutable_column_device_view child(size_type child_index) const noexcept
Returns the specified child.
mutable_column_device_view(mutable_column_device_view const &)=default
Copy constructor.
T & element(size_type element_index) const noexcept
Returns reference to element at the specified index.
iterator< T > end()
Return one past the last element after underlying data is casted to the specified type.
mutable_column_device_view & operator=(mutable_column_device_view &&)=default
Move assignment operator.
mutable_column_device_view(mutable_column_device_view &&)=default
Move constructor.
mutable_column_device_view & operator=(mutable_column_device_view const &)=default
Copy assignment operator.
static std::unique_ptr< mutable_column_device_view, std::function< void(mutable_column_device_view *)> > create(mutable_column_view source_view, rmm::cuda_stream_view stream=cudf::get_default_stream())
Factory to construct a column view that is usable in device memory.
thrust::transform_iterator< detail::mutable_value_accessor< T >, count_it > iterator
Iterator for navigating this column.
iterator< T > begin()
Return first element (accounting for offset) after underlying data is casted to the specified type.
A non-owning, mutable view of device data as a column of elements, some of which may be null as indic...
ColumnDeviceView * child_columns_to_device_array(ColumnViewIterator child_begin, ColumnViewIterator child_end, void *h_ptr, void *d_ptr)
Helper function for use by column_device_view and mutable_column_device_view constructors to build de...
Column device view class definitions.
column view class definitions
rmm::cuda_stream_view const get_default_stream()
Get the current default stream.
CUDF_HOST_DEVICE constexpr decltype(auto) __forceinline__ type_dispatcher(cudf::data_type dtype, Functor f, Ts &&... args)
Invokes an operator() template with the type instantiation based on the specified cudf::data_type's i...
std::conditional_t< std::is_same_v< numeric::decimal32, T >, int32_t, std::conditional_t< std::is_same_v< numeric::decimal64, T >, int64_t, std::conditional_t< std::is_same_v< numeric::decimal128, T >, __int128_t, T > >> device_storage_type_t
"Returns" the corresponding type that is stored on the device when using cudf::column
#define CUDF_EXPECTS(...)
Macro for checking (pre-)conditions that throws an exception when a condition is violated.
int32_t size_type
Row index type for columns and tables.
uint32_t bitmask_type
Bitmask type stored as 32-bit unsigned integer.
size_type distance(T f, T l)
Similar to std::distance but returns cudf::size_type and performs static_cast
#define CUDF_ENABLE_IF(...)
Convenience macro for SFINAE as an unnamed template parameter.
Class definition for cudf::list_view.
bool has_nulls(table_view const &view)
Returns True if the table has nulls in any of its columns.
Class definition for cudf::strings_column_view.
Class definition for cudf::struct_view.
Mutable value accessor of column without null bitmask.
T & operator()(cudf::size_type i)
Accessor.
mutable_value_accessor(mutable_column_device_view &_col)
Constructor.
mutable_column_device_view col
mutable column view of column in device
optional accessor of a column
cuda::std::optional< T > operator()(cudf::size_type i) const
Returns a cuda::std::optional of column[i].
column_device_view const col
column view of column in device
optional_accessor(column_device_view const &_col, Nullate with_nulls)
Constructor.
pair accessor of column with/without null bitmask
column_device_view const col
column view of column in device
thrust::pair< T, bool > operator()(cudf::size_type i) const
Pair accessor.
pair_accessor(column_device_view const &_col)
constructor
pair accessor of column with/without null bitmask
thrust::pair< rep_type, bool > operator()(cudf::size_type i) const
Pair accessor.
column_device_view const col
column view of column in device
device_storage_type_t< T > rep_type
representation type
pair_rep_accessor(column_device_view const &_col)
constructor
value accessor of column without null bitmask
column_device_view const col
column view of column in device
value_accessor(column_device_view const &_col)
constructor
T operator()(cudf::size_type i) const
Returns the value of element at index i
Device version of C++20 std::span with reduced feature set.
A strongly typed wrapper for indices in a DICTIONARY type column.
Defines the mapping between cudf::type_id runtime type information and concrete C++ types.
#define CUDF_HOST_DEVICE
Indicates that the function or method is usable on host and device.