44 #ifndef KOKKOS_VIEW_HPP 45 #define KOKKOS_VIEW_HPP 47 #include <type_traits> 49 #include <Kokkos_Core_fwd.hpp> 50 #include <Kokkos_HostSpace.hpp> 51 #include <Kokkos_MemoryTraits.hpp> 53 #if ! defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 55 #include <impl/Kokkos_StaticAssert.hpp> 56 #include <impl/Kokkos_Traits.hpp> 57 #include <impl/Kokkos_Shape.hpp> 58 #include <impl/Kokkos_AnalyzeShape.hpp> 59 #include <impl/Kokkos_Tags.hpp> 62 namespace Kokkos {
struct ALL ; }
64 #include <impl/Kokkos_ViewOffset.hpp> 65 #include <impl/Kokkos_ViewSupport.hpp> 74 template<
class ValueType ,
75 class ArraySpecialize ,
84 template<
class SrcViewType
96 template<
class DstViewSpecialize ,
97 class SrcViewSpecialize = void ,
99 struct ViewAssignment ;
101 template<
class DstMemorySpace ,
class SrcMemorySpace ,
class ExecutionSpace>
130 template<
class DataType ,
142 enum { Arg1IsLayout = Impl::is_array_layout<Arg1>::value };
144 enum { Arg1IsSpace = Impl::is_space<Arg1>::value };
145 enum { Arg2IsSpace = Impl::is_space<Arg2>::value };
147 enum { Arg1IsMemoryTraits = Impl::is_memory_traits<Arg1>::value };
148 enum { Arg2IsMemoryTraits = Impl::is_memory_traits<Arg2>::value };
149 enum { Arg3IsMemoryTraits = Impl::is_memory_traits<Arg3>::value };
151 enum { Arg1IsVoid = Impl::is_same< Arg1 , void >::value };
152 enum { Arg2IsVoid = Impl::is_same< Arg2 , void >::value };
153 enum { Arg3IsVoid = Impl::is_same< Arg3 , void >::value };
158 ( 1 == Arg1IsLayout + Arg1IsSpace + Arg1IsMemoryTraits + Arg1IsVoid )
159 , Arg1 >::type Arg1Verified ;
167 ( Arg1IsLayout && ( 1 == Arg2IsSpace + Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
168 ( Arg1IsSpace && ( 0 == Arg2IsSpace ) && ( 1 == Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
169 ( Arg1IsMemoryTraits && Arg2IsVoid ) ||
170 ( Arg1IsVoid && Arg2IsVoid )
171 , Arg2 >::type Arg2Verified ;
176 ( 1 == Arg3IsMemoryTraits + Arg3IsVoid ) &&
177 ( Arg1IsMemoryTraits + Arg2IsMemoryTraits + Arg3IsMemoryTraits <= 1 )
178 , Arg3 >::type Arg3Verified ;
181 typedef typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
182 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
183 Kokkos::DefaultExecutionSpace
184 >::type >::type::execution_space ExecutionSpace ;
186 typedef typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
187 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
188 Kokkos::DefaultExecutionSpace
189 >::type >::type::memory_space MemorySpace ;
191 typedef typename Impl::is_space<
192 typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
193 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
194 Kokkos::DefaultExecutionSpace
195 >::type >::type >::host_mirror_space HostMirrorSpace ;
198 typedef typename Impl::if_c< Arg1IsLayout , Arg1Verified ,
199 typename ExecutionSpace::array_layout
200 >::type ArrayLayout ;
203 typedef typename Impl::if_c< Arg1IsMemoryTraits , Arg1Verified ,
204 typename Impl::if_c< Arg2IsMemoryTraits , Arg2Verified ,
205 typename Impl::if_c< Arg3IsMemoryTraits , Arg3Verified ,
207 >::type >::type >::type MemoryTraits ;
209 typedef Impl::AnalyzeShape<DataType> analysis ;
216 typedef DataType data_type ;
217 typedef typename analysis::const_type const_data_type ;
218 typedef typename analysis::non_const_type non_const_data_type ;
223 typedef typename analysis::array_intrinsic_type array_intrinsic_type ;
224 typedef typename analysis::const_array_intrinsic_type const_array_intrinsic_type ;
225 typedef typename analysis::non_const_array_intrinsic_type non_const_array_intrinsic_type ;
230 typedef typename analysis::value_type value_type ;
231 typedef typename analysis::const_value_type const_value_type ;
232 typedef typename analysis::non_const_value_type non_const_value_type ;
237 typedef ArrayLayout array_layout ;
238 typedef typename analysis::shape shape_type ;
240 enum { rank = shape_type::rank };
241 enum { rank_dynamic = shape_type::rank_dynamic };
246 typedef ExecutionSpace execution_space ;
247 typedef MemorySpace memory_space ;
249 typedef MemoryTraits memory_traits ;
250 typedef HostMirrorSpace host_mirror_space ;
252 typedef typename memory_space::size_type size_type ;
254 enum { is_hostspace = Impl::is_same< memory_space , HostSpace >::value };
255 enum { is_managed = memory_traits::Unmanaged == 0 };
256 enum { is_random_access = memory_traits::RandomAccess == 1 };
266 ,
typename analysis::specialize
281 class ViewDefault {};
285 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
287 {
typedef ViewDefault type ; };
289 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
290 struct ViewSpecialize< ValueType , void , LayoutRight , MemorySpace , MemoryTraits >
291 {
typedef ViewDefault type ; };
293 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
294 struct ViewSpecialize< ValueType , void , LayoutStride , MemorySpace , MemoryTraits >
295 {
typedef ViewDefault type ; };
307 namespace ViewError {
309 struct allocation_constructor_requires_managed {};
310 struct allocation_constructor_requires_nonconst {};
311 struct user_pointer_constructor_requires_unmanaged {};
312 struct device_shmem_constructor_requires_unmanaged {};
314 struct scalar_operator_called_from_non_scalar_view {};
324 template<
class ReturnType ,
class Traits ,
class Layout ,
unsigned Rank ,
325 typename iType0 = int ,
typename iType1 = int ,
326 typename iType2 = int ,
typename iType3 = int ,
327 typename iType4 = int ,
typename iType5 = int ,
328 typename iType6 = int ,
typename iType7 = int ,
329 class Enable =
void >
332 template<
class ReturnType ,
class Traits ,
class Layout ,
unsigned Rank ,
333 typename iType0 ,
typename iType1 ,
334 typename iType2 ,
typename iType3 ,
335 typename iType4 ,
typename iType5 ,
336 typename iType6 ,
typename iType7 >
339 iType0 , iType1 , iType2 , iType3 ,
340 iType4 , iType5 , iType6 , iType7 ,
342 iType0(0) == 0 && iType1(0) == 0 && iType2(0) == 0 && iType3(0) == 0 &&
343 iType4(0) == 0 && iType5(0) == 0 && iType6(0) == 0 && iType7(0) == 0 &&
344 is_same< typename Traits::array_layout , Layout >::value &&
345 ( unsigned(Traits::rank) == Rank )
439 template<
class DataType ,
440 class Arg1Type = void ,
441 class Arg2Type = void ,
442 class Arg3Type = void ,
450 struct is_view :
public bool_< false > {};
452 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S >
453 struct is_view<
View< D , A1 , A2 , A3 , S > > :
public bool_< true > {};
459 template<
class DataType ,
463 class View< DataType , Arg1Type , Arg2Type , Arg3Type , Impl::ViewDefault >
464 :
public ViewTraits< DataType , Arg1Type , Arg2Type, Arg3Type >
473 template<
class ,
class ,
class ,
class ,
class >
friend class View ;
476 template<
class ,
class ,
class >
friend struct Impl::ViewAssignment ;
481 typedef Impl::ViewOffset<
typename traits::shape_type
482 ,
typename traits::array_layout
486 typedef Impl::ViewDataManagement< traits > view_data_management ;
491 typename view_data_management::handle_type m_ptr_on_device ;
492 offset_map_type m_offset_map ;
493 view_data_management m_management ;
494 Impl::AllocationTracker m_tracker ;
501 typedef typename view_data_management::return_type reference_type ;
503 enum { reference_type_is_lvalue = view_data_management::ReturnTypeIsReference };
505 typedef View<
typename traits::array_intrinsic_type ,
506 typename traits::array_layout ,
507 typename traits::device_type ,
508 typename traits::memory_traits > array_type ;
510 typedef View<
typename traits::const_data_type ,
511 typename traits::array_layout ,
512 typename traits::device_type ,
513 typename traits::memory_traits > const_type ;
515 typedef View<
typename traits::non_const_data_type ,
516 typename traits::array_layout ,
517 typename traits::device_type ,
518 typename traits::memory_traits > non_const_type ;
520 typedef View<
typename traits::non_const_data_type ,
521 typename traits::array_layout ,
522 typename traits::host_mirror_space ,
528 enum { Rank = traits::rank };
530 KOKKOS_INLINE_FUNCTION offset_map_type shape()
const {
return m_offset_map ; }
531 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_0()
const {
return m_offset_map.N0 ; }
532 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_1()
const {
return m_offset_map.N1 ; }
533 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_2()
const {
return m_offset_map.N2 ; }
534 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_3()
const {
return m_offset_map.N3 ; }
535 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_4()
const {
return m_offset_map.N4 ; }
536 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_5()
const {
return m_offset_map.N5 ; }
537 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_6()
const {
return m_offset_map.N6 ; }
538 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_7()
const {
return m_offset_map.N7 ; }
539 KOKKOS_INLINE_FUNCTION
typename traits::size_type size()
const {
return m_offset_map.cardinality(); }
541 template<
typename iType >
542 KOKKOS_INLINE_FUNCTION
543 typename traits::size_type dimension(
const iType & i )
const 544 {
return Impl::dimension( m_offset_map , i ); }
549 KOKKOS_INLINE_FUNCTION
552 KOKKOS_INLINE_FUNCTION
558 { m_offset_map.assign(0, 0,0,0,0,0,0,0,0); }
560 KOKKOS_INLINE_FUNCTION
561 View(
const View & rhs )
567 (void) Impl::ViewAssignment<
568 typename traits::specialize ,
569 typename traits::specialize >( *
this , rhs );
572 KOKKOS_INLINE_FUNCTION
573 View & operator = (
const View & rhs )
575 (void) Impl::ViewAssignment<
576 typename traits::specialize ,
577 typename traits::specialize >( *
this , rhs );
584 template<
class RT ,
class RL ,
class RD ,
class RM ,
class RS >
585 KOKKOS_INLINE_FUNCTION
592 (void) Impl::ViewAssignment<
593 typename traits::specialize , RS >( *
this , rhs );
596 template<
class RT ,
class RL ,
class RD ,
class RM ,
class RS >
597 KOKKOS_INLINE_FUNCTION
600 (void) Impl::ViewAssignment<
601 typename traits::specialize , RS >( *
this , rhs );
618 template<
class AllocationProperties >
620 View(
const AllocationProperties & prop ,
623 const typename Impl::ViewAllocProp< traits , AllocationProperties >::size_type n0 = 0 ,
624 const size_t n1 = 0 ,
625 const size_t n2 = 0 ,
626 const size_t n3 = 0 ,
627 const size_t n4 = 0 ,
628 const size_t n5 = 0 ,
629 const size_t n6 = 0 ,
630 const size_t n7 = 0 ,
631 const size_t n8 = 0 )
637 typedef Impl::ViewAllocProp< traits , AllocationProperties > Alloc ;
639 static_assert(!std::is_same<typename traits::array_layout, LayoutStride>::value,
640 "LayoutStride does not support View constructor which takes dimensions directly!");
642 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
643 if(Alloc::AllowPadding)
644 m_offset_map.set_padding();
646 m_ptr_on_device = view_data_management::template allocate< Alloc::Initialize >( Alloc::label(prop) , m_offset_map, m_tracker );
650 template<
class AllocationProperties >
652 View(
const AllocationProperties & prop ,
653 const typename traits::array_layout & layout ,
656 const typename Impl::ViewAllocProp< traits , AllocationProperties >::size_type = 0 )
662 typedef Impl::ViewAllocProp< traits , AllocationProperties > Alloc ;
664 m_offset_map.assign( layout );
665 if(Alloc::AllowPadding)
666 m_offset_map.set_padding();
668 m_ptr_on_device = view_data_management::template allocate< Alloc::Initialize >( Alloc::label(prop) , m_offset_map, m_tracker );
670 m_management.set_noncontiguous();
677 template<
class Type >
678 explicit KOKKOS_INLINE_FUNCTION
680 typename Impl::ViewRawPointerProp< traits , Type >::size_type n0 = 0 ,
681 const size_t n1 = 0 ,
682 const size_t n2 = 0 ,
683 const size_t n3 = 0 ,
684 const size_t n4 = 0 ,
685 const size_t n5 = 0 ,
686 const size_t n6 = 0 ,
687 const size_t n7 = 0 ,
688 const size_t n8 = 0 )
689 : m_ptr_on_device(ptr)
694 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
695 m_management.set_unmanaged();
698 template<
class Type >
699 explicit KOKKOS_INLINE_FUNCTION
701 typename traits::array_layout
const & layout ,
702 typename Impl::ViewRawPointerProp< traits , Type >::size_type = 0 )
703 : m_ptr_on_device(ptr)
708 m_offset_map.assign( layout );
709 m_management.set_unmanaged();
710 m_management.set_noncontiguous();
721 View( Impl::AllocationTracker
const &arg_tracker ,
722 const size_t n0 = 0 ,
723 const size_t n1 = 0 ,
724 const size_t n2 = 0 ,
725 const size_t n3 = 0 ,
726 const size_t n4 = 0 ,
727 const size_t n5 = 0 ,
728 const size_t n6 = 0 ,
729 const size_t n7 = 0 ,
730 const size_t n8 = 0 )
731 : m_ptr_on_device(reinterpret_cast<typename traits::value_type*>(arg_tracker.alloc_ptr()))
734 , m_tracker(arg_tracker)
736 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
738 const size_t req_size = m_offset_map.capacity() *
sizeof(
typename traits::value_type);
739 if ( m_tracker.alloc_size() < req_size ) {
740 Impl::throw_runtime_exception(
"Error: tracker.alloc_size() < req_size");
745 View( Impl::AllocationTracker
const & arg_tracker
746 ,
typename traits::array_layout
const & layout )
747 : m_ptr_on_device(reinterpret_cast<typename traits::value_type*>(arg_tracker.alloc_ptr()))
750 , m_tracker(arg_tracker)
752 m_offset_map.assign( layout );
754 const size_t req_size = m_offset_map.capacity() *
sizeof(
typename traits::value_type);
755 if ( m_tracker.alloc_size() < req_size ) {
756 Impl::throw_runtime_exception(
"Error: tracker.alloc_size() < req_size");
759 m_management.set_noncontiguous();
772 template<
class D ,
class A1 ,
class A2 ,
class A3
773 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
774 ,
class SubArg4_type ,
class SubArg5_type ,
class SubArg6_type ,
class SubArg7_type
776 KOKKOS_INLINE_FUNCTION
778 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
779 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
780 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
781 ,
const SubArg6_type & arg6 ,
const SubArg7_type & arg7
784 template<
class D ,
class A1 ,
class A2 ,
class A3
785 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
786 ,
class SubArg4_type ,
class SubArg5_type ,
class SubArg6_type
788 KOKKOS_INLINE_FUNCTION
790 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
791 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
792 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
793 ,
const SubArg6_type & arg6
796 template<
class D ,
class A1 ,
class A2 ,
class A3
797 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
798 ,
class SubArg4_type ,
class SubArg5_type
800 KOKKOS_INLINE_FUNCTION
802 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
803 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
804 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
807 template<
class D ,
class A1 ,
class A2 ,
class A3
808 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
811 KOKKOS_INLINE_FUNCTION
813 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
814 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
815 ,
const SubArg4_type & arg4
818 template<
class D ,
class A1 ,
class A2 ,
class A3
819 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
821 KOKKOS_INLINE_FUNCTION
823 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
824 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
827 template<
class D ,
class A1 ,
class A2 ,
class A3
828 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type
830 KOKKOS_INLINE_FUNCTION
832 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
833 ,
const SubArg2_type & arg2
836 template<
class D ,
class A1 ,
class A2 ,
class A3
837 ,
class SubArg0_type ,
class SubArg1_type
839 KOKKOS_INLINE_FUNCTION
841 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
844 template<
class D ,
class A1 ,
class A2 ,
class A3
847 KOKKOS_INLINE_FUNCTION
849 ,
const SubArg0_type & arg0
855 typedef Impl::if_c< ! traits::is_managed ,
856 const typename traits::execution_space::scratch_memory_space & ,
857 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
858 if_scratch_memory_constructor ;
860 explicit KOKKOS_INLINE_FUNCTION
861 View(
typename if_scratch_memory_constructor::type space ,
862 const unsigned n0 = 0 ,
863 const unsigned n1 = 0 ,
864 const unsigned n2 = 0 ,
865 const unsigned n3 = 0 ,
866 const unsigned n4 = 0 ,
867 const unsigned n5 = 0 ,
868 const unsigned n6 = 0 ,
869 const unsigned n7 = 0 )
875 typedef typename traits::value_type value_type_ ;
878 enum { mask = align - 1 };
880 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7 );
882 typedef Impl::if_c< ! traits::is_managed ,
884 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
885 if_device_shmem_pointer ;
888 m_ptr_on_device = if_device_shmem_pointer::select(
889 (value_type_*) space.get_shmem(
unsigned(
sizeof(value_type_) * m_offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ) );
892 explicit KOKKOS_INLINE_FUNCTION
893 View(
typename if_scratch_memory_constructor::type space ,
894 typename traits::array_layout
const & layout)
900 typedef typename traits::value_type value_type_ ;
902 typedef Impl::if_c< ! traits::is_managed ,
904 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
905 if_device_shmem_pointer ;
907 m_offset_map.assign( layout );
908 m_management.set_unmanaged();
909 m_management.set_noncontiguous();
912 enum { mask = align - 1 };
915 m_ptr_on_device = if_device_shmem_pointer::select(
916 (value_type_*) space.get_shmem(
unsigned(
sizeof(value_type_) * m_offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ) );
920 unsigned shmem_size(
const unsigned n0 = 0 ,
921 const unsigned n1 = 0 ,
922 const unsigned n2 = 0 ,
923 const unsigned n3 = 0 ,
924 const unsigned n4 = 0 ,
925 const unsigned n5 = 0 ,
926 const unsigned n6 = 0 ,
927 const unsigned n7 = 0 )
930 enum { mask = align - 1 };
932 typedef typename traits::value_type value_type_ ;
934 offset_map_type offset_map ;
936 offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7 );
938 return unsigned(
sizeof(value_type_) * offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ;
944 KOKKOS_FORCEINLINE_FUNCTION
945 bool is_null()
const {
return 0 == ptr_on_device() ; }
950 typedef Impl::if_c< traits::rank == 0 ,
951 typename traits::value_type ,
952 Impl::ViewError::scalar_operator_called_from_non_scalar_view >
955 typedef Impl::if_c< traits::rank == 0 ,
957 Impl::ViewError::scalar_operator_called_from_non_scalar_view >
958 if_scalar_operator_return ;
959 KOKKOS_INLINE_FUNCTION
960 const View & operator = (
const typename if_scalar_operator::type & rhs )
const 962 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
963 m_ptr_on_device[ 0 ] = if_scalar_operator::select( rhs );
967 KOKKOS_FORCEINLINE_FUNCTION
968 operator typename if_scalar_operator_return::type ()
const 970 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
971 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
974 KOKKOS_FORCEINLINE_FUNCTION
975 typename if_scalar_operator_return::type operator()()
const 977 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
978 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
981 KOKKOS_FORCEINLINE_FUNCTION
982 typename if_scalar_operator_return::type
operator*()
const 984 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
985 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
997 template<
typename iType0 >
998 KOKKOS_FORCEINLINE_FUNCTION
1000 operator[] (
const iType0 & i0 )
const 1002 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1003 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1005 return m_ptr_on_device[ i0 ];
1008 template<
typename iType0 >
1009 KOKKOS_FORCEINLINE_FUNCTION
1011 operator() (
const iType0 & i0 )
const 1013 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1014 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1016 return m_ptr_on_device[ i0 ];
1019 template<
typename iType0 >
1020 KOKKOS_FORCEINLINE_FUNCTION
1022 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1023 const int ,
const int ,
const int ,
const int )
const 1025 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1026 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1028 return m_ptr_on_device[ i0 ];
1031 template<
typename iType0 >
1032 KOKKOS_FORCEINLINE_FUNCTION
1034 operator[] (
const iType0 & i0 )
const 1036 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1037 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1039 return m_ptr_on_device[ i0 ];
1042 template<
typename iType0 >
1043 KOKKOS_FORCEINLINE_FUNCTION
1045 operator() (
const iType0 & i0 )
const 1047 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1048 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1050 return m_ptr_on_device[ i0 ];
1053 template<
typename iType0 >
1054 KOKKOS_FORCEINLINE_FUNCTION
1056 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1057 const int ,
const int ,
const int ,
const int )
const 1059 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1060 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1062 return m_ptr_on_device[ i0 ];
1065 template<
typename iType0 >
1066 KOKKOS_FORCEINLINE_FUNCTION
1068 typename Impl::if_c<
1069 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1070 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1071 void,
typename traits::array_layout>::type,
1073 operator[] (
const iType0 & i0 )
const 1075 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1076 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1078 return m_ptr_on_device[ m_offset_map(i0) ];
1081 template<
typename iType0 >
1082 KOKKOS_FORCEINLINE_FUNCTION
1084 typename Impl::if_c<
1085 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1086 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1087 void,
typename traits::array_layout>::type,
1089 operator() (
const iType0 & i0 )
const 1091 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1092 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1094 return m_ptr_on_device[ m_offset_map(i0) ];
1097 template<
typename iType0 >
1098 KOKKOS_FORCEINLINE_FUNCTION
1100 typename Impl::if_c<
1101 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1102 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1103 void,
typename traits::array_layout>::type,
1105 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1106 const int ,
const int ,
const int ,
const int )
const 1108 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1109 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1111 return m_ptr_on_device[ m_offset_map(i0) ];
1116 template<
typename iType0 ,
typename iType1 >
1117 KOKKOS_FORCEINLINE_FUNCTION
1119 traits,
typename traits::array_layout, 2, iType0, iType1 >::type
1120 operator() (
const iType0 & i0 ,
const iType1 & i1 )
const 1122 KOKKOS_ASSERT_SHAPE_BOUNDS_2( m_offset_map, i0,i1 );
1123 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1125 return m_ptr_on_device[ m_offset_map(i0,i1) ];
1128 template<
typename iType0 ,
typename iType1 >
1129 KOKKOS_FORCEINLINE_FUNCTION
1131 traits,
typename traits::array_layout, 2, iType0, iType1 >::type
1132 at(
const iType0 & i0 ,
const iType1 & i1 ,
const int ,
const int ,
1133 const int ,
const int ,
const int ,
const int )
const 1135 KOKKOS_ASSERT_SHAPE_BOUNDS_2( m_offset_map, i0,i1 );
1136 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1138 return m_ptr_on_device[ m_offset_map(i0,i1) ];
1143 template<
typename iType0 ,
typename iType1 ,
typename iType2 >
1144 KOKKOS_FORCEINLINE_FUNCTION
1146 traits,
typename traits::array_layout, 3, iType0, iType1, iType2 >::type
1147 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 )
const 1149 KOKKOS_ASSERT_SHAPE_BOUNDS_3( m_offset_map, i0,i1,i2 );
1150 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1152 return m_ptr_on_device[ m_offset_map(i0,i1,i2) ];
1155 template<
typename iType0 ,
typename iType1 ,
typename iType2 >
1156 KOKKOS_FORCEINLINE_FUNCTION
1158 traits,
typename traits::array_layout, 3, iType0, iType1, iType2 >::type
1159 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const int ,
1160 const int ,
const int ,
const int ,
const int )
const 1162 KOKKOS_ASSERT_SHAPE_BOUNDS_3( m_offset_map, i0,i1,i2 );
1163 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1165 return m_ptr_on_device[ m_offset_map(i0,i1,i2) ];
1170 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 >
1171 KOKKOS_FORCEINLINE_FUNCTION
1173 traits,
typename traits::array_layout, 4, iType0, iType1, iType2, iType3 >::type
1174 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 )
const 1176 KOKKOS_ASSERT_SHAPE_BOUNDS_4( m_offset_map, i0,i1,i2,i3 );
1177 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1179 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3) ];
1182 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 >
1183 KOKKOS_FORCEINLINE_FUNCTION
1185 traits,
typename traits::array_layout, 4, iType0, iType1, iType2, iType3 >::type
1186 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1187 const int ,
const int ,
const int ,
const int )
const 1189 KOKKOS_ASSERT_SHAPE_BOUNDS_4( m_offset_map, i0,i1,i2,i3 );
1190 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1192 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3) ];
1197 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1199 KOKKOS_FORCEINLINE_FUNCTION
1201 traits,
typename traits::array_layout, 5, iType0, iType1, iType2, iType3 , iType4 >::type
1202 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1203 const iType4 & i4 )
const 1205 KOKKOS_ASSERT_SHAPE_BOUNDS_5( m_offset_map, i0,i1,i2,i3,i4 );
1206 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1208 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4) ];
1211 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1213 KOKKOS_FORCEINLINE_FUNCTION
1215 traits,
typename traits::array_layout, 5, iType0, iType1, iType2, iType3 , iType4 >::type
1216 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1217 const iType4 & i4 ,
const int ,
const int ,
const int )
const 1219 KOKKOS_ASSERT_SHAPE_BOUNDS_5( m_offset_map, i0,i1,i2,i3,i4 );
1220 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1222 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4) ];
1227 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1228 typename iType4 ,
typename iType5 >
1229 KOKKOS_FORCEINLINE_FUNCTION
1231 traits,
typename traits::array_layout, 6,
1232 iType0, iType1, iType2, iType3 , iType4, iType5 >::type
1233 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1234 const iType4 & i4 ,
const iType5 & i5 )
const 1236 KOKKOS_ASSERT_SHAPE_BOUNDS_6( m_offset_map, i0,i1,i2,i3,i4,i5 );
1237 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1239 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5) ];
1242 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1243 typename iType4 ,
typename iType5 >
1244 KOKKOS_FORCEINLINE_FUNCTION
1246 traits,
typename traits::array_layout, 6,
1247 iType0, iType1, iType2, iType3 , iType4, iType5 >::type
1248 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1249 const iType4 & i4 ,
const iType5 & i5 ,
const int ,
const int )
const 1251 KOKKOS_ASSERT_SHAPE_BOUNDS_6( m_offset_map, i0,i1,i2,i3,i4,i5 );
1252 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1254 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5) ];
1259 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1260 typename iType4 ,
typename iType5 ,
typename iType6 >
1261 KOKKOS_FORCEINLINE_FUNCTION
1263 traits,
typename traits::array_layout, 7,
1264 iType0, iType1, iType2, iType3 , iType4, iType5, iType6 >::type
1265 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1266 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 )
const 1268 KOKKOS_ASSERT_SHAPE_BOUNDS_7( m_offset_map, i0,i1,i2,i3,i4,i5,i6 );
1269 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1271 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6) ];
1274 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1275 typename iType4 ,
typename iType5 ,
typename iType6 >
1276 KOKKOS_FORCEINLINE_FUNCTION
1278 traits,
typename traits::array_layout, 7,
1279 iType0, iType1, iType2, iType3 , iType4, iType5, iType6 >::type
1280 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1281 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const int )
const 1283 KOKKOS_ASSERT_SHAPE_BOUNDS_7( m_offset_map, i0,i1,i2,i3,i4,i5,i6 );
1284 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1286 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6) ];
1291 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1292 typename iType4 ,
typename iType5 ,
typename iType6 ,
typename iType7 >
1293 KOKKOS_FORCEINLINE_FUNCTION
1295 traits,
typename traits::array_layout, 8,
1296 iType0, iType1, iType2, iType3 , iType4, iType5, iType6, iType7 >::type
1297 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1298 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const iType7 & i7 )
const 1300 KOKKOS_ASSERT_SHAPE_BOUNDS_8( m_offset_map, i0,i1,i2,i3,i4,i5,i6,i7 );
1301 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1303 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6,i7) ];
1306 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1307 typename iType4 ,
typename iType5 ,
typename iType6 ,
typename iType7 >
1308 KOKKOS_FORCEINLINE_FUNCTION
1310 traits,
typename traits::array_layout, 8,
1311 iType0, iType1, iType2, iType3 , iType4, iType5, iType6, iType7 >::type
1312 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1313 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const iType7 & i7 )
const 1315 KOKKOS_ASSERT_SHAPE_BOUNDS_8( m_offset_map, i0,i1,i2,i3,i4,i5,i6,i7 );
1316 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1318 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6,i7) ];
1325 KOKKOS_FORCEINLINE_FUNCTION
1326 typename traits::value_type * ptr_on_device()
const 1327 {
return (
typename traits::value_type *) m_ptr_on_device ; }
1330 template<
typename iType >
1331 KOKKOS_INLINE_FUNCTION
1332 void stride( iType *
const s )
const 1333 { m_offset_map.stride(s); }
1336 KOKKOS_INLINE_FUNCTION
1337 typename traits::size_type capacity()
const 1338 {
return m_offset_map.capacity(); }
1342 KOKKOS_INLINE_FUNCTION
1343 bool is_contiguous()
const 1344 {
return m_management.is_contiguous(); }
1346 const Impl::AllocationTracker & tracker()
const {
return m_tracker; }
1356 template<
class LT ,
class LL ,
class LD ,
class LM ,
class LS ,
1357 class RT ,
class RL ,
class RD ,
class RM ,
class RS >
1358 KOKKOS_INLINE_FUNCTION
1359 typename Impl::enable_if<( Impl::is_same< LS , RS >::value ),
bool >::type
1368 Impl::is_same<
typename lhs_traits::const_data_type ,
1369 typename rhs_traits::const_data_type >::value &&
1370 Impl::is_same<
typename lhs_traits::array_layout ,
1371 typename rhs_traits::array_layout >::value &&
1372 Impl::is_same<
typename lhs_traits::memory_space ,
1373 typename rhs_traits::memory_space >::value &&
1374 Impl::is_same<
typename lhs_traits::specialize ,
1375 typename rhs_traits::specialize >::value &&
1376 lhs.ptr_on_device() == rhs.ptr_on_device() &&
1377 lhs.shape() == rhs.shape() ;
1380 template<
class LT ,
class LL ,
class LD ,
class LM ,
class LS ,
1381 class RT ,
class RL ,
class RD ,
class RM ,
class RS >
1382 KOKKOS_INLINE_FUNCTION
1402 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS >
1405 typename Impl::enable_if<(
1406 Impl::is_same<
typename ViewTraits<DT,DL,DD,DM>::non_const_value_type ,
1407 typename ViewTraits<DT,DL,DD,DM>::value_type >::value
1408 ),
typename ViewTraits<DT,DL,DD,DM>::const_value_type >::type & value )
1410 Impl::ViewFill< View<DT,DL,DD,DM,DS> >( dst , value );
1413 template<
class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1415 typename Impl::enable_if<( ViewTraits<ST,SL,SD,SM>::rank == 0 )>::type
1419 typedef typename src_traits::memory_space src_memory_space ;
1420 Impl::DeepCopy< HostSpace , src_memory_space >( & dst , src.ptr_on_device() ,
sizeof(ST) );
1426 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1427 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1431 typename Impl::enable_if<(
1444 typedef typename dst_type::memory_space dst_memory_space ;
1445 typedef typename src_type::memory_space src_memory_space ;
1446 typedef typename src_type::value_type value_type ;
1448 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1449 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() ,
sizeof(value_type) );
1457 template<
class DT ,
class DL ,
class DD ,
class DM ,
1458 class ST ,
class SL ,
class SD ,
class SM >
1462 typename Impl::enable_if<(
1481 typedef typename dst_type::memory_space dst_memory_space ;
1482 typedef typename src_type::memory_space src_memory_space ;
1484 enum { is_contiguous =
1485 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutLeft >::value ||
1486 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutRight >::value };
1488 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1492 const bool shapes_are_equal = dst.shape() == src.shape();
1494 if ( shapes_are_equal && is_contiguous && dst.capacity() == src.capacity() ) {
1499 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1501 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1508 size_t size_stride = stride[0]*src.dimension_0();
1509 size_t size_dim = src.dimension_0();
1510 for(
int i = 1; i<src.rank; i++) {
1511 if(stride[i]*src.dimension(i)>size_stride)
1512 size_stride = stride[i]*src.dimension(i);
1513 size_dim*=src.dimension(i);
1516 if( shapes_are_equal && size_stride == size_dim) {
1517 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1519 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1521 Impl::ViewRemap< dst_type , src_type >( dst , src );
1531 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1532 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1536 const typename Impl::enable_if<(
1555 ( ! Impl::is_same< DS , SS >::value )
1562 assert_shapes_equal_dimension( dst.shape() , src.shape() );
1564 Impl::ViewRemap< dst_type , src_type >( dst , src );
1577 template<
class ExecSpace,
class DT ,
class DL ,
class DD ,
class DM ,
class DS >
1580 typename Impl::enable_if<(
1581 Impl::is_same<
typename ViewTraits<DT,DL,DD,DM>::non_const_value_type ,
1582 typename ViewTraits<DT,DL,DD,DM>::value_type >::value
1583 ),
typename ViewTraits<DT,DL,DD,DM>::const_value_type >::type & value )
1585 Impl::ViewFill< View<DT,DL,DD,DM,DS> >( dst , value );
1588 template<
class ExecSpace,
class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1590 typename Impl::enable_if<( ViewTraits<ST,SL,SD,SM>::rank == 0 )>::type
1594 typedef typename src_traits::memory_space src_memory_space ;
1595 Impl::DeepCopy< HostSpace , src_memory_space , ExecSpace >( exec , & dst , src.ptr_on_device() ,
sizeof(ST) );
1601 template<
class ExecSpace ,
1602 class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1603 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1608 typename Impl::enable_if<(
1621 typedef typename dst_type::memory_space dst_memory_space ;
1622 typedef typename src_type::memory_space src_memory_space ;
1623 typedef typename src_type::value_type value_type ;
1625 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1626 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() ,
sizeof(value_type) );
1634 template<
class ExecSpace ,
1635 class DT ,
class DL ,
class DD ,
class DM ,
1636 class ST ,
class SL ,
class SD ,
class SM >
1641 typename Impl::enable_if<(
1660 typedef typename dst_type::memory_space dst_memory_space ;
1661 typedef typename src_type::memory_space src_memory_space ;
1663 enum { is_contiguous =
1664 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutLeft >::value ||
1665 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutRight >::value };
1667 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1671 const bool shapes_are_equal = dst.shape() == src.shape();
1673 if ( shapes_are_equal && is_contiguous && dst.capacity() == src.capacity() ) {
1678 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1680 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1687 size_t size_stride = stride[0]*src.dimension_0();
1688 size_t size_dim = src.dimension_0();
1689 for(
int i = 1; i<src.rank; i++) {
1690 if(stride[i]*src.dimension(i)>size_stride)
1691 size_stride = stride[i]*src.dimension(i);
1692 size_dim*=src.dimension(i);
1695 if( shapes_are_equal && size_stride == size_dim) {
1696 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1698 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1700 Impl::ViewRemap< dst_type , src_type >( dst , src );
1710 template<
class ExecSpace ,
1711 class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1712 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1717 const typename Impl::enable_if<(
1736 ( ! Impl::is_same< DS , SS >::value )
1743 assert_shapes_equal_dimension( dst.shape() , src.shape() );
1745 Impl::ViewRemap< dst_type , src_type >( dst , src );
1754 template<
class T ,
class L ,
class D ,
class M ,
class S >
1755 typename Impl::enable_if<(
1757 !Impl::is_same<L,LayoutStride>::value
1763 typedef typename view_type::HostMirror host_view_type ;
1768 std::string label = src.tracker().label();
1769 label.append(
"_mirror");
1771 return host_view_type( label ,
1779 src.dimension_7() );
1782 template<
class T ,
class L ,
class D ,
class M ,
class S >
1783 typename Impl::enable_if<(
1785 Impl::is_same<L,LayoutStride>::value
1791 typedef typename view_type::HostMirror host_view_type ;
1796 std::string label = src.tracker().label();
1797 label.append(
"_mirror");
1799 src.stride(layout.stride);
1800 layout.dimension[0] = src.dimension_0();
1801 layout.dimension[1] = src.dimension_1();
1802 layout.dimension[2] = src.dimension_2();
1803 layout.dimension[3] = src.dimension_3();
1804 layout.dimension[4] = src.dimension_4();
1805 layout.dimension[5] = src.dimension_5();
1806 layout.dimension[6] = src.dimension_6();
1807 layout.dimension[7] = src.dimension_7();
1809 return host_view_type( label , layout );
1811 template<
class T ,
class L ,
class D ,
class M ,
class S >
1812 typename Impl::enable_if<(
1814 Impl::ViewAssignable< typename View<T,L,D,M,S>::HostMirror ,
View<T,L,D,M,S> >::value
1822 template<
class T ,
class L ,
class D ,
class M ,
class S >
1823 typename Impl::enable_if<(
1825 ! Impl::ViewAssignable< typename View<T,L,D,M,S>::HostMirror ,
View<T,L,D,M,S> >::value
1830 return create_mirror( src );
1836 template<
class T ,
class L ,
class D ,
class M ,
class S >
1840 const size_t n1 = 0 ,
1841 const size_t n2 = 0 ,
1842 const size_t n3 = 0 ,
1843 const size_t n4 = 0 ,
1844 const size_t n5 = 0 ,
1845 const size_t n6 = 0 ,
1846 const size_t n7 = 0 )
1850 const std::string label = v.tracker().label();
1852 view_type v_resized( label, n0, n1, n2, n3, n4, n5, n6, n7 );
1854 Impl::ViewRemap< view_type , view_type >( v_resized , v );
1860 template<
class T ,
class L ,
class D ,
class M ,
class S >
1864 const size_t n1 = 0 ,
1865 const size_t n2 = 0 ,
1866 const size_t n3 = 0 ,
1867 const size_t n4 = 0 ,
1868 const size_t n5 = 0 ,
1869 const size_t n6 = 0 ,
1870 const size_t n7 = 0 )
1875 const std::string label = v.tracker().label();
1878 v = view_type( label, n0, n1, n2, n3, n4, n5, n6, n7 );
1888 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1889 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1890 class ArgType4 ,
class ArgType5 ,
class ArgType6 ,
class ArgType7 >
1891 KOKKOS_INLINE_FUNCTION
1892 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1893 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1894 , ArgType4 , ArgType5 , ArgType6 , ArgType7
1897 const ArgType0 & arg0 ,
1898 const ArgType1 & arg1 ,
1899 const ArgType2 & arg2 ,
1900 const ArgType3 & arg3 ,
1901 const ArgType4 & arg4 ,
1902 const ArgType5 & arg5 ,
1903 const ArgType6 & arg6 ,
1904 const ArgType7 & arg7 )
1907 Impl::ViewSubview< View<D,A1,A2,A3,S>
1908 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1909 , ArgType4 , ArgType5 , ArgType6 , ArgType7
1913 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 );
1916 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1917 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1918 class ArgType4 ,
class ArgType5 ,
class ArgType6 >
1919 KOKKOS_INLINE_FUNCTION
1920 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1921 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1922 , ArgType4 , ArgType5 , ArgType6 ,
void 1925 const ArgType0 & arg0 ,
1926 const ArgType1 & arg1 ,
1927 const ArgType2 & arg2 ,
1928 const ArgType3 & arg3 ,
1929 const ArgType4 & arg4 ,
1930 const ArgType5 & arg5 ,
1931 const ArgType6 & arg6 )
1934 Impl::ViewSubview< View<D,A1,A2,A3,S>
1935 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1936 , ArgType4 , ArgType5 , ArgType6 ,
void 1940 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5, arg6 );
1943 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1944 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1945 class ArgType4 ,
class ArgType5 >
1946 KOKKOS_INLINE_FUNCTION
1947 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1948 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1949 , ArgType4 , ArgType5 , void ,
void 1952 const ArgType0 & arg0 ,
1953 const ArgType1 & arg1 ,
1954 const ArgType2 & arg2 ,
1955 const ArgType3 & arg3 ,
1956 const ArgType4 & arg4 ,
1957 const ArgType5 & arg5 )
1960 Impl::ViewSubview< View<D,A1,A2,A3,S>
1961 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1962 , ArgType4 , ArgType5 , void ,
void 1966 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5 );
1969 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1970 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1972 KOKKOS_INLINE_FUNCTION
1973 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1974 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1975 , ArgType4 , void , void ,
void 1978 const ArgType0 & arg0 ,
1979 const ArgType1 & arg1 ,
1980 const ArgType2 & arg2 ,
1981 const ArgType3 & arg3 ,
1982 const ArgType4 & arg4 )
1985 Impl::ViewSubview< View<D,A1,A2,A3,S>
1986 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1987 , ArgType4 , void , void ,
void 1991 return DstViewType( src, arg0, arg1, arg2, arg3, arg4 );
1994 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1995 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 >
1996 KOKKOS_INLINE_FUNCTION
1997 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1998 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1999 , void , void , void ,
void 2002 const ArgType0 & arg0 ,
2003 const ArgType1 & arg1 ,
2004 const ArgType2 & arg2 ,
2005 const ArgType3 & arg3 )
2008 Impl::ViewSubview< View<D,A1,A2,A3,S>
2009 , ArgType0 , ArgType1 , ArgType2 , ArgType3
2010 , void , void , void ,
void 2014 return DstViewType( src, arg0, arg1, arg2, arg3 );
2017 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2018 class ArgType0 ,
class ArgType1 ,
class ArgType2 >
2019 KOKKOS_INLINE_FUNCTION
2020 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2021 , ArgType0 , ArgType1 , ArgType2 , void
2022 , void , void , void ,
void 2025 const ArgType0 & arg0 ,
2026 const ArgType1 & arg1 ,
2027 const ArgType2 & arg2 )
2030 Impl::ViewSubview< View<D,A1,A2,A3,S>
2031 , ArgType0 , ArgType1 , ArgType2 , void
2032 , void , void , void ,
void 2036 return DstViewType( src, arg0, arg1, arg2 );
2039 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2040 class ArgType0 ,
class ArgType1 >
2041 KOKKOS_INLINE_FUNCTION
2042 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2043 , ArgType0 , ArgType1 , void , void
2044 , void , void , void ,
void 2047 const ArgType0 & arg0 ,
2048 const ArgType1 & arg1 )
2051 Impl::ViewSubview< View<D,A1,A2,A3,S>
2052 , ArgType0 , ArgType1 , void , void
2053 , void , void , void ,
void 2057 return DstViewType( src, arg0, arg1 );
2060 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2062 KOKKOS_INLINE_FUNCTION
2063 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2064 , ArgType0 , void , void , void
2065 , void , void , void ,
void 2068 const ArgType0 & arg0 )
2071 Impl::ViewSubview< View<D,A1,A2,A3,S>
2072 , ArgType0 , void , void , void
2073 , void , void , void ,
void 2077 return DstViewType( src, arg0 );
2085 #include <impl/Kokkos_ViewDefault.hpp> 2086 #include <impl/Kokkos_Atomic_View.hpp> 2088 #include <impl/Kokkos_ViewOffset.hpp> 2089 #include <impl/Kokkos_ViewSupport.hpp> 2093 struct ALL { KOKKOS_INLINE_FUNCTION
ALL(){} };
2099 #include <KokkosExp_View.hpp> 2110 using ALL = Experimental::Impl::ALL_t ;
2113 #include <impl/Kokkos_ViewOffset.hpp> 2114 #include <impl/Kokkos_ViewSupport.hpp> 2116 #include <KokkosExp_View.hpp>
Tag denoting that a subview should capture all of a dimension.
void deep_copy(const View< DT, DL, DD, DM, DS > &dst, typename Impl::enable_if<(Impl::is_same< typename ViewTraits< DT, DL, DD, DM >::non_const_value_type, typename ViewTraits< DT, DL, DD, DM >::value_type >::value), typename ViewTraits< DT, DL, DD, DM >::const_value_type >::type &value)
Deep copy a value into a view.
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices.
KOKKOS_INLINE_FUNCTION complex< RealType > operator*(const complex< RealType > &x, const complex< RealType > &y)
Binary * operator for complex.
KOKKOS_INLINE_FUNCTION bool operator!=(const complex< RealType > &x, const complex< RealType > &y)
Inequality operator for two complex numbers.
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory...
View to an array of data.
Memory space for main process and CPU execution spaces.
Memory layout tag indicating right-to-left (C or lexigraphical scheme) striding of multi-indices...
View specialization mapping of view traits to a specialization tag.
Traits class for accessing attributes of a View.
KOKKOS_INLINE_FUNCTION bool operator==(const complex< RealType > &x, const complex< RealType > &y)
Equality operator for two complex numbers.
void resize(View< T, L, D, M, S > &v, const typename Impl::enable_if< ViewTraits< T, L, D, M >::is_managed, size_t >::type n0, const size_t n1=0, const size_t n2=0, const size_t n3=0, const size_t n4=0, const size_t n5=0, const size_t n6=0, const size_t n7=0)
Resize a view with copying old data to new data at the corresponding indices.
Enable view parentheses operator for match of layout and integral arguments. If correct rank define t...
void realloc(View< T, L, D, M, S > &v, const typename Impl::enable_if< ViewTraits< T, L, D, M >::is_managed, size_t >::type n0, const size_t n1=0, const size_t n2=0, const size_t n3=0, const size_t n4=0, const size_t n5=0, const size_t n6=0, const size_t n7=0)
Reallocate a view without copying old data to new data.