23 #ifndef KOKKOS_DYNRANKVIEW_HPP
24 #define KOKKOS_DYNRANKVIEW_HPP
25 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
26 #define KOKKOS_IMPL_PUBLIC_INCLUDE
27 #define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DYNRANKVIEW
30 #include <Kokkos_Core.hpp>
31 #include <impl/Kokkos_Error.hpp>
32 #include <type_traits>
36 template <
typename DataType,
class... Properties>
41 template <
class T,
size_t Rank>
42 struct ViewDataTypeFromRank {
43 using type =
typename ViewDataTypeFromRank<T, Rank - 1>::type*;
47 struct ViewDataTypeFromRank<T, 0> {
51 template <
unsigned N,
typename T,
typename... Args>
52 KOKKOS_FUNCTION View<typename ViewDataTypeFromRank<T, N>::type, Args...>
54 DynRankView<T, Args...> v,
55 std::enable_if_t<std::is_same_v<
typename ViewTraits<T, Args...>::specialize,
58 template <
typename Specialize>
59 struct DynRankDimTraits {
60 enum :
size_t { unspecified = KOKKOS_INVALID_INDEX };
63 KOKKOS_INLINE_FUNCTION
64 static size_t computeRank(
const size_t N0,
const size_t N1,
const size_t N2,
65 const size_t N3,
const size_t N4,
const size_t N5,
66 const size_t N6,
const size_t ) {
68 (N6 == unspecified && N5 == unspecified && N4 == unspecified &&
69 N3 == unspecified && N2 == unspecified && N1 == unspecified &&
72 : ((N6 == unspecified && N5 == unspecified && N4 == unspecified &&
73 N3 == unspecified && N2 == unspecified && N1 == unspecified)
75 : ((N6 == unspecified && N5 == unspecified &&
76 N4 == unspecified && N3 == unspecified &&
79 : ((N6 == unspecified && N5 == unspecified &&
80 N4 == unspecified && N3 == unspecified)
82 : ((N6 == unspecified && N5 == unspecified &&
85 : ((N6 == unspecified &&
88 : ((N6 == unspecified)
94 template <
typename Layout>
95 KOKKOS_INLINE_FUNCTION
static size_t computeRank(
const Layout& layout) {
96 return computeRank(layout.dimension[0], layout.dimension[1],
97 layout.dimension[2], layout.dimension[3],
98 layout.dimension[4], layout.dimension[5],
99 layout.dimension[6], layout.dimension[7]);
103 template <
typename Layout,
typename... P>
104 KOKKOS_INLINE_FUNCTION
static size_t computeRank(
105 const Kokkos::Impl::ViewCtorProp<P...>& ,
106 const Layout& layout) {
107 return computeRank(layout);
115 template <
typename Layout>
116 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<
117 (std::is_same_v<Layout, Kokkos::LayoutRight> ||
118 std::is_same_v<Layout, Kokkos::LayoutLeft>),
120 createLayout(
const Layout& layout) {
122 layout.dimension[0] != unspecified ? layout.dimension[0] : 1,
123 layout.dimension[1] != unspecified ? layout.dimension[1] : 1,
124 layout.dimension[2] != unspecified ? layout.dimension[2] : 1,
125 layout.dimension[3] != unspecified ? layout.dimension[3] : 1,
126 layout.dimension[4] != unspecified ? layout.dimension[4] : 1,
127 layout.dimension[5] != unspecified ? layout.dimension[5] : 1,
128 layout.dimension[6] != unspecified ? layout.dimension[6] : 1,
129 layout.dimension[7] != unspecified ? layout.dimension[7] : unspecified);
130 new_layout.stride = layout.stride;
135 template <
typename Layout>
136 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<
137 (std::is_same_v<Layout, Kokkos::LayoutStride>), Layout>
138 createLayout(
const Layout& layout) {
140 layout.dimension[0] != unspecified ? layout.dimension[0] : 1,
142 layout.dimension[1] != unspecified ? layout.dimension[1] : 1,
144 layout.dimension[2] != unspecified ? layout.dimension[2] : 1,
146 layout.dimension[3] != unspecified ? layout.dimension[3] : 1,
148 layout.dimension[4] != unspecified ? layout.dimension[4] : 1,
150 layout.dimension[5] != unspecified ? layout.dimension[5] : 1,
152 layout.dimension[6] != unspecified ? layout.dimension[6] : 1,
154 layout.dimension[7] != unspecified ? layout.dimension[7] : unspecified,
159 template <
typename Traits,
typename... P>
160 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<
161 (std::is_same_v<typename Traits::array_layout, Kokkos::LayoutRight> ||
162 std::is_same_v<typename Traits::array_layout, Kokkos::LayoutLeft> ||
163 std::is_same_v<typename Traits::array_layout, Kokkos::LayoutStride>),
164 typename Traits::array_layout>
165 createLayout(
const Kokkos::Impl::ViewCtorProp<P...>& ,
166 const typename Traits::array_layout& layout) {
167 return createLayout(layout);
174 template <
typename ViewType,
typename ViewArg>
175 static ViewType createView(
const ViewArg& arg,
const size_t N0,
176 const size_t N1,
const size_t N2,
const size_t N3,
177 const size_t N4,
const size_t N5,
const size_t N6,
179 return ViewType(arg, N0 != unspecified ? N0 : 1, N1 != unspecified ? N1 : 1,
180 N2 != unspecified ? N2 : 1, N3 != unspecified ? N3 : 1,
181 N4 != unspecified ? N4 : 1, N5 != unspecified ? N5 : 1,
182 N6 != unspecified ? N6 : 1, N7 != unspecified ? N7 : 1);
187 template <
typename Layout,
typename iType>
188 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<
189 (std::is_same_v<Layout, Kokkos::LayoutRight> ||
190 std::is_same_v<Layout, Kokkos::LayoutLeft>)&&std::is_integral_v<iType>,
192 reconstructLayout(
const Layout& layout, iType dynrank) {
193 return Layout(dynrank > 0 ? layout.dimension[0] : KOKKOS_INVALID_INDEX,
194 dynrank > 1 ? layout.dimension[1] : KOKKOS_INVALID_INDEX,
195 dynrank > 2 ? layout.dimension[2] : KOKKOS_INVALID_INDEX,
196 dynrank > 3 ? layout.dimension[3] : KOKKOS_INVALID_INDEX,
197 dynrank > 4 ? layout.dimension[4] : KOKKOS_INVALID_INDEX,
198 dynrank > 5 ? layout.dimension[5] : KOKKOS_INVALID_INDEX,
199 dynrank > 6 ? layout.dimension[6] : KOKKOS_INVALID_INDEX,
200 dynrank > 7 ? layout.dimension[7] : KOKKOS_INVALID_INDEX);
204 template <
typename Layout,
typename iType>
205 KOKKOS_INLINE_FUNCTION
static std::enable_if_t<
206 (std::is_same_v<Layout, Kokkos::LayoutStride>)&&std::is_integral_v<iType>,
208 reconstructLayout(
const Layout& layout, iType dynrank) {
209 return Layout(dynrank > 0 ? layout.dimension[0] : KOKKOS_INVALID_INDEX,
210 dynrank > 0 ? layout.stride[0] : (0),
211 dynrank > 1 ? layout.dimension[1] : KOKKOS_INVALID_INDEX,
212 dynrank > 1 ? layout.stride[1] : (0),
213 dynrank > 2 ? layout.dimension[2] : KOKKOS_INVALID_INDEX,
214 dynrank > 2 ? layout.stride[2] : (0),
215 dynrank > 3 ? layout.dimension[3] : KOKKOS_INVALID_INDEX,
216 dynrank > 3 ? layout.stride[3] : (0),
217 dynrank > 4 ? layout.dimension[4] : KOKKOS_INVALID_INDEX,
218 dynrank > 4 ? layout.stride[4] : (0),
219 dynrank > 5 ? layout.dimension[5] : KOKKOS_INVALID_INDEX,
220 dynrank > 5 ? layout.stride[5] : (0),
221 dynrank > 6 ? layout.dimension[6] : KOKKOS_INVALID_INDEX,
222 dynrank > 6 ? layout.stride[6] : (0),
223 dynrank > 7 ? layout.dimension[7] : KOKKOS_INVALID_INDEX,
224 dynrank > 7 ? layout.stride[7] : (0));
230 template <
unsigned,
typename iType0,
class MapType>
232 const iType0&,
const MapType&) {
236 template <
unsigned R,
typename iType0,
class MapType,
typename iType1,
239 const iType0& rank,
const MapType& map,
const iType1& i, Args... args) {
240 if (static_cast<iType0>(R) < rank) {
241 return (
size_t(i) < map.extent(R)) &&
242 dyn_rank_view_verify_operator_bounds<R + 1>(rank, map, args...);
245 "DynRankView Debug Bounds Checking Error: at rank %u\n Extra "
246 "arguments beyond the rank must be zero \n",
249 dyn_rank_view_verify_operator_bounds<R + 1>(rank, map, args...);
252 dyn_rank_view_verify_operator_bounds<R + 1>(rank, map, args...);
256 template <
unsigned,
class MapType>
257 inline void dyn_rank_view_error_operator_bounds(
char*,
int,
const MapType&) {}
259 template <
unsigned R,
class MapType,
class iType,
class... Args>
260 inline void dyn_rank_view_error_operator_bounds(
char* buf,
int len,
262 const iType& i, Args... args) {
263 const int n = snprintf(
264 buf, len,
" %ld < %ld %c", static_cast<unsigned long>(i),
265 static_cast<unsigned long>(map.extent(R)), (
sizeof...(Args) ?
',' :
')'));
266 dyn_rank_view_error_operator_bounds<R + 1>(buf + n, len - n, map, args...);
270 template <
typename MemorySpace,
typename iType0,
typename iType1,
class MapType,
273 const iType0& op_rank,
const iType1& rank,
274 const Kokkos::Impl::SharedAllocationTracker& tracker,
const MapType& map,
276 if (static_cast<iType0>(rank) > op_rank) {
278 "DynRankView Bounds Checking Error: Need at least rank arguments to "
282 if (!dyn_rank_view_verify_operator_bounds<0>(rank, map, args...)) {
284 (
enum {LEN = 1024};
char buffer[LEN];
285 const std::string label = tracker.template get_label<MemorySpace>();
286 int n = snprintf(buffer, LEN,
"DynRankView bounds error of view %s (",
288 dyn_rank_view_error_operator_bounds<0>(buffer + n, LEN - n, map,
290 Kokkos::Impl::throw_runtime_exception(std::string(buffer));))
293 ((
void)tracker; Kokkos::abort("DynRankView bounds error");))
298 struct ViewToDynRankViewTag {};
304 template <
class DstTraits,
class SrcTraits>
306 DstTraits, SrcTraits,
308 (std::is_same_v<typename DstTraits::memory_space,
309 typename SrcTraits::memory_space> &&
310 std::is_void_v<typename DstTraits::specialize> &&
311 std::is_void_v<typename SrcTraits::specialize> &&
312 (std::is_same_v<typename DstTraits::array_layout,
313 typename SrcTraits::array_layout> ||
314 ((std::is_same_v<typename DstTraits::array_layout,
315 Kokkos::LayoutLeft> ||
316 std::is_same_v<typename DstTraits::array_layout,
317 Kokkos::LayoutRight> ||
319 typename DstTraits::array_layout,
320 Kokkos::LayoutStride>)&&(std::is_same_v<typename SrcTraits::
322 Kokkos::LayoutLeft> ||
324 typename SrcTraits::array_layout,
325 Kokkos::LayoutRight> ||
327 typename SrcTraits::array_layout,
328 Kokkos::LayoutStride>)))),
329 Kokkos::Impl::ViewToDynRankViewTag>> {
332 is_assignable_value_type =
333 std::is_same_v<
typename DstTraits::value_type,
334 typename SrcTraits::value_type> ||
335 std::is_same_v<
typename DstTraits::value_type,
336 typename SrcTraits::const_value_type>
340 is_assignable_layout =
341 std::is_same_v<
typename DstTraits::array_layout,
342 typename SrcTraits::array_layout> ||
343 std::is_same_v<typename DstTraits::array_layout, Kokkos::LayoutStride>
347 enum { is_assignable = is_assignable_value_type && is_assignable_layout };
349 using DstType = ViewMapping<DstTraits, typename DstTraits::specialize>;
350 using SrcType = ViewMapping<SrcTraits, typename SrcTraits::specialize>;
352 template <
typename DT,
typename... DP,
typename ST,
typename... SP>
353 KOKKOS_INLINE_FUNCTION
static void assign(
354 Kokkos::DynRankView<DT, DP...>& dst,
const Kokkos::View<ST, SP...>& src) {
356 is_assignable_value_type,
357 "View assignment must have same value type or const = non-const");
360 is_assignable_layout,
361 "View assignment must have compatible layout or have rank <= 1");
365 using dst_offset_type =
typename DstType::offset_type;
366 dst.m_map.m_impl_offset = dst_offset_type(
367 std::integral_constant<unsigned, 0>(),
369 dst.m_map.m_impl_handle = Kokkos::Impl::ViewDataHandle<DstTraits>::assign(
370 src.m_map.m_impl_handle, src.m_track.m_tracker);
371 dst.m_track.m_tracker.assign(src.m_track.m_tracker, DstTraits::is_managed);
372 dst.m_rank = Kokkos::View<ST, SP...>::rank();
395 struct is_dyn_rank_view :
public std::false_type {};
397 template <
class D,
class... P>
398 struct is_dyn_rank_view<Kokkos::DynRankView<D, P...>> :
public std::true_type {
402 inline constexpr
bool is_dyn_rank_view_v = is_dyn_rank_view<T>::value;
406 template <
typename DataType,
class... Properties>
407 class DynRankView :
private View<DataType*******, Properties...> {
408 static_assert(!std::is_array_v<DataType> && !std::is_pointer_v<DataType>,
409 "Cannot template DynRankView with array or pointer datatype - "
413 template <
class,
class...>
414 friend class DynRankView;
415 template <
class,
class...>
416 friend class Kokkos::Impl::ViewMapping;
421 using drvtraits = ViewTraits<DataType, Properties...>;
423 using view_type =
View<DataType*******, Properties...>;
426 using drdtraits = Impl::DynRankDimTraits<typename view_type::specialize>;
430 using data_type =
typename drvtraits::data_type;
431 using const_data_type =
typename drvtraits::const_data_type;
432 using non_const_data_type =
typename drvtraits::non_const_data_type;
435 using value_type =
typename view_type::value_type;
436 using const_value_type =
typename view_type::const_value_type;
437 using non_const_value_type =
typename view_type::non_const_value_type;
438 using traits =
typename view_type::traits;
439 using array_layout =
typename view_type::array_layout;
441 using execution_space =
typename view_type::execution_space;
442 using memory_space =
typename view_type::memory_space;
443 using device_type =
typename view_type::device_type;
445 using memory_traits =
typename view_type::memory_traits;
446 using host_mirror_space =
typename view_type::host_mirror_space;
447 using size_type =
typename view_type::size_type;
449 using reference_type =
typename view_type::reference_type;
450 using pointer_type =
typename view_type::pointer_type;
452 using scalar_array_type = value_type;
453 using const_scalar_array_type = const_value_type;
454 using non_const_scalar_array_type = non_const_value_type;
455 using specialize =
typename view_type::specialize;
460 using index_type =
typename view_type::index_type;
461 using element_type =
typename view_type::element_type;
462 using rank_type =
typename view_type::rank_type;
463 using reference = reference_type;
464 using data_handle_type = pointer_type;
467 view_type& DownCast()
const {
return (view_type&)(*this); }
472 const view_type& ConstDownCast()
const {
return (
const view_type&)(*this); }
482 using array_type = DynRankView<
483 typename drvtraits::scalar_array_type,
typename drvtraits::array_layout,
484 typename drvtraits::device_type,
typename drvtraits::memory_traits>;
487 using const_type = DynRankView<
488 typename drvtraits::const_data_type,
typename drvtraits::array_layout,
489 typename drvtraits::device_type,
typename drvtraits::memory_traits>;
492 using non_const_type = DynRankView<
493 typename drvtraits::non_const_data_type,
typename drvtraits::array_layout,
494 typename drvtraits::device_type,
typename drvtraits::memory_traits>;
497 using HostMirror = DynRankView<
typename drvtraits::non_const_data_type,
498 typename drvtraits::array_layout,
499 typename drvtraits::host_mirror_space>;
501 using host_mirror_type = HostMirror;
518 std::is_same_v<typename traits::array_layout, Kokkos::LayoutLeft>,
521 std::is_same_v<typename traits::array_layout, Kokkos::LayoutRight>,
524 std::is_same_v<typename traits::array_layout, Kokkos::LayoutStride>,
526 is_default_map = std::is_void_v<typename traits::specialize> &&
527 (is_layout_left || is_layout_right || is_layout_stride),
530 is_default_map && std::is_same_v<reference_type, element_type&>
534 #if defined(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK)
537 #define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(ARG) \
538 Kokkos::Impl::runtime_check_memory_access_violation< \
539 typename traits::memory_space>( \
540 "Kokkos::DynRankView ERROR: attempt to access inaccessible memory " \
542 Kokkos::Impl::dyn_rank_view_verify_operator_bounds< \
543 typename traits::memory_space> \
548 #define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(ARG) \
549 Kokkos::Impl::runtime_check_memory_access_violation< \
550 typename traits::memory_space>( \
551 "Kokkos::DynRankView ERROR: attempt to access inaccessible memory " \
558 constexpr
unsigned rank()
const {
return m_rank; }
560 using view_type::data;
561 using view_type::extent;
562 using view_type::extent_int;
563 using view_type::impl_map;
564 using view_type::is_allocated;
565 using view_type::label;
566 using view_type::size;
567 using view_type::span;
568 using view_type::span_is_contiguous;
569 using view_type::stride;
570 using view_type::stride_0;
571 using view_type::stride_1;
572 using view_type::stride_2;
573 using view_type::stride_3;
574 using view_type::stride_4;
575 using view_type::stride_5;
576 using view_type::stride_6;
577 using view_type::stride_7;
578 using view_type::use_count;
580 #ifdef KOKKOS_ENABLE_CUDA
581 KOKKOS_FUNCTION reference_type
582 operator()(index_type i0 = 0, index_type i1 = 0, index_type i2 = 0,
583 index_type i3 = 0, index_type i4 = 0, index_type i5 = 0,
584 index_type i6 = 0)
const {
585 return view_type::operator()(i0, i1, i2, i3, i4, i5, i6);
595 KOKKOS_FUNCTION reference_type operator()()
const {
596 #ifdef KOKKOS_ENABLE_DEBUG
599 "DynRankView rank 0 operator() called with invalid number of "
602 #ifndef KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK
603 if constexpr (is_default_access) {
604 return view_type::data()[0];
607 return view_type::operator()(0, 0, 0, 0, 0, 0, 0);
610 KOKKOS_FUNCTION reference_type operator()(index_type i0)
const {
611 #ifdef KOKKOS_ENABLE_DEBUG
616 "DynRankView rank 1 operator() called with invalid number of "
619 #ifndef KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK
620 if constexpr (is_default_access) {
621 if constexpr (is_layout_stride) {
622 return view_type::data()[i0 * view_type::stride(0)];
624 return view_type::data()[i0];
628 return view_type::operator()(i0, 0, 0, 0, 0, 0, 0);
629 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
630 !defined(KOKKOS_COMPILER_MSVC)
631 __builtin_unreachable();
635 KOKKOS_FUNCTION reference_type operator()(index_type i0,
636 index_type i1)
const {
637 #ifdef KOKKOS_ENABLE_DEBUG
642 "DynRankView rank 2 operator() called with invalid number of "
645 #ifndef KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK
646 if constexpr (is_default_access) {
647 if constexpr (is_layout_left) {
648 return view_type::data()[i0 + i1 * view_type::stride(1)];
649 }
else if constexpr (is_layout_right) {
650 return view_type::data()[i0 * view_type::extent(1) + i1];
652 return view_type::data()[i0 * view_type::stride(0) +
653 i1 * view_type::stride(1)];
657 return view_type::operator()(i0, i1, 0, 0, 0, 0, 0);
658 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
659 !defined(KOKKOS_COMPILER_MSVC)
660 __builtin_unreachable();
664 KOKKOS_FUNCTION reference_type operator()(index_type i0, index_type i1,
665 index_type i2)
const {
666 #ifdef KOKKOS_ENABLE_DEBUG
671 "DynRankView rank 3 operator() called with invalid number of "
674 #ifndef KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK
675 if constexpr (is_default_access) {
676 if constexpr (is_layout_left) {
677 return view_type::data()[i0 + view_type::stride(1) *
678 (i1 + i2 * view_type::extent(1))];
679 }
else if constexpr (is_layout_right) {
680 return view_type::data()[(i0 * view_type::extent(1) + i1) *
681 view_type::extent(2) +
684 return view_type::data()[i0 * view_type::stride(0) +
685 i1 * view_type::stride(1) +
686 i2 * view_type::stride(2)];
690 return view_type::operator()(i0, i1, i2, 0, 0, 0, 0);
691 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
692 !defined(KOKKOS_COMPILER_MSVC)
693 __builtin_unreachable();
697 KOKKOS_FUNCTION reference_type operator()(index_type i0, index_type i1,
698 index_type i2, index_type i3,
701 index_type i6 = 0)
const {
702 return view_type::operator()(i0, i1, i2, i3, i4, i5, i6);
708 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
709 KOKKOS_FUNCTION reference_type operator[](index_type i0)
const {
710 if constexpr (std::is_same_v<
typename drvtraits::value_type,
711 typename drvtraits::scalar_array_type>) {
712 return view_type::data()[i0];
714 const size_t dim_scalar = view_type::impl_map().dimension_scalar();
715 const size_t bytes = view_type::span() / dim_scalar;
717 using tmp_view_type =
718 Kokkos::View<DataType*,
typename traits::array_layout,
719 typename traits::device_type,
720 Kokkos::MemoryTraits<traits::memory_traits::impl_value |
721 unsigned(Kokkos::Unmanaged)>>;
722 tmp_view_type rankone_view(view_type::data(), bytes, dim_scalar);
723 return rankone_view(i0);
727 KOKKOS_FUNCTION reference_type operator[](index_type i0)
const {
728 #ifdef KOKKOS_ENABLE_DEBUG
730 Kokkos::abort(
"DynRankView operator[] can only be used for rank-1");
732 return view_type::operator()(i0, 0, 0, 0, 0, 0, 0);
736 KOKKOS_FUNCTION reference_type access(index_type i0 = 0, index_type i1 = 0,
737 index_type i2 = 0, index_type i3 = 0,
738 index_type i4 = 0, index_type i5 = 0,
739 index_type i6 = 0)
const {
740 return view_type::operator()(i0, i1, i2, i3, i4, i5, i6);
746 KOKKOS_DEFAULTED_FUNCTION
747 ~DynRankView() =
default;
749 KOKKOS_DEFAULTED_FUNCTION DynRankView() =
default;
755 template <
class RT,
class... RP>
756 KOKKOS_FUNCTION DynRankView(
const DynRankView<RT, RP...>& rhs)
757 : view_type(rhs), m_rank(rhs.m_rank) {}
759 template <
class RT,
class... RP>
760 KOKKOS_FUNCTION DynRankView& operator=(
const DynRankView<RT, RP...>& rhs) {
761 view_type::operator=(rhs);
766 #if 0 // TODO: this will later be swapped in depending on whether the new View
770 KOKKOS_FUNCTION
typename view_type::extents_type create_rank7_extents(
772 return typename view_type::extents_type(
773 ext.rank() > 0 ? ext.extent(0) : 1, ext.rank() > 1 ? ext.extent(1) : 1,
774 ext.rank() > 2 ? ext.extent(2) : 1, ext.rank() > 3 ? ext.extent(3) : 1,
775 ext.rank() > 4 ? ext.extent(4) : 1, ext.rank() > 5 ? ext.extent(5) : 1,
776 ext.rank() > 6 ? ext.extent(6) : 1);
781 template <
class RT,
class... RP>
782 KOKKOS_INLINE_FUNCTION DynRankView(
const View<RT, RP...>& rhs,
784 : view_type(rhs.data_handle(), drdtraits::createLayout(rhs.layout())),
786 if (new_rank > rhs.rank())
788 "Attempting to construct DynRankView from View and new rank, with "
789 "the new rank being too large.");
792 template <
class RT,
class... RP>
793 KOKKOS_INLINE_FUNCTION DynRankView& operator=(
const View<RT, RP...>& rhs) {
794 view_type::operator=(view_type(
796 typename view_type::mapping_type(create_rank7_extents(rhs.extents())),
802 template <
class RT,
class... RP>
803 KOKKOS_FUNCTION DynRankView(
const View<RT, RP...>& rhs,
size_t new_rank) {
804 using SrcTraits =
typename View<RT, RP...>::traits;
806 Kokkos::Impl::ViewMapping<traits, SrcTraits,
808 static_assert(Mapping::is_assignable,
809 "Incompatible View to DynRankView copy assignment");
810 if (new_rank > View<RT, RP...>::rank())
812 "Attempting to construct DynRankView from View and new rank, with "
813 "the new rank being too large.");
814 Mapping::assign(*
this, rhs);
818 template <
class RT,
class... RP>
819 KOKKOS_FUNCTION DynRankView& operator=(
const View<RT, RP...>& rhs) {
820 using SrcTraits =
typename View<RT, RP...>::traits;
822 Kokkos::Impl::ViewMapping<traits, SrcTraits,
823 Kokkos::Impl::ViewToDynRankViewTag>;
824 static_assert(Mapping::is_assignable,
825 "Incompatible View to DynRankView copy assignment");
826 Mapping::assign(*
this, rhs);
827 m_rank = View<RT, RP...>::rank();
832 template <
class RT,
class... RP>
833 KOKKOS_FUNCTION DynRankView(
const View<RT, RP...>& rhs)
834 : DynRankView(rhs,
View<RT, RP...>::rank()) {}
845 template <
class... P>
846 explicit KOKKOS_FUNCTION DynRankView(
847 const Kokkos::Impl::ViewCtorProp<P...>& arg_prop,
848 std::enable_if_t<Kokkos::Impl::ViewCtorProp<P...>::has_pointer,
849 typename traits::array_layout
const&>
851 : view_type(arg_prop, drdtraits::template createLayout<traits, P...>(
852 arg_prop, arg_layout)),
853 m_rank(drdtraits::computeRank(arg_prop, arg_layout)) {}
855 template <
class... P>
856 explicit DynRankView(
857 const Kokkos::Impl::ViewCtorProp<P...>& arg_prop,
858 std::enable_if_t<!Kokkos::Impl::ViewCtorProp<P...>::has_pointer,
859 typename traits::array_layout
const&>
861 : view_type(arg_prop, drdtraits::template createLayout<traits, P...>(
862 arg_prop, arg_layout)),
863 m_rank(drdtraits::computeRank(arg_prop, arg_layout)) {}
871 template <
class... P>
872 explicit KOKKOS_FUNCTION DynRankView(
873 const Kokkos::Impl::ViewCtorProp<P...>& arg_prop,
874 std::enable_if_t<Kokkos::Impl::ViewCtorProp<P...>::has_pointer,
876 arg_N0 = KOKKOS_INVALID_INDEX,
877 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
878 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
879 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
880 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
881 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
882 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
883 const size_t arg_N7 = KOKKOS_INVALID_INDEX)
884 : DynRankView(arg_prop, typename traits::array_layout(
885 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4,
886 arg_N5, arg_N6, arg_N7)) {}
888 template <
class... P>
889 explicit DynRankView(
890 const Kokkos::Impl::ViewCtorProp<P...>& arg_prop,
891 std::enable_if_t<!Kokkos::Impl::ViewCtorProp<P...>::has_pointer,
893 arg_N0 = KOKKOS_INVALID_INDEX,
894 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
895 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
896 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
897 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
898 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
899 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
900 const size_t arg_N7 = KOKKOS_INVALID_INDEX)
901 : DynRankView(arg_prop, typename traits::array_layout(
902 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4,
903 arg_N5, arg_N6, arg_N7)) {}
906 template <
typename Label>
907 explicit inline DynRankView(
908 const Label& arg_label,
909 std::enable_if_t<Kokkos::Impl::is_view_label<Label>::value,
910 typename traits::array_layout>
const& arg_layout)
911 : DynRankView(Kokkos::Impl::ViewCtorProp<std::string>(arg_label),
915 template <
typename Label>
916 explicit inline DynRankView(
917 const Label& arg_label,
918 std::enable_if_t<Kokkos::Impl::is_view_label<Label>::value,
const size_t>
919 arg_N0 = KOKKOS_INVALID_INDEX,
920 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
921 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
922 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
923 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
924 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
925 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
926 const size_t arg_N7 = KOKKOS_INVALID_INDEX)
928 Kokkos::Impl::ViewCtorProp<std::string>(arg_label),
929 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
930 arg_N4, arg_N5, arg_N6, arg_N7)) {}
935 static constexpr
size_t required_allocation_size(
936 const size_t arg_N0 = 1,
const size_t arg_N1 = 1,
const size_t arg_N2 = 1,
937 const size_t arg_N3 = 1,
const size_t arg_N4 = 1,
const size_t arg_N5 = 1,
938 const size_t arg_N6 = 1,
939 [[maybe_unused]]
const size_t arg_N7 = KOKKOS_INVALID_INDEX) {
941 return view_type::required_allocation_size(arg_N0, arg_N1, arg_N2, arg_N3,
942 arg_N4, arg_N5, arg_N6);
945 explicit KOKKOS_FUNCTION DynRankView(
946 typename view_type::pointer_type arg_ptr,
947 const size_t arg_N0 = KOKKOS_INVALID_INDEX,
948 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
949 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
950 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
951 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
952 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
953 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
954 const size_t arg_N7 = KOKKOS_INVALID_INDEX)
956 Kokkos::Impl::ViewCtorProp<typename view_type::pointer_type>(
958 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7) {}
960 explicit KOKKOS_FUNCTION DynRankView(
961 typename view_type::pointer_type arg_ptr,
962 typename traits::array_layout& arg_layout)
964 Kokkos::Impl::ViewCtorProp<typename view_type::pointer_type>(
972 static inline size_t shmem_size(
973 const size_t arg_N0 = 1,
const size_t arg_N1 = 1,
const size_t arg_N2 = 1,
974 const size_t arg_N3 = 1,
const size_t arg_N4 = 1,
const size_t arg_N5 = 1,
975 const size_t arg_N6 = 1,
const size_t arg_N7 = KOKKOS_INVALID_INDEX) {
976 return view_type::shmem_size(arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5,
980 explicit KOKKOS_FUNCTION DynRankView(
981 const typename traits::execution_space::scratch_memory_space& arg_space,
982 const typename traits::array_layout& arg_layout)
983 : view_type(arg_space, drdtraits::createLayout(arg_layout)),
984 m_rank(drdtraits::computeRank(arg_layout)) {}
986 explicit KOKKOS_FUNCTION DynRankView(
987 const typename traits::execution_space::scratch_memory_space& arg_space,
988 const size_t arg_N0 = KOKKOS_INVALID_INDEX,
989 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
990 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
991 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
992 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
993 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
994 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
995 const size_t arg_N7 = KOKKOS_INVALID_INDEX)
997 : DynRankView(arg_space, typename traits::array_layout(
998 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4,
999 arg_N5, arg_N6, arg_N7)) {}
1001 KOKKOS_FUNCTION constexpr
auto layout()
const {
1003 case 0:
return Impl::as_view_of_rank_n<0>(*this).layout();
1004 case 1:
return Impl::as_view_of_rank_n<1>(*this).layout();
1005 case 2:
return Impl::as_view_of_rank_n<2>(*this).layout();
1006 case 3:
return Impl::as_view_of_rank_n<3>(*this).layout();
1007 case 4:
return Impl::as_view_of_rank_n<4>(*this).layout();
1008 case 5:
return Impl::as_view_of_rank_n<5>(*this).layout();
1009 case 6:
return Impl::as_view_of_rank_n<6>(*this).layout();
1010 case 7:
return Impl::as_view_of_rank_n<7>(*this).layout();
1015 "Calling DynRankView::layout on DRV of unexpected rank " +
1016 std::to_string(rank()))
1018 KOKKOS_IF_ON_DEVICE(
1020 "Calling DynRankView::layout on DRV of unexpected rank");)
1023 return view_type::layout();
1027 template <
typename D,
class... P>
1028 KOKKOS_FUNCTION constexpr
unsigned rank(
const DynRankView<D, P...>& DRV) {
1039 struct DynRankSubviewTag {};
1043 template <
class V,
class... Args>
1044 using Subdynrankview =
1045 typename Kokkos::Impl::ViewMapping<Kokkos::Impl::DynRankSubviewTag, V,
1048 template <
class... DRVArgs,
class SubArg0 = int,
class SubArg1 = int,
1049 class SubArg2 = int,
class SubArg3 = int,
class SubArg4 = int,
1050 class SubArg5 = int,
class SubArg6 =
int>
1051 KOKKOS_INLINE_FUNCTION
auto subdynrankview(
1052 const DynRankView<DRVArgs...>& drv, SubArg0 arg0 = SubArg0{},
1053 SubArg1 arg1 = SubArg1{}, SubArg2 arg2 = SubArg2{},
1054 SubArg3 arg3 = SubArg3{}, SubArg4 arg4 = SubArg4{},
1055 SubArg5 arg5 = SubArg5{}, SubArg6 arg6 = SubArg6{}) {
1056 auto sub = subview(drv.DownCast(), arg0, arg1, arg2, arg3, arg4, arg5, arg6);
1057 using sub_t = decltype(sub);
1058 size_t new_rank = (drv.rank() > 0 && !std::is_integral_v<SubArg0> ? 1 : 0) +
1059 (drv.rank() > 1 && !std::is_integral_v<SubArg1> ? 1 : 0) +
1060 (drv.rank() > 2 && !std::is_integral_v<SubArg2> ? 1 : 0) +
1061 (drv.rank() > 3 && !std::is_integral_v<SubArg3> ? 1 : 0) +
1062 (drv.rank() > 4 && !std::is_integral_v<SubArg4> ? 1 : 0) +
1063 (drv.rank() > 5 && !std::is_integral_v<SubArg5> ? 1 : 0) +
1064 (drv.rank() > 6 && !std::is_integral_v<SubArg6> ? 1 : 0);
1068 typename sub_t::device_type,
typename sub_t::memory_traits>;
1069 return static_cast<return_type
>(
1070 DynRankView<
typename sub_t::value_type,
typename sub_t::array_layout,
1071 typename sub_t::device_type,
typename sub_t::memory_traits>(
1074 template <
class... DRVArgs,
class SubArg0 = int,
class SubArg1 = int,
1075 class SubArg2 = int,
class SubArg3 = int,
class SubArg4 = int,
1076 class SubArg5 = int,
class SubArg6 =
int>
1077 KOKKOS_INLINE_FUNCTION
auto subview(
1078 const DynRankView<DRVArgs...>& drv, SubArg0 arg0 = SubArg0{},
1079 SubArg1 arg1 = SubArg1{}, SubArg2 arg2 = SubArg2{},
1080 SubArg3 arg3 = SubArg3{}, SubArg4 arg4 = SubArg4{},
1081 SubArg5 arg5 = SubArg5{}, SubArg6 arg6 = SubArg6{}) {
1082 return subdynrankview(drv, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
1090 template <
class LT,
class... LP,
class RT,
class... RP>
1091 KOKKOS_INLINE_FUNCTION
bool operator==(
const DynRankView<LT, LP...>& lhs,
1092 const DynRankView<RT, RP...>& rhs) {
1094 using lhs_traits = ViewTraits<LT, LP...>;
1095 using rhs_traits = ViewTraits<RT, RP...>;
1097 return std::is_same_v<
typename lhs_traits::const_value_type,
1098 typename rhs_traits::const_value_type> &&
1099 std::is_same_v<
typename lhs_traits::array_layout,
1100 typename rhs_traits::array_layout> &&
1101 std::is_same_v<
typename lhs_traits::memory_space,
1102 typename rhs_traits::memory_space> &&
1103 lhs.rank() == rhs.rank() && lhs.data() == rhs.data() &&
1104 lhs.span() == rhs.span() && lhs.extent(0) == rhs.extent(0) &&
1105 lhs.extent(1) == rhs.extent(1) && lhs.extent(2) == rhs.extent(2) &&
1106 lhs.extent(3) == rhs.extent(3) && lhs.extent(4) == rhs.extent(4) &&
1107 lhs.extent(5) == rhs.extent(5) && lhs.extent(6) == rhs.extent(6) &&
1108 lhs.extent(7) == rhs.extent(7);
1111 template <
class LT,
class... LP,
class RT,
class... RP>
1112 KOKKOS_INLINE_FUNCTION
bool operator!=(
const DynRankView<LT, LP...>& lhs,
1113 const DynRankView<RT, RP...>& rhs) {
1114 return !(operator==(lhs, rhs));
1124 template <
class OutputView,
class InputView,
1125 class ExecSpace =
typename OutputView::execution_space>
1126 struct DynRankViewRemap {
1127 const OutputView output;
1128 const InputView input;
1138 DynRankViewRemap(
const ExecSpace& exec_space,
const OutputView& arg_out,
1139 const InputView& arg_in)
1142 n0(std::min((size_t)arg_out.extent(0), (size_t)arg_in.extent(0))),
1143 n1(std::min((size_t)arg_out.extent(1), (size_t)arg_in.extent(1))),
1144 n2(std::min((size_t)arg_out.extent(2), (size_t)arg_in.extent(2))),
1145 n3(std::min((size_t)arg_out.extent(3), (size_t)arg_in.extent(3))),
1146 n4(std::min((size_t)arg_out.extent(4), (size_t)arg_in.extent(4))),
1147 n5(std::min((size_t)arg_out.extent(5), (size_t)arg_in.extent(5))),
1148 n6(std::min((size_t)arg_out.extent(6), (size_t)arg_in.extent(6))),
1149 n7(std::min((size_t)arg_out.extent(7), (size_t)arg_in.extent(7))) {
1152 Kokkos::parallel_for(
"Kokkos::DynRankViewRemap", Policy(exec_space, 0, n0),
1156 DynRankViewRemap(
const OutputView& arg_out,
const InputView& arg_in)
1159 n0(std::min((size_t)arg_out.extent(0), (size_t)arg_in.extent(0))),
1160 n1(std::min((size_t)arg_out.extent(1), (size_t)arg_in.extent(1))),
1161 n2(std::min((size_t)arg_out.extent(2), (size_t)arg_in.extent(2))),
1162 n3(std::min((size_t)arg_out.extent(3), (size_t)arg_in.extent(3))),
1163 n4(std::min((size_t)arg_out.extent(4), (size_t)arg_in.extent(4))),
1164 n5(std::min((size_t)arg_out.extent(5), (size_t)arg_in.extent(5))),
1165 n6(std::min((size_t)arg_out.extent(6), (size_t)arg_in.extent(6))),
1166 n7(std::min((size_t)arg_out.extent(7), (size_t)arg_in.extent(7))) {
1169 Kokkos::parallel_for(
"Kokkos::DynRankViewRemap", Policy(0, n0), *
this);
1172 KOKKOS_INLINE_FUNCTION
1173 void operator()(
const size_t i0)
const {
1174 for (
size_t i1 = 0; i1 < n1; ++i1) {
1175 for (
size_t i2 = 0; i2 < n2; ++i2) {
1176 for (
size_t i3 = 0; i3 < n3; ++i3) {
1177 for (
size_t i4 = 0; i4 < n4; ++i4) {
1178 for (
size_t i5 = 0; i5 < n5; ++i5) {
1179 for (
size_t i6 = 0; i6 < n6; ++i6) {
1180 output.access(i0, i1, i2, i3, i4, i5, i6) =
1181 input.access(i0, i1, i2, i3, i4, i5, i6);
1201 template <
unsigned N,
typename T,
typename... Args>
1202 KOKKOS_FUNCTION View<typename ViewDataTypeFromRank<T, N>::type, Args...>
1204 DynRankView<T, Args...> v,
1206 std::is_same_v<
typename ViewTraits<T, Args...>::specialize,
void>>*) {
1207 if (v.rank() != N) {
1209 const std::string message =
1210 "Converting DynRankView of rank " + std::to_string(v.rank()) +
1211 " to a View of mis-matched rank " + std::to_string(N) +
"!";
1212 Kokkos::abort(message.c_str());)
1213 KOKKOS_IF_ON_DEVICE(
1214 Kokkos::abort(
"Converting DynRankView to a View of mis-matched rank!");)
1217 auto layout = v.DownCast().layout();
1222 for (
int i = N; i < 7; ++i)
1223 layout.dimension[i] = KOKKOS_IMPL_CTOR_DEFAULT_ARG;
1226 return View<typename RankDataType<T, N>::type, Args...>(v.data(), layout);
1229 template <
typename Function,
typename... Args>
1230 void apply_to_view_of_static_rank(Function&& f, DynRankView<Args...> a) {
1232 case 0: f(as_view_of_rank_n<0>(a));
break;
1233 case 1: f(as_view_of_rank_n<1>(a));
break;
1234 case 2: f(as_view_of_rank_n<2>(a));
break;
1235 case 3: f(as_view_of_rank_n<3>(a));
break;
1236 case 4: f(as_view_of_rank_n<4>(a));
break;
1237 case 5: f(as_view_of_rank_n<5>(a));
break;
1238 case 6: f(as_view_of_rank_n<6>(a));
break;
1239 case 7: f(as_view_of_rank_n<7>(a));
break;
1244 "Trying to apply a function to a view of unexpected rank " +
1245 std::to_string(rank(a)))
1247 KOKKOS_IF_ON_DEVICE(
1249 "Trying to apply a function to a view of unexpected rank");)
1256 template <class ExecSpace, class DT, class... DP>
1257 inline void deep_copy(
1258 const ExecSpace& e,
const DynRankView<DT, DP...>& dst,
1259 typename ViewTraits<DT, DP...>::const_value_type& value,
1260 std::enable_if_t<std::is_same_v<
typename ViewTraits<DT, DP...>::specialize,
1261 void>>* =
nullptr) {
1263 std::is_same_v<
typename ViewTraits<DT, DP...>::non_const_value_type,
1264 typename ViewTraits<DT, DP...>::value_type>,
1265 "deep_copy requires non-const type");
1267 Impl::apply_to_view_of_static_rank(
1268 [=](
auto view) { deep_copy(e, view, value); }, dst);
1271 template <
class DT,
class... DP>
1272 inline void deep_copy(
1273 const DynRankView<DT, DP...>& dst,
1274 typename ViewTraits<DT, DP...>::const_value_type& value,
1275 std::enable_if_t<std::is_same_v<
typename ViewTraits<DT, DP...>::specialize,
1276 void>>* =
nullptr) {
1277 Impl::apply_to_view_of_static_rank([=](
auto view) { deep_copy(view, value); },
1282 template <
class ExecSpace,
class ST,
class... SP>
1283 inline void deep_copy(
1285 typename ViewTraits<ST, SP...>::non_const_value_type& dst,
1286 const DynRankView<ST, SP...>& src,
1287 std::enable_if_t<std::is_same_v<
typename ViewTraits<ST, SP...>::specialize,
1289 deep_copy(e, dst, Impl::as_view_of_rank_n<0>(src));
1292 template <
class ST,
class... SP>
1293 inline void deep_copy(
1294 typename ViewTraits<ST, SP...>::non_const_value_type& dst,
1295 const DynRankView<ST, SP...>& src,
1296 std::enable_if_t<std::is_same_v<
typename ViewTraits<ST, SP...>::specialize,
1298 deep_copy(dst, Impl::as_view_of_rank_n<0>(src));
1307 template <
class ExecSpace,
class DstType,
class SrcType>
1308 inline void deep_copy(
1309 const ExecSpace& exec_space,
const DstType& dst,
const SrcType& src,
1310 std::enable_if_t<(std::is_void_v<typename DstType::traits::specialize> &&
1311 std::is_void_v<typename SrcType::traits::specialize> &&
1312 (Kokkos::is_dyn_rank_view<DstType>::value ||
1313 Kokkos::is_dyn_rank_view<SrcType>::value))>* =
nullptr) {
1314 static_assert(std::is_same_v<
typename DstType::traits::value_type,
1315 typename DstType::traits::non_const_value_type>,
1316 "deep_copy requires non-const destination type");
1318 switch (rank(dst)) {
1320 deep_copy(exec_space, Impl::as_view_of_rank_n<0>(dst),
1321 Impl::as_view_of_rank_n<0>(src));
1324 deep_copy(exec_space, Impl::as_view_of_rank_n<1>(dst),
1325 Impl::as_view_of_rank_n<1>(src));
1328 deep_copy(exec_space, Impl::as_view_of_rank_n<2>(dst),
1329 Impl::as_view_of_rank_n<2>(src));
1332 deep_copy(exec_space, Impl::as_view_of_rank_n<3>(dst),
1333 Impl::as_view_of_rank_n<3>(src));
1336 deep_copy(exec_space, Impl::as_view_of_rank_n<4>(dst),
1337 Impl::as_view_of_rank_n<4>(src));
1340 deep_copy(exec_space, Impl::as_view_of_rank_n<5>(dst),
1341 Impl::as_view_of_rank_n<5>(src));
1344 deep_copy(exec_space, Impl::as_view_of_rank_n<6>(dst),
1345 Impl::as_view_of_rank_n<6>(src));
1348 deep_copy(exec_space, Impl::as_view_of_rank_n<7>(dst),
1349 Impl::as_view_of_rank_n<7>(src));
1352 Kokkos::Impl::throw_runtime_exception(
1353 "Calling DynRankView deep_copy with a view of unexpected rank " +
1354 std::to_string(rank(dst)));
1358 template <
class DstType,
class SrcType>
1359 inline void deep_copy(
1360 const DstType& dst,
const SrcType& src,
1361 std::enable_if_t<(std::is_void_v<typename DstType::traits::specialize> &&
1362 std::is_void_v<typename SrcType::traits::specialize> &&
1363 (Kokkos::is_dyn_rank_view<DstType>::value ||
1364 Kokkos::is_dyn_rank_view<SrcType>::value))>* =
nullptr) {
1365 static_assert(std::is_same_v<
typename DstType::traits::value_type,
1366 typename DstType::traits::non_const_value_type>,
1367 "deep_copy requires non-const destination type");
1369 switch (rank(dst)) {
1371 deep_copy(Impl::as_view_of_rank_n<0>(dst),
1372 Impl::as_view_of_rank_n<0>(src));
1375 deep_copy(Impl::as_view_of_rank_n<1>(dst),
1376 Impl::as_view_of_rank_n<1>(src));
1379 deep_copy(Impl::as_view_of_rank_n<2>(dst),
1380 Impl::as_view_of_rank_n<2>(src));
1383 deep_copy(Impl::as_view_of_rank_n<3>(dst),
1384 Impl::as_view_of_rank_n<3>(src));
1387 deep_copy(Impl::as_view_of_rank_n<4>(dst),
1388 Impl::as_view_of_rank_n<4>(src));
1391 deep_copy(Impl::as_view_of_rank_n<5>(dst),
1392 Impl::as_view_of_rank_n<5>(src));
1395 deep_copy(Impl::as_view_of_rank_n<6>(dst),
1396 Impl::as_view_of_rank_n<6>(src));
1399 deep_copy(Impl::as_view_of_rank_n<7>(dst),
1400 Impl::as_view_of_rank_n<7>(src));
1403 Kokkos::Impl::throw_runtime_exception(
1404 "Calling DynRankView deep_copy with a view of unexpected rank " +
1405 std::to_string(rank(dst)));
1418 template <
class Space,
class T,
class... P>
1419 struct MirrorDRViewType {
1421 using src_view_type =
typename Kokkos::DynRankView<T, P...>;
1423 using memory_space =
typename Space::memory_space;
1427 std::is_same_v<memory_space, typename src_view_type::memory_space>
1430 using array_layout =
typename src_view_type::array_layout;
1433 using data_type =
typename src_view_type::non_const_data_type;
1435 using dest_view_type = Kokkos::DynRankView<data_type, array_layout, Space>;
1439 std::conditional_t<is_same_memspace, src_view_type, dest_view_type>;
1449 template <
class T,
class... P,
class... ViewCtorArgs>
1450 inline auto create_mirror(
const DynRankView<T, P...>& src,
1451 const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop) {
1452 check_view_ctor_args_create_mirror<ViewCtorArgs...>();
1454 auto prop_copy = Impl::with_properties_if_unset(
1455 arg_prop, std::string(src.label()).append(
"_mirror"));
1457 if constexpr (Impl::ViewCtorProp<ViewCtorArgs...>::has_memory_space) {
1458 using dst_type =
typename Impl::MirrorDRViewType<
1459 typename Impl::ViewCtorProp<ViewCtorArgs...>::memory_space, T,
1460 P...>::dest_view_type;
1461 return dst_type(prop_copy,
1462 Impl::reconstructLayout(src.layout(), src.rank()));
1464 using src_type = DynRankView<T, P...>;
1465 using dst_type =
typename src_type::HostMirror;
1467 return dst_type(prop_copy,
1468 Impl::reconstructLayout(src.layout(), src.rank()));
1470 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
1471 !defined(KOKKOS_COMPILER_MSVC)
1472 __builtin_unreachable();
1479 template <
class T,
class... P,
1480 class Enable = std::enable_if_t<
1481 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1482 inline auto create_mirror(
const DynRankView<T, P...>& src) {
1483 return Impl::create_mirror(src, Kokkos::view_alloc());
1487 template <
class T,
class... P,
1488 class Enable = std::enable_if_t<
1489 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1490 inline auto create_mirror(Kokkos::Impl::WithoutInitializing_t wi,
1491 const DynRankView<T, P...>& src) {
1492 return Impl::create_mirror(src, Kokkos::view_alloc(wi));
1496 template <
class Space,
class T,
class... P,
1497 class Enable = std::enable_if_t<
1498 Kokkos::is_space<Space>::value &&
1499 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1500 inline auto create_mirror(
const Space&,
1501 const Kokkos::DynRankView<T, P...>& src) {
1502 return Impl::create_mirror(
1503 src, Kokkos::view_alloc(
typename Space::memory_space{}));
1507 template <
class Space,
class T,
class... P,
1508 class Enable = std::enable_if_t<
1509 Kokkos::is_space<Space>::value &&
1510 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1511 inline auto create_mirror(Kokkos::Impl::WithoutInitializing_t wi,
const Space&,
1512 const Kokkos::DynRankView<T, P...>& src) {
1513 return Impl::create_mirror(
1514 src, Kokkos::view_alloc(wi,
typename Space::memory_space{}));
1519 template <
class T,
class... P,
class... ViewCtorArgs,
1520 typename Enable = std::enable_if_t<
1521 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1522 inline auto create_mirror(
const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1523 const DynRankView<T, P...>& src) {
1524 return Impl::create_mirror(src, arg_prop);
1532 template <
class T,
class... P,
class... ViewCtorArgs>
1533 inline auto create_mirror_view(
1534 const DynRankView<T, P...>& src,
1535 [[maybe_unused]]
const typename Impl::ViewCtorProp<ViewCtorArgs...>&
1537 if constexpr (!Impl::ViewCtorProp<ViewCtorArgs...>::has_memory_space) {
1538 if constexpr (std::is_same_v<
typename DynRankView<T, P...>::memory_space,
1539 typename DynRankView<
1540 T, P...>::HostMirror::memory_space> &&
1542 typename DynRankView<T, P...>::data_type,
1543 typename DynRankView<T, P...>::HostMirror::data_type>) {
1544 return typename DynRankView<T, P...>::HostMirror(src);
1546 return Kokkos::Impl::choose_create_mirror(src, arg_prop);
1549 if constexpr (Impl::MirrorDRViewType<
typename Impl::ViewCtorProp<
1550 ViewCtorArgs...>::memory_space,
1551 T, P...>::is_same_memspace) {
1552 return typename Impl::MirrorDRViewType<
1553 typename Impl::ViewCtorProp<ViewCtorArgs...>::memory_space, T,
1554 P...>::view_type(src);
1556 return Kokkos::Impl::choose_create_mirror(src, arg_prop);
1559 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
1560 !defined(KOKKOS_COMPILER_MSVC)
1561 __builtin_unreachable();
1568 template <
class T,
class... P>
1569 inline auto create_mirror_view(
const Kokkos::DynRankView<T, P...>& src) {
1570 return Impl::create_mirror_view(src, Kokkos::view_alloc());
1574 template <
class T,
class... P>
1575 inline auto create_mirror_view(Kokkos::Impl::WithoutInitializing_t wi,
1576 const DynRankView<T, P...>& src) {
1577 return Impl::create_mirror_view(src, Kokkos::view_alloc(wi));
1581 template <
class Space,
class T,
class... P,
1582 class Enable = std::enable_if_t<Kokkos::is_space<Space>::value>>
1583 inline auto create_mirror_view(
const Space&,
1584 const Kokkos::DynRankView<T, P...>& src) {
1585 return Impl::create_mirror_view(
1586 src, Kokkos::view_alloc(
typename Space::memory_space()));
1590 template <
class Space,
class T,
class... P,
1591 typename Enable = std::enable_if_t<Kokkos::is_space<Space>::value>>
1592 inline auto create_mirror_view(Kokkos::Impl::WithoutInitializing_t wi,
1594 const Kokkos::DynRankView<T, P...>& src) {
1595 return Impl::create_mirror_view(
1596 src, Kokkos::view_alloc(
typename Space::memory_space{}, wi));
1601 template <
class T,
class... P,
class... ViewCtorArgs>
1602 inline auto create_mirror_view(
1603 const typename Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1604 const Kokkos::DynRankView<T, P...>& src) {
1605 return Impl::create_mirror_view(src, arg_prop);
1611 template <
class... ViewCtorArgs,
class T,
class... P,
1612 class Enable = std::enable_if_t<
1613 std::is_void_v<
typename ViewTraits<T, P...>::specialize>>>
1614 auto create_mirror_view_and_copy(
1615 [[maybe_unused]]
const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1616 const Kokkos::DynRankView<T, P...>& src) {
1617 using alloc_prop_input = Impl::ViewCtorProp<ViewCtorArgs...>;
1619 Impl::check_view_ctor_args_create_mirror_view_and_copy<ViewCtorArgs...>();
1621 if constexpr (Impl::MirrorDRViewType<
1622 typename Impl::ViewCtorProp<ViewCtorArgs...>::memory_space,
1623 T, P...>::is_same_memspace) {
1625 if constexpr (!alloc_prop_input::has_execution_space)
1627 "Kokkos::create_mirror_view_and_copy: fence before returning src "
1631 using Space =
typename alloc_prop_input::memory_space;
1632 using Mirror =
typename Impl::MirrorDRViewType<Space, T, P...>::view_type;
1634 auto arg_prop_copy = Impl::with_properties_if_unset(
1635 arg_prop, std::string{}, WithoutInitializing,
1636 typename Space::execution_space{});
1638 std::string& label = Impl::get_property<Impl::LabelTag>(arg_prop_copy);
1639 if (label.empty()) label = src.label();
1640 auto mirror =
typename Mirror::non_const_type{
1641 arg_prop_copy, Impl::reconstructLayout(src.layout(), src.rank())};
1642 if constexpr (alloc_prop_input::has_execution_space) {
1643 deep_copy(Impl::get_property<Impl::ExecutionSpaceTag>(arg_prop_copy),
1646 deep_copy(mirror, src);
1649 #if defined(KOKKOS_COMPILER_NVCC) && KOKKOS_COMPILER_NVCC >= 1130 && \
1650 !defined(KOKKOS_COMPILER_MSVC)
1651 __builtin_unreachable();
1655 template <
class Space,
class T,
class... P>
1656 auto create_mirror_view_and_copy(
const Space&,
1657 const Kokkos::DynRankView<T, P...>& src,
1658 std::string
const& name =
"") {
1659 return create_mirror_view_and_copy(
1660 Kokkos::view_alloc(
typename Space::memory_space{}, name), src);
1671 template <
class... ViewCtorArgs,
class T,
class... P>
1672 inline void impl_resize(
const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1673 DynRankView<T, P...>& v,
const size_t n0,
1674 const size_t n1,
const size_t n2,
const size_t n3,
1675 const size_t n4,
const size_t n5,
const size_t n6,
1677 using drview_type = DynRankView<T, P...>;
1678 using alloc_prop_input = Impl::ViewCtorProp<ViewCtorArgs...>;
1680 static_assert(Kokkos::ViewTraits<T, P...>::is_managed,
1681 "Can only resize managed views");
1682 static_assert(!alloc_prop_input::has_label,
1683 "The view constructor arguments passed to Kokkos::resize "
1684 "must not include a label!");
1685 static_assert(!alloc_prop_input::has_pointer,
1686 "The view constructor arguments passed to Kokkos::resize must "
1687 "not include a pointer!");
1688 static_assert(!alloc_prop_input::has_memory_space,
1689 "The view constructor arguments passed to Kokkos::resize must "
1690 "not include a memory space instance!");
1692 auto prop_copy = Impl::with_properties_if_unset(
1693 arg_prop, v.label(),
typename drview_type::execution_space{});
1695 drview_type v_resized(prop_copy, n0, n1, n2, n3, n4, n5, n6, n7);
1697 if constexpr (alloc_prop_input::has_execution_space)
1698 Kokkos::Impl::DynRankViewRemap<drview_type, drview_type>(
1699 Impl::get_property<Impl::ExecutionSpaceTag>(prop_copy), v_resized, v);
1702 Kokkos::Impl::DynRankViewRemap<drview_type, drview_type>(v_resized, v);
1703 Kokkos::fence(
"Kokkos::resize(DynRankView)");
1708 template <
class T,
class... P>
1709 inline void resize(DynRankView<T, P...>& v,
1710 const size_t n0 = KOKKOS_INVALID_INDEX,
1711 const size_t n1 = KOKKOS_INVALID_INDEX,
1712 const size_t n2 = KOKKOS_INVALID_INDEX,
1713 const size_t n3 = KOKKOS_INVALID_INDEX,
1714 const size_t n4 = KOKKOS_INVALID_INDEX,
1715 const size_t n5 = KOKKOS_INVALID_INDEX,
1716 const size_t n6 = KOKKOS_INVALID_INDEX,
1717 const size_t n7 = KOKKOS_INVALID_INDEX) {
1718 impl_resize(Impl::ViewCtorProp<>{}, v, n0, n1, n2, n3, n4, n5, n6, n7);
1721 template <
class... ViewCtorArgs,
class T,
class... P>
1722 void resize(
const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1723 DynRankView<T, P...>& v,
1724 const size_t n0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1725 const size_t n1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1726 const size_t n2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1727 const size_t n3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1728 const size_t n4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1729 const size_t n5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1730 const size_t n6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1731 const size_t n7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG) {
1732 impl_resize(arg_prop, v, n0, n1, n2, n3, n4, n5, n6, n7);
1735 template <
class I,
class T,
class... P>
1736 inline std::enable_if_t<Impl::is_view_ctor_property<I>::value> resize(
1737 const I& arg_prop, DynRankView<T, P...>& v,
1738 const size_t n0 = KOKKOS_INVALID_INDEX,
1739 const size_t n1 = KOKKOS_INVALID_INDEX,
1740 const size_t n2 = KOKKOS_INVALID_INDEX,
1741 const size_t n3 = KOKKOS_INVALID_INDEX,
1742 const size_t n4 = KOKKOS_INVALID_INDEX,
1743 const size_t n5 = KOKKOS_INVALID_INDEX,
1744 const size_t n6 = KOKKOS_INVALID_INDEX,
1745 const size_t n7 = KOKKOS_INVALID_INDEX) {
1746 impl_resize(Kokkos::view_alloc(arg_prop), v, n0, n1, n2, n3, n4, n5, n6, n7);
1751 template <
class... ViewCtorArgs,
class T,
class... P>
1752 inline void impl_realloc(DynRankView<T, P...>& v,
const size_t n0,
1753 const size_t n1,
const size_t n2,
const size_t n3,
1754 const size_t n4,
const size_t n5,
const size_t n6,
1756 const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop) {
1757 using drview_type = DynRankView<T, P...>;
1758 using alloc_prop_input = Impl::ViewCtorProp<ViewCtorArgs...>;
1760 static_assert(Kokkos::ViewTraits<T, P...>::is_managed,
1761 "Can only realloc managed views");
1762 static_assert(!alloc_prop_input::has_label,
1763 "The view constructor arguments passed to Kokkos::realloc must "
1764 "not include a label!");
1765 static_assert(!alloc_prop_input::has_pointer,
1766 "The view constructor arguments passed to Kokkos::realloc must "
1767 "not include a pointer!");
1768 static_assert(!alloc_prop_input::has_memory_space,
1769 "The view constructor arguments passed to Kokkos::realloc must "
1770 "not include a memory space instance!");
1772 auto arg_prop_copy = Impl::with_properties_if_unset(arg_prop, v.label());
1775 v = drview_type(arg_prop_copy, n0, n1, n2, n3, n4, n5, n6, n7);
1778 template <
class T,
class... P,
class... ViewCtorArgs>
1779 inline void realloc(
const Impl::ViewCtorProp<ViewCtorArgs...>& arg_prop,
1780 DynRankView<T, P...>& v,
1781 const size_t n0 = KOKKOS_INVALID_INDEX,
1782 const size_t n1 = KOKKOS_INVALID_INDEX,
1783 const size_t n2 = KOKKOS_INVALID_INDEX,
1784 const size_t n3 = KOKKOS_INVALID_INDEX,
1785 const size_t n4 = KOKKOS_INVALID_INDEX,
1786 const size_t n5 = KOKKOS_INVALID_INDEX,
1787 const size_t n6 = KOKKOS_INVALID_INDEX,
1788 const size_t n7 = KOKKOS_INVALID_INDEX) {
1789 impl_realloc(v, n0, n1, n2, n3, n4, n5, n6, n7, arg_prop);
1792 template <
class T,
class... P>
1793 inline void realloc(DynRankView<T, P...>& v,
1794 const size_t n0 = KOKKOS_INVALID_INDEX,
1795 const size_t n1 = KOKKOS_INVALID_INDEX,
1796 const size_t n2 = KOKKOS_INVALID_INDEX,
1797 const size_t n3 = KOKKOS_INVALID_INDEX,
1798 const size_t n4 = KOKKOS_INVALID_INDEX,
1799 const size_t n5 = KOKKOS_INVALID_INDEX,
1800 const size_t n6 = KOKKOS_INVALID_INDEX,
1801 const size_t n7 = KOKKOS_INVALID_INDEX) {
1802 impl_realloc(v, n0, n1, n2, n3, n4, n5, n6, n7, Impl::ViewCtorProp<>{});
1805 template <
class I,
class T,
class... P>
1806 inline std::enable_if_t<Impl::is_view_ctor_property<I>::value> realloc(
1807 const I& arg_prop, DynRankView<T, P...>& v,
1808 const size_t n0 = KOKKOS_INVALID_INDEX,
1809 const size_t n1 = KOKKOS_INVALID_INDEX,
1810 const size_t n2 = KOKKOS_INVALID_INDEX,
1811 const size_t n3 = KOKKOS_INVALID_INDEX,
1812 const size_t n4 = KOKKOS_INVALID_INDEX,
1813 const size_t n5 = KOKKOS_INVALID_INDEX,
1814 const size_t n6 = KOKKOS_INVALID_INDEX,
1815 const size_t n7 = KOKKOS_INVALID_INDEX) {
1816 impl_realloc(v, n0, n1, n2, n3, n4, n5, n6, n7, Kokkos::view_alloc(arg_prop));
1821 #ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DYNRANKVIEW
1822 #undef KOKKOS_IMPL_PUBLIC_INCLUDE
1823 #undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_DYNRANKVIEW
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices.
KOKKOS_INLINE_FUNCTION bool dyn_rank_view_verify_operator_bounds(const iType0 &, const MapType &)
Debug bounds-checking routines.
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory...
Memory layout tag indicating right-to-left (C or lexigraphical scheme) striding of multi-indices...
Assign compatible default mappings.
Execution policy for work over a range of an integral type.