576 template <
class,
class...>
578 template <
class,
class...>
579 friend class Kokkos::Impl::ViewMapping;
581 using view_tracker_type = Kokkos::Impl::ViewTracker<View>;
584 using traits =
ViewTraits<DataType, Properties...>;
588 Kokkos::Impl::ViewMapping<traits, typename traits::specialize>;
589 template <
typename V>
590 friend struct Kokkos::Impl::ViewTracker;
591 using hooks_policy =
typename traits::hooks_policy;
593 view_tracker_type m_track;
600 View<
typename traits::scalar_array_type,
typename traits::array_layout,
601 typename traits::device_type,
typename traits::hooks_policy,
602 typename traits::memory_traits>;
606 View<
typename traits::const_data_type,
typename traits::array_layout,
607 typename traits::device_type,
typename traits::hooks_policy,
608 typename traits::memory_traits>;
612 View<
typename traits::non_const_data_type,
typename traits::array_layout,
613 typename traits::device_type,
typename traits::hooks_policy,
614 typename traits::memory_traits>;
618 View<
typename traits::non_const_data_type,
typename traits::array_layout,
619 Device<DefaultHostExecutionSpace,
620 typename traits::host_mirror_space::memory_space>,
621 typename traits::hooks_policy>;
625 View<
typename traits::non_const_data_type,
typename traits::array_layout,
626 typename traits::host_mirror_space,
typename traits::hooks_policy>;
630 using uniform_const_type =
631 typename Impl::ViewUniformType<View, 0>::const_type;
632 using uniform_runtime_type =
633 typename Impl::ViewUniformType<View, 0>::runtime_type;
634 using uniform_runtime_const_type =
635 typename Impl::ViewUniformType<View, 0>::runtime_const_type;
636 using uniform_nomemspace_type =
637 typename Impl::ViewUniformType<View, 0>::nomemspace_type;
638 using uniform_const_nomemspace_type =
639 typename Impl::ViewUniformType<View, 0>::const_nomemspace_type;
640 using uniform_runtime_nomemspace_type =
641 typename Impl::ViewUniformType<View, 0>::runtime_nomemspace_type;
642 using uniform_runtime_const_nomemspace_type =
643 typename Impl::ViewUniformType<View, 0>::runtime_const_nomemspace_type;
648 static constexpr Impl::integral_constant<size_t, traits::dimension::rank>
650 static constexpr Impl::integral_constant<size_t,
651 traits::dimension::rank_dynamic>
653#ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
654 enum {Rank KOKKOS_DEPRECATED_WITH_COMMENT(
"Use rank instead.") =
658 template <
typename iType>
659 KOKKOS_INLINE_FUNCTION
constexpr std::enable_if_t<
660 std::is_integral<iType>::value,
size_t>
661 extent(
const iType& r)
const noexcept {
662 return m_map.extent(r);
665 static KOKKOS_INLINE_FUNCTION
constexpr size_t static_extent(
666 const unsigned r)
noexcept {
667 return map_type::static_extent(r);
670 template <
typename iType>
671 KOKKOS_INLINE_FUNCTION
constexpr std::enable_if_t<
672 std::is_integral<iType>::value,
int>
673 extent_int(
const iType& r)
const noexcept {
674 return static_cast<int>(m_map.extent(r));
677 KOKKOS_INLINE_FUNCTION
constexpr typename traits::array_layout layout()
679 return m_map.layout();
687 KOKKOS_INLINE_FUNCTION
constexpr size_t size()
const {
688 return m_map.dimension_0() * m_map.dimension_1() * m_map.dimension_2() *
689 m_map.dimension_3() * m_map.dimension_4() * m_map.dimension_5() *
690 m_map.dimension_6() * m_map.dimension_7();
693 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_0()
const {
694 return m_map.stride_0();
696 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_1()
const {
697 return m_map.stride_1();
699 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_2()
const {
700 return m_map.stride_2();
702 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_3()
const {
703 return m_map.stride_3();
705 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_4()
const {
706 return m_map.stride_4();
708 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_5()
const {
709 return m_map.stride_5();
711 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_6()
const {
712 return m_map.stride_6();
714 KOKKOS_INLINE_FUNCTION
constexpr size_t stride_7()
const {
715 return m_map.stride_7();
718 template <
typename iType>
719 KOKKOS_INLINE_FUNCTION
constexpr std::enable_if_t<
720 std::is_integral<iType>::value,
size_t>
721 stride(iType r)
const {
737 : m_map.stride_7())))))));
740 template <
typename iType>
741 KOKKOS_INLINE_FUNCTION
void stride(iType*
const s)
const {
748 using reference_type =
typename map_type::reference_type;
749 using pointer_type =
typename map_type::pointer_type;
752 reference_type_is_lvalue_reference =
753 std::is_lvalue_reference<reference_type>::value
756 KOKKOS_INLINE_FUNCTION
constexpr size_t span()
const {
return m_map.span(); }
757 KOKKOS_INLINE_FUNCTION
bool span_is_contiguous()
const {
758 return m_map.span_is_contiguous();
760 KOKKOS_INLINE_FUNCTION
constexpr bool is_allocated()
const {
761 return m_map.data() !=
nullptr;
763 KOKKOS_INLINE_FUNCTION
constexpr pointer_type data()
const {
770 KOKKOS_INLINE_FUNCTION
771 const Kokkos::Impl::ViewMapping<traits, typename traits::specialize>&
775 KOKKOS_INLINE_FUNCTION
776 const Kokkos::Impl::SharedAllocationTracker& impl_track()
const {
777 return m_track.m_tracker;
782 static constexpr bool is_layout_left =
783 std::is_same<typename traits::array_layout, Kokkos::LayoutLeft>::value;
785 static constexpr bool is_layout_right =
786 std::is_same<typename traits::array_layout, Kokkos::LayoutRight>::value;
788 static constexpr bool is_layout_stride =
789 std::is_same<typename traits::array_layout, Kokkos::LayoutStride>::value;
791 static constexpr bool is_default_map =
792 std::is_void<typename traits::specialize>::value &&
793 (is_layout_left || is_layout_right || is_layout_stride);
795#if defined(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK)
797#define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(...) \
798 Kokkos::Impl::runtime_check_memory_access_violation< \
799 typename traits::memory_space>( \
800 "Kokkos::View ERROR: attempt to access inaccessible memory space", \
802 Kokkos::Impl::view_verify_operator_bounds<typename traits::memory_space>( \
807#define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(...) \
808 Kokkos::Impl::runtime_check_memory_access_violation< \
809 typename traits::memory_space>( \
810 "Kokkos::View ERROR: attempt to access inaccessible memory space", \
815 template <
typename... Is>
816 static KOKKOS_FUNCTION
void check_access_member_function_valid_args(Is...) {
817 static_assert(rank <=
sizeof...(Is),
"");
818 static_assert(
sizeof...(Is) <= 8,
"");
819 static_assert(Kokkos::Impl::are_integral<Is...>::value,
"");
822 template <
typename... Is>
823 static KOKKOS_FUNCTION
void check_operator_parens_valid_args(Is...) {
824 static_assert(rank ==
sizeof...(Is),
"");
825 static_assert(Kokkos::Impl::are_integral<Is...>::value,
"");
832 template <
typename I0>
833 KOKKOS_FORCEINLINE_FUNCTION
834 std::enable_if_t<(Kokkos::Impl::always_true<I0>::value &&
835 (1 == rank) && is_default_map && !is_layout_stride),
837 operator()(I0 i0)
const {
838 check_operator_parens_valid_args(i0);
839 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0)
840 return m_map.m_impl_handle[i0];
843 template <
typename I0>
844 KOKKOS_FORCEINLINE_FUNCTION
845 std::enable_if_t<(Kokkos::Impl::always_true<I0>::value &&
846 (1 == rank) && is_default_map && is_layout_stride),
848 operator()(I0 i0)
const {
849 check_operator_parens_valid_args(i0);
850 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0)
851 return m_map.m_impl_handle[m_map.m_impl_offset.m_stride.S0 * i0];
857 template <
typename I0>
858 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
859 ((1 == rank) && Kokkos::Impl::are_integral<I0>::value && !is_default_map),
861 operator[](I0 i0)
const {
862 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0)
863 return m_map.reference(i0);
866 template <
typename I0>
867 KOKKOS_FORCEINLINE_FUNCTION
868 std::enable_if_t<((1 == rank) && Kokkos::Impl::are_integral<I0>::value &&
869 is_default_map && !is_layout_stride),
871 operator[](I0 i0)
const {
872 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0)
873 return m_map.m_impl_handle[i0];
876 template <
typename I0>
877 KOKKOS_FORCEINLINE_FUNCTION
878 std::enable_if_t<((1 == rank) && Kokkos::Impl::are_integral<I0>::value &&
879 is_default_map && is_layout_stride),
881 operator[](I0 i0)
const {
882 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0)
883 return m_map.m_impl_handle[m_map.m_impl_offset.m_stride.S0 * i0];
889 template <
typename I0,
typename I1>
890 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
891 (Kokkos::Impl::always_true<I0, I1>::value &&
892 (2 == rank) && is_default_map && is_layout_left && (rank_dynamic == 0)),
894 operator()(I0 i0, I1 i1)
const {
895 check_operator_parens_valid_args(i0, i1);
896 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1)
897 return m_map.m_impl_handle[i0 + m_map.m_impl_offset.m_dim.N0 * i1];
900 template <
typename I0,
typename I1>
901 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
902 (Kokkos::Impl::always_true<I0, I1>::value &&
903 (2 == rank) && is_default_map && is_layout_left && (rank_dynamic != 0)),
905 operator()(I0 i0, I1 i1)
const {
906 check_operator_parens_valid_args(i0, i1);
907 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1)
908 return m_map.m_impl_handle[i0 + m_map.m_impl_offset.m_stride * i1];
911 template <
typename I0,
typename I1>
912 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
913 (Kokkos::Impl::always_true<I0, I1>::value &&
914 (2 == rank) && is_default_map && is_layout_right && (rank_dynamic == 0)),
916 operator()(I0 i0, I1 i1)
const {
917 check_operator_parens_valid_args(i0, i1);
918 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1)
919 return m_map.m_impl_handle[i1 + m_map.m_impl_offset.m_dim.N1 * i0];
922 template <
typename I0,
typename I1>
923 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
924 (Kokkos::Impl::always_true<I0, I1>::value &&
925 (2 == rank) && is_default_map && is_layout_right && (rank_dynamic != 0)),
927 operator()(I0 i0, I1 i1)
const {
928 check_operator_parens_valid_args(i0, i1);
929 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1)
930 return m_map.m_impl_handle[i1 + m_map.m_impl_offset.m_stride * i0];
933 template <
typename I0,
typename I1>
934 KOKKOS_FORCEINLINE_FUNCTION
935 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1>::value &&
936 (2 == rank) && is_default_map && is_layout_stride),
938 operator()(I0 i0, I1 i1)
const {
939 check_operator_parens_valid_args(i0, i1);
940 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1)
941 return m_map.m_impl_handle[i0 * m_map.m_impl_offset.m_stride.S0 +
942 i1 * m_map.m_impl_offset.m_stride.S1];
948 template <
typename... Is>
949 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
950 (Kokkos::Impl::always_true<Is...>::value &&
951 (2 != rank) && (1 != rank) && (0 != rank) && is_default_map),
953 operator()(Is... indices)
const {
954 check_operator_parens_valid_args(indices...);
955 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, indices...)
956 return m_map.m_impl_handle[m_map.m_impl_offset(indices...)];
959 template <typename... Is>
960 KOKKOS_FORCEINLINE_FUNCTION
961 std::enable_if_t<(Kokkos::Impl::always_true<Is...>::value &&
962 ((0 == rank) || !is_default_map)),
964 operator()(Is... indices)
const {
965 check_operator_parens_valid_args(indices...);
966 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, indices...)
967 return m_map.reference(indices...);
973 template <typename... Is>
974 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
975 (Kokkos::Impl::always_true<Is...>::value && (0 == rank)), reference_type>
976 access(Is... extra)
const {
977 check_access_member_function_valid_args(extra...);
978 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, extra...)
979 return m_map.reference();
985 template <typename I0, typename... Is>
986 KOKKOS_FORCEINLINE_FUNCTION
987 std::enable_if_t<(Kokkos::Impl::always_true<I0, Is...>::value &&
988 (1 == rank) && !is_default_map),
990 access(I0 i0, Is... extra)
const {
991 check_access_member_function_valid_args(i0, extra...);
992 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, extra...)
993 return m_map.reference(i0);
996 template <typename I0, typename... Is>
997 KOKKOS_FORCEINLINE_FUNCTION
998 std::enable_if_t<(Kokkos::Impl::always_true<I0, Is...>::value &&
999 (1 == rank) && is_default_map && !is_layout_stride),
1001 access(I0 i0, Is... extra)
const {
1002 check_access_member_function_valid_args(i0, extra...);
1003 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, extra...)
1004 return m_map.m_impl_handle[i0];
1007 template <typename I0, typename... Is>
1008 KOKKOS_FORCEINLINE_FUNCTION
1009 std::enable_if_t<(Kokkos::Impl::always_true<I0, Is...>::value &&
1010 (1 == rank) && is_default_map && is_layout_stride),
1012 access(I0 i0, Is... extra)
const {
1013 check_access_member_function_valid_args(i0, extra...);
1014 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, extra...)
1015 return m_map.m_impl_handle[m_map.m_impl_offset.m_stride.S0 * i0];
1021 template <typename I0, typename I1, typename... Is>
1022 KOKKOS_FORCEINLINE_FUNCTION
1023 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, Is...>::value &&
1024 (2 == rank) && !is_default_map),
1026 access(I0 i0, I1 i1, Is... extra)
const {
1027 check_access_member_function_valid_args(i0, i1, extra...);
1028 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1029 return m_map.reference(i0, i1);
1032 template <typename I0, typename I1, typename... Is>
1033 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1034 (Kokkos::Impl::always_true<I0, I1, Is...>::value && (2 == rank) &&
1035 is_default_map && is_layout_left && (rank_dynamic == 0)),
1037 access(I0 i0, I1 i1, Is... extra)
const {
1038 check_access_member_function_valid_args(i0, i1, extra...);
1039 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1040 return m_map.m_impl_handle[i0 + m_map.m_impl_offset.m_dim.N0 * i1];
1043 template <typename I0, typename I1, typename... Is>
1044 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1045 (Kokkos::Impl::always_true<I0, I1, Is...>::value && (2 == rank) &&
1046 is_default_map && is_layout_left && (rank_dynamic != 0)),
1048 access(I0 i0, I1 i1, Is... extra)
const {
1049 check_access_member_function_valid_args(i0, i1, extra...);
1050 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1051 return m_map.m_impl_handle[i0 + m_map.m_impl_offset.m_stride * i1];
1054 template <typename I0, typename I1, typename... Is>
1055 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1056 (Kokkos::Impl::always_true<I0, I1, Is...>::value && (2 == rank) &&
1057 is_default_map && is_layout_right && (rank_dynamic == 0)),
1059 access(I0 i0, I1 i1, Is... extra)
const {
1060 check_access_member_function_valid_args(i0, i1, extra...);
1061 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1062 return m_map.m_impl_handle[i1 + m_map.m_impl_offset.m_dim.N1 * i0];
1065 template <typename I0, typename I1, typename... Is>
1066 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1067 (Kokkos::Impl::always_true<I0, I1, Is...>::value && (2 == rank) &&
1068 is_default_map && is_layout_right && (rank_dynamic != 0)),
1070 access(I0 i0, I1 i1, Is... extra)
const {
1071 check_access_member_function_valid_args(i0, i1, extra...);
1072 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1073 return m_map.m_impl_handle[i1 + m_map.m_impl_offset.m_stride * i0];
1076 template <typename I0, typename I1, typename... Is>
1077 KOKKOS_FORCEINLINE_FUNCTION
1078 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, Is...>::value &&
1079 (2 == rank) && is_default_map && is_layout_stride),
1081 access(I0 i0, I1 i1, Is... extra)
const {
1082 check_access_member_function_valid_args(i0, i1, extra...);
1083 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, extra...)
1084 return m_map.m_impl_handle[i0 * m_map.m_impl_offset.m_stride.S0 +
1085 i1 * m_map.m_impl_offset.m_stride.S1];
1091 template <typename I0, typename I1, typename I2, typename... Is>
1092 KOKKOS_FORCEINLINE_FUNCTION
1093 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, I2, Is...>::value &&
1094 (3 == rank) && is_default_map),
1096 access(I0 i0, I1 i1, I2 i2, Is... extra)
const {
1097 check_access_member_function_valid_args(i0, i1, i2, extra...);
1098 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, extra...)
1099 return m_map.m_impl_handle[m_map.m_impl_offset(i0, i1, i2)];
1102 template <typename I0, typename I1, typename I2, typename... Is>
1103 KOKKOS_FORCEINLINE_FUNCTION
1104 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, I2, Is...>::value &&
1105 (3 == rank) && !is_default_map),
1107 access(I0 i0, I1 i1, I2 i2, Is... extra)
const {
1108 check_access_member_function_valid_args(i0, i1, i2, extra...);
1109 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, extra...)
1110 return m_map.reference(i0, i1, i2);
1116 template <typename I0, typename I1, typename I2, typename I3, typename... Is>
1117 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1118 (Kokkos::Impl::always_true<I0, I1, I2, I3, Is...>::value && (4 == rank) &&
1121 access(I0 i0, I1 i1, I2 i2, I3 i3, Is... extra)
const {
1122 check_access_member_function_valid_args(i0, i1, i2, i3, extra...);
1123 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, extra...)
1124 return m_map.m_impl_handle[m_map.m_impl_offset(i0, i1, i2, i3)];
1127 template <typename I0, typename I1, typename I2, typename I3, typename... Is>
1128 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1129 (Kokkos::Impl::always_true<I0, I1, I2, I3, Is...>::value && (4 == rank) &&
1132 access(I0 i0, I1 i1, I2 i2, I3 i3, Is... extra)
const {
1133 check_access_member_function_valid_args(i0, i1, i2, i3, extra...);
1134 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, extra...)
1135 return m_map.reference(i0, i1, i2, i3);
1141 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1143 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1144 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, Is...>::value &&
1145 (5 == rank) && is_default_map),
1147 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, Is... extra)
const {
1148 check_access_member_function_valid_args(i0, i1, i2, i3, i4, extra...);
1149 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4,
1151 return m_map.m_impl_handle[m_map.m_impl_offset(i0, i1, i2, i3, i4)];
1154 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1156 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1157 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, Is...>::value &&
1158 (5 == rank) && !is_default_map),
1160 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, Is... extra)
const {
1161 check_access_member_function_valid_args(i0, i1, i2, i3, i4, extra...);
1162 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4,
1164 return m_map.reference(i0, i1, i2, i3, i4);
1170 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1171 typename I5, typename... Is>
1172 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1173 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, Is...>::value &&
1174 (6 == rank) && is_default_map),
1176 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, Is... extra)
const {
1177 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, extra...);
1178 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5,
1180 return m_map.m_impl_handle[m_map.m_impl_offset(i0, i1, i2, i3, i4, i5)];
1183 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1184 typename I5, typename... Is>
1185 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1186 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, Is...>::value &&
1187 (6 == rank) && !is_default_map),
1189 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, Is... extra)
const {
1190 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, extra...);
1191 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5,
1193 return m_map.reference(i0, i1, i2, i3, i4, i5);
1199 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1200 typename I5, typename I6, typename... Is>
1201 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1202 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, I6, Is...>::value &&
1203 (7 == rank) && is_default_map),
1205 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, I6 i6, Is... extra)
const {
1206 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, i6,
1208 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5, i6,
1210 return m_map.m_impl_handle[m_map.m_impl_offset(i0, i1, i2, i3, i4, i5, i6)];
1213 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1214 typename I5, typename I6, typename... Is>
1215 KOKKOS_FORCEINLINE_FUNCTION std::enable_if_t<
1216 (Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, I6, Is...>::value &&
1217 (7 == rank) && !is_default_map),
1219 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, I6 i6, Is... extra)
const {
1220 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, i6,
1222 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5, i6,
1224 return m_map.reference(i0, i1, i2, i3, i4, i5, i6);
1230 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1231 typename I5, typename I6, typename I7, typename... Is>
1232 KOKKOS_FORCEINLINE_FUNCTION
1233 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, I6,
1234 I7, Is...>::value &&
1235 (8 == rank) && is_default_map),
1237 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, I6 i6, I7 i7,
1238 Is... extra)
const {
1239 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, i6, i7,
1241 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5, i6,
1244 .m_impl_handle[m_map.m_impl_offset(i0, i1, i2, i3, i4, i5, i6, i7)];
1247 template <typename I0, typename I1, typename I2, typename I3, typename I4,
1248 typename I5, typename I6, typename I7, typename... Is>
1249 KOKKOS_FORCEINLINE_FUNCTION
1250 std::enable_if_t<(Kokkos::Impl::always_true<I0, I1, I2, I3, I4, I5, I6,
1251 I7, Is...>::value &&
1252 (8 == rank) && !is_default_map),
1254 access(I0 i0, I1 i1, I2 i2, I3 i3, I4 i4, I5 i5, I6 i6, I7 i7,
1255 Is... extra)
const {
1256 check_access_member_function_valid_args(i0, i1, i2, i3, i4, i5, i6, i7,
1258 KOKKOS_IMPL_VIEW_OPERATOR_VERIFY(m_track, m_map, i0, i1, i2, i3, i4, i5, i6,
1260 return m_map.reference(i0, i1, i2, i3, i4, i5, i6, i7);
1263#undef KOKKOS_IMPL_VIEW_OPERATOR_VERIFY
1268 KOKKOS_DEFAULTED_FUNCTION
1271 KOKKOS_DEFAULTED_FUNCTION
1275 View(
const View& other) : m_track(other.m_track), m_map(other.m_map) {
1276 KOKKOS_IF_ON_HOST((hooks_policy::copy_construct(*
this, other);))
1281 : m_track{std::move(other.m_track)}, m_map{std::move(other.m_map)} {
1282 KOKKOS_IF_ON_HOST((hooks_policy::move_construct(*
this, other);))
1286 View& operator=(
const View& other) {
1287 m_map = other.m_map;
1288 m_track = other.m_track;
1290 KOKKOS_IF_ON_HOST((hooks_policy::copy_assign(*
this, other);))
1296 View& operator=(View&& other) {
1297 m_map = std::move(other.m_map);
1298 m_track = std::move(other.m_track);
1300 KOKKOS_IF_ON_HOST((hooks_policy::move_assign(*
this, other);))
1309 template <
class RT,
class... RP>
1310 KOKKOS_INLINE_FUNCTION View(
1311 const View<RT, RP...>& rhs,
1312 std::enable_if_t<Kokkos::Impl::ViewMapping<
1313 traits,
typename View<RT, RP...>::traits,
1314 typename traits::specialize>::is_assignable_data_type>* =
nullptr)
1315 : m_track(rhs), m_map() {
1316 using SrcTraits =
typename View<RT, RP...>::traits;
1317 using Mapping = Kokkos::Impl::ViewMapping<traits, SrcTraits,
1318 typename traits::specialize>;
1319 static_assert(Mapping::is_assignable,
1320 "Incompatible View copy construction");
1321 Mapping::assign(m_map, rhs.m_map, rhs.m_track.m_tracker);
1324 template <
class RT,
class... RP>
1325 KOKKOS_INLINE_FUNCTION std::enable_if_t<
1326 Kokkos::Impl::ViewMapping<
1327 traits,
typename View<RT, RP...>::traits,
1328 typename traits::specialize>::is_assignable_data_type,
1330 operator=(
const View<RT, RP...>& rhs) {
1331 using SrcTraits =
typename View<RT, RP...>::traits;
1332 using Mapping = Kokkos::Impl::ViewMapping<traits, SrcTraits,
1333 typename traits::specialize>;
1334 static_assert(Mapping::is_assignable,
"Incompatible View copy assignment");
1335 Mapping::assign(m_map, rhs.m_map, rhs.m_track.m_tracker);
1336 m_track.assign(rhs);
1344 template <
class RT,
class... RP,
class Arg0,
class... Args>
1345 KOKKOS_INLINE_FUNCTION View(
const View<RT, RP...>& src_view,
const Arg0 arg0,
1347 : m_track(src_view), m_map() {
1348 using SrcType = View<RT, RP...>;
1350 using Mapping = Kokkos::Impl::ViewMapping<void,
typename SrcType::traits,
1353 using DstType =
typename Mapping::type;
1356 Kokkos::Impl::ViewMapping<traits,
typename DstType::traits,
1357 typename traits::specialize>::is_assignable,
1358 "Subview construction requires compatible view and subview arguments");
1360 Mapping::assign(m_map, src_view.m_map, arg0, args...);
1366 KOKKOS_INLINE_FUNCTION
1367 int use_count()
const {
return m_track.m_tracker.use_count(); }
1369 inline const std::string label()
const {
1370 return m_track.m_tracker
1371 .template get_label<typename traits::memory_space>();
1378 template <
class... P>
1379 explicit inline View(
1380 const Impl::ViewCtorProp<P...>& arg_prop,
1381 std::enable_if_t<!Impl::ViewCtorProp<P...>::has_pointer,
1382 typename traits::array_layout>
const& arg_layout)
1383 : m_track(), m_map() {
1386 auto prop_copy_tmp =
1387 Impl::with_properties_if_unset(arg_prop, std::string{});
1388 auto prop_copy = Impl::with_properties_if_unset(
1389 prop_copy_tmp,
typename traits::device_type::memory_space{},
1390 typename traits::device_type::execution_space{});
1391 using alloc_prop =
decltype(prop_copy);
1393 static_assert(traits::is_managed,
1394 "View allocation constructor requires managed memory");
1396 if (alloc_prop::initialize &&
1397 !alloc_prop::execution_space::impl_is_initialized()) {
1400 Kokkos::Impl::throw_runtime_exception(
1401 "Constructing View and initializing data with uninitialized "
1405 size_t i0 = arg_layout.dimension[0];
1406 size_t i1 = arg_layout.dimension[1];
1407 size_t i2 = arg_layout.dimension[2];
1408 size_t i3 = arg_layout.dimension[3];
1409 size_t i4 = arg_layout.dimension[4];
1410 size_t i5 = arg_layout.dimension[5];
1411 size_t i6 = arg_layout.dimension[6];
1412 size_t i7 = arg_layout.dimension[7];
1414 const std::string& alloc_name =
1415 Impl::get_property<Impl::LabelTag>(prop_copy);
1416 Impl::runtime_check_rank(
1418 std::is_same<typename traits::specialize, void>::value, i0, i1, i2, i3,
1419 i4, i5, i6, i7, alloc_name);
1421 Kokkos::Impl::SharedAllocationRecord<>* record = m_map.allocate_shared(
1422 prop_copy, arg_layout, Impl::ViewCtorProp<P...>::has_execution_space);
1425 m_track.m_tracker.assign_allocated_record_to_uninitialized(record);
1428 KOKKOS_INLINE_FUNCTION
1429 void assign_data(pointer_type arg_data) {
1430 m_track.m_tracker.clear();
1431 m_map.assign_data(arg_data);
1435 template <
class... P>
1436 explicit KOKKOS_INLINE_FUNCTION View(
1437 const Impl::ViewCtorProp<P...>& arg_prop,
1438 std::enable_if_t<Impl::ViewCtorProp<P...>::has_pointer,
1439 typename traits::array_layout>
const& arg_layout)
1442 m_map(arg_prop, arg_layout) {
1444 std::is_same<pointer_type,
1445 typename Impl::ViewCtorProp<P...>::pointer_type>::value,
1446 "Constructing View to wrap user memory must supply matching pointer "
1451 template <
class... P>
1452 explicit inline View(
1453 const Impl::ViewCtorProp<P...>& arg_prop,
1454 std::enable_if_t<!Impl::ViewCtorProp<P...>::has_pointer,
size_t>
const
1455 arg_N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1456 const size_t arg_N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1457 const size_t arg_N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1458 const size_t arg_N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1459 const size_t arg_N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1460 const size_t arg_N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1461 const size_t arg_N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1462 const size_t arg_N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
1464 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
1465 arg_N4, arg_N5, arg_N6, arg_N7)) {
1466 static_assert(traits::array_layout::is_extent_constructible,
1467 "Layout is not constructible from extent arguments. Use "
1468 "overload taking a layout object instead.");
1471 template <
class... P>
1472 explicit KOKKOS_INLINE_FUNCTION View(
1473 const Impl::ViewCtorProp<P...>& arg_prop,
1474 std::enable_if_t<Impl::ViewCtorProp<P...>::has_pointer,
size_t>
const
1475 arg_N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1476 const size_t arg_N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1477 const size_t arg_N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1478 const size_t arg_N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1479 const size_t arg_N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1480 const size_t arg_N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1481 const size_t arg_N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1482 const size_t arg_N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
1484 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
1485 arg_N4, arg_N5, arg_N6, arg_N7)) {
1486 static_assert(traits::array_layout::is_extent_constructible,
1487 "Layout is not constructible from extent arguments. Use "
1488 "overload taking a layout object instead.");
1492 template <
typename Label>
1493 explicit inline View(
1494 const Label& arg_label,
1495 std::enable_if_t<Kokkos::Impl::is_view_label<Label>::value,
1496 typename traits::array_layout>
const& arg_layout)
1497 : View(Impl::ViewCtorProp<std::string>(arg_label), arg_layout) {}
1500 template <
typename Label>
1501 explicit inline View(
1502 const Label& arg_label,
1503 std::enable_if_t<Kokkos::Impl::is_view_label<Label>::value,
const size_t>
1504 arg_N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1505 const size_t arg_N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1506 const size_t arg_N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1507 const size_t arg_N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1508 const size_t arg_N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1509 const size_t arg_N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1510 const size_t arg_N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1511 const size_t arg_N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
1512 : View(Impl::ViewCtorProp<std::string>(arg_label),
1513 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
1514 arg_N4, arg_N5, arg_N6, arg_N7)) {
1515 static_assert(traits::array_layout::is_extent_constructible,
1516 "Layout is not constructible from extent arguments. Use "
1517 "overload taking a layout object instead.");
1523 template <
class Traits>
1524 KOKKOS_INLINE_FUNCTION View(
1525 const view_tracker_type& track,
1526 const Kokkos::Impl::ViewMapping<Traits, typename Traits::specialize>& map)
1527 : m_track(track), m_map() {
1529 Kokkos::Impl::ViewMapping<traits, Traits, typename traits::specialize>;
1530 static_assert(Mapping::is_assignable,
1531 "Incompatible View copy construction");
1532 Mapping::assign(m_map, map, track.m_tracker);
1538 template <
class Traits>
1539 KOKKOS_INLINE_FUNCTION View(
1540 const typename view_tracker_type::track_type& track,
1541 const Kokkos::Impl::ViewMapping<Traits, typename Traits::specialize>& map)
1542 : m_track(track), m_map() {
1544 Kokkos::Impl::ViewMapping<traits, Traits, typename traits::specialize>;
1545 static_assert(Mapping::is_assignable,
1546 "Incompatible View copy construction");
1547 Mapping::assign(m_map, map, track);
1552 static constexpr size_t required_allocation_size(
1553 typename traits::array_layout
const& layout) {
1554 return map_type::memory_span(layout);
1557 static constexpr size_t required_allocation_size(
1558 const size_t arg_N0 = 0,
const size_t arg_N1 = 0,
const size_t arg_N2 = 0,
1559 const size_t arg_N3 = 0,
const size_t arg_N4 = 0,
const size_t arg_N5 = 0,
1560 const size_t arg_N6 = 0,
const size_t arg_N7 = 0) {
1561 static_assert(traits::array_layout::is_extent_constructible,
1562 "Layout is not constructible from extent arguments. Use "
1563 "overload taking a layout object instead.");
1564 return map_type::memory_span(
typename traits::array_layout(
1565 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7));
1568 explicit KOKKOS_INLINE_FUNCTION View(
1569 pointer_type arg_ptr,
const size_t arg_N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1570 const size_t arg_N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1571 const size_t arg_N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1572 const size_t arg_N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1573 const size_t arg_N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1574 const size_t arg_N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1575 const size_t arg_N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1576 const size_t arg_N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
1577 : View(Impl::ViewCtorProp<pointer_type>(arg_ptr),
1578 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
1579 arg_N4, arg_N5, arg_N6, arg_N7)) {
1580 static_assert(traits::array_layout::is_extent_constructible,
1581 "Layout is not constructible from extent arguments. Use "
1582 "overload taking a layout object instead.");
1585 explicit KOKKOS_INLINE_FUNCTION View(
1586 pointer_type arg_ptr,
const typename traits::array_layout& arg_layout)
1587 : View(Impl::ViewCtorProp<pointer_type>(arg_ptr), arg_layout) {}
1592 static KOKKOS_INLINE_FUNCTION
size_t
1593 shmem_size(
const size_t arg_N0 = KOKKOS_INVALID_INDEX,
1594 const size_t arg_N1 = KOKKOS_INVALID_INDEX,
1595 const size_t arg_N2 = KOKKOS_INVALID_INDEX,
1596 const size_t arg_N3 = KOKKOS_INVALID_INDEX,
1597 const size_t arg_N4 = KOKKOS_INVALID_INDEX,
1598 const size_t arg_N5 = KOKKOS_INVALID_INDEX,
1599 const size_t arg_N6 = KOKKOS_INVALID_INDEX,
1600 const size_t arg_N7 = KOKKOS_INVALID_INDEX) {
1601 static_assert(traits::array_layout::is_extent_constructible,
1602 "Layout is not constructible from extent arguments. Use "
1603 "overload taking a layout object instead.");
1604 const size_t num_passed_args = Impl::count_valid_integers(
1605 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7);
1607 if (std::is_void<typename traits::specialize>::value &&
1608 num_passed_args != rank_dynamic) {
1610 "Kokkos::View::shmem_size() rank_dynamic != number of arguments.\n");
1613 return View::shmem_size(
typename traits::array_layout(
1614 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6, arg_N7));
1620 static constexpr size_t scratch_value_alignment =
1621 max({
sizeof(
typename traits::value_type),
1622 alignof(
typename traits::value_type),
1623 static_cast<size_t>(
1624 traits::execution_space::scratch_memory_space::ALIGN)});
1627 static KOKKOS_INLINE_FUNCTION
size_t
1628 shmem_size(
typename traits::array_layout
const& arg_layout) {
1629 return map_type::memory_span(arg_layout) + scratch_value_alignment;
1632 explicit KOKKOS_INLINE_FUNCTION View(
1633 const typename traits::execution_space::scratch_memory_space& arg_space,
1634 const typename traits::array_layout& arg_layout)
1635 : View(Impl::ViewCtorProp<pointer_type>(reinterpret_cast<pointer_type>(
1636 arg_space.get_shmem_aligned(map_type::memory_span(arg_layout),
1637 scratch_value_alignment))),
1640 explicit KOKKOS_INLINE_FUNCTION View(
1641 const typename traits::execution_space::scratch_memory_space& arg_space,
1642 const size_t arg_N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1643 const size_t arg_N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1644 const size_t arg_N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1645 const size_t arg_N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1646 const size_t arg_N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1647 const size_t arg_N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1648 const size_t arg_N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
1649 const size_t arg_N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
1650 : View(Impl::ViewCtorProp<pointer_type>(
1651 reinterpret_cast<pointer_type>(arg_space.get_shmem_aligned(
1652 map_type::memory_span(typename traits::array_layout(
1653 arg_N0, arg_N1, arg_N2, arg_N3, arg_N4, arg_N5, arg_N6,
1655 scratch_value_alignment))),
1656 typename traits::array_layout(arg_N0, arg_N1, arg_N2, arg_N3,
1657 arg_N4, arg_N5, arg_N6, arg_N7)) {
1658 static_assert(traits::array_layout::is_extent_constructible,
1659 "Layout is not constructible from extent arguments. Use "
1660 "overload taking a layout object instead.");