11#include <Kokkos_Core.hpp>
13#include "detail/kokkos.hpp"
26template <
class ElementType,
class,
class Allocator = HostAllocator<ElementType>>
32template <
class ElementType,
class SupportType,
class Allocator>
33class Chunk :
public ChunkCommon<ElementType, SupportType, Kokkos::layout_right>
36 using base_type =
ChunkCommon<ElementType, SupportType, Kokkos::layout_right>;
44 typename Allocator::memory_space>;
51 typename Allocator::memory_space>;
54 using allocation_mdspan_type = base_type::allocation_mdspan_type;
56 using const_allocation_mdspan_type = base_type::const_allocation_mdspan_type;
58 using discrete_domain_type = base_type::discrete_domain_type;
60 using memory_space = Allocator::memory_space;
62 using discrete_element_type = base_type::discrete_element_type;
64 using discrete_vector_type = base_type::discrete_vector_type;
66 using extents_type = base_type::extents_type;
68 using layout_type = base_type::layout_type;
70 using mapping_type = base_type::mapping_type;
72 using element_type = base_type::element_type;
74 using value_type = base_type::value_type;
76 using size_type = base_type::size_type;
78 using data_handle_type = base_type::data_handle_type;
80 using reference = base_type::reference;
82 template <
class,
class,
class>
86 Allocator m_allocator;
96 std::string
const& label,
97 SupportType
const& domain,
98 Allocator allocator = Allocator())
99 : base_type(allocator.allocate(label, domain.size()), domain)
100 , m_allocator(std::move(allocator))
106 explicit Chunk(SupportType
const& domain, Allocator allocator = Allocator())
107 :
Chunk(
"no-label", domain, std::move(allocator))
115
116
118 : base_type(std::move(
static_cast<base_type&>(other)))
119 , m_allocator(std::move(other.m_allocator))
120 , m_label(std::move(other.m_label))
122 other.m_allocation_mdspan
123 = allocation_mdspan_type(
nullptr, other.m_allocation_mdspan.mapping());
128 if (
this->m_allocation_mdspan.data_handle()) {
129 m_allocator.deallocate(
this->data_handle(),
this->size());
137
138
139
142 if (
this->data_handle()) {
143 m_allocator.deallocate(
this->data_handle(),
this->size());
145 static_cast<base_type&>(*
this) = std::move(
static_cast<base_type&>(other));
146 m_allocator = std::move(other.m_allocator);
147 m_label = std::move(other.m_label);
148 other.m_allocation_mdspan
149 = allocation_mdspan_type(
nullptr, other.m_allocation_mdspan.mapping());
155 template <
concepts::discrete_dimension... QueryDDims>
158 return view_type(*
this)[slice_spec];
162 template <
concepts::discrete_dimension... QueryDDims>
165 return span_view()[slice_spec];
169 template <
concepts::discrete_dimension... QueryDDims>
170 auto operator[](DiscreteElement<QueryDDims...>
const& slice_spec)
const
172 return view_type(*
this)[slice_spec];
176 template <
concepts::discrete_dimension... QueryDDims>
177 auto operator[](DiscreteElement<QueryDDims...>
const& slice_spec)
179 return span_view()[slice_spec];
183 template <
concepts::discrete_dimension... QueryDDims>
185 requires(is_discrete_domain_v<SupportType>)
187 return span_view()[odomain];
191 template <
concepts::discrete_dimension... QueryDDims>
193 requires(is_discrete_domain_v<SupportType>)
195 return span_view()[odomain];
199
200
201
202 template <
concepts::discrete_element... DElems>
203 element_type
const&
operator()(DElems
const&... delems)
const noexcept
206 SupportType::rank() == (0 + ... + DElems::size()),
207 "Invalid number of dimensions");
208 assert(
this->m_domain.contains(delems...));
209 return DDC_MDSPAN_ACCESS_OP(
210 this->m_allocation_mdspan,
211 detail::array(
this->m_domain.distance_from_front(delems...)));
215
216
217
218 template <
concepts::discrete_vector... DVects>
219 element_type
const&
operator()(DVects
const&... dvects)
const noexcept
220 requires(
sizeof...(DVects) != 0)
223 SupportType::rank() == (0 + ... + DVects::size()),
224 "Invalid number of dimensions");
225 return DDC_MDSPAN_ACCESS_OP(
226 this->m_allocation_mdspan,
227 detail::array(discrete_vector_type(dvects...)));
231
232
233
234 template <
concepts::discrete_element... DElems>
235 element_type&
operator()(DElems
const&... delems)
noexcept
238 SupportType::rank() == (0 + ... + DElems::size()),
239 "Invalid number of dimensions");
240 assert(
this->m_domain.contains(delems...));
241 return DDC_MDSPAN_ACCESS_OP(
242 this->m_allocation_mdspan,
243 detail::array(
this->m_domain.distance_from_front(delems...)));
247
248
249
250 template <
concepts::discrete_vector... DVects>
251 element_type&
operator()(DVects
const&... dvects)
noexcept
252 requires(
sizeof...(DVects) != 0)
255 SupportType::rank() == (0 + ... + DVects::size()),
256 "Invalid number of dimensions");
257 return DDC_MDSPAN_ACCESS_OP(
258 this->m_allocation_mdspan,
259 detail::array(discrete_vector_type(dvects...)));
263
264
265 char const*
label()
const
267 return m_label.c_str();
271
272
275 return base_type::data_handle();
279
280
283 return base_type::data_handle();
287
288
291 return base_type::allocation_mdspan();
295
296
299 return base_type::allocation_mdspan();
303
304
307 auto s =
this->allocation_mdspan();
308 auto kokkos_layout = detail::build_kokkos_layout(
311 std::make_index_sequence<SupportType::rank()> {});
313 detail::mdspan_to_kokkos_element_t<ElementType, SupportType::rank()>,
314 decltype(kokkos_layout),
315 typename Allocator::memory_space>(s.data_handle(), kokkos_layout);
319
320
323 auto s =
this->allocation_mdspan();
324 auto kokkos_layout = detail::build_kokkos_layout(
327 std::make_index_sequence<SupportType::rank()> {});
329 detail::mdspan_to_kokkos_element_t<ElementType
const, SupportType::rank()>,
330 decltype(kokkos_layout),
331 typename Allocator::memory_space>(s.data_handle(), kokkos_layout);
336 return view_type(*
this);
341 return view_type(*
this);
346 return span_type(*
this);
350template <
class SupportType,
class Allocator>
351Chunk(std::string
const&, SupportType
const&, Allocator)
354template <
class SupportType,
class Allocator>
355Chunk(SupportType
const&, Allocator)
auto operator[](DiscreteElement< QueryDDims... > const &slice_spec) const
Slice out some dimensions.
auto operator[](DiscreteVector< QueryDDims... > const &slice_spec) const
Slice out some dimensions.
char const * label() const
Returns the label of the Chunk.
const_allocation_mdspan_type allocation_mdspan() const
Provide a mdspan on the memory allocation.
ElementType const * data_handle() const
Access to the underlying allocation pointer.
auto allocation_kokkos_view()
Provide an unmanaged Kokkos::View on the memory allocation.
auto operator[](DiscreteDomain< QueryDDims... > const &odomain)
Slice out some dimensions.
auto allocation_kokkos_view() const
Provide an unmanaged Kokkos::View on the memory allocation.
Chunk(SupportType const &domain, Allocator allocator=Allocator())
Construct a Chunk on a domain with uninitialized values.
Chunk & operator=(Chunk const &other)=delete
Deleted: use deepcopy instead.
allocation_mdspan_type allocation_mdspan()
Provide a mdspan on the memory allocation.
ElementType * data_handle()
Access to the underlying allocation pointer.
view_type span_cview() const
Chunk(Chunk const &other)=delete
Deleted: use deepcopy instead.
Chunk(std::string const &label, SupportType const &domain, Allocator allocator=Allocator())
Construct a labeled Chunk on a domain with uninitialized values.
element_type & operator()(DElems const &... delems) noexcept
Element access using a list of DiscreteElement.
Chunk()=default
Empty Chunk.
Chunk & operator=(Chunk &&other) noexcept
Move-assigns a new value to this field.
Chunk(Chunk &&other) noexcept
Constructs a new Chunk by move.
view_type span_view() const
auto operator[](DiscreteDomain< QueryDDims... > const &odomain) const
Slice out some dimensions.
element_type const & operator()(DElems const &... delems) const noexcept
Element access using a list of DiscreteElement.
auto operator[](DiscreteVector< QueryDDims... > const &slice_spec)
Slice out some dimensions.
auto operator[](DiscreteElement< QueryDDims... > const &slice_spec)
Slice out some dimensions.
friend class DiscreteDomain
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
The top-level namespace of DDC.
constexpr bool enable_chunk< Chunk< ElementType, SupportType, Allocator > >
Chunk(SupportType const &, Allocator) -> Chunk< typename Allocator::value_type, SupportType, Allocator >
Chunk(std::string const &, SupportType const &, Allocator) -> Chunk< typename Allocator::value_type, SupportType, Allocator >