44 #ifndef KOKKOS_VIEW_HPP 45 #define KOKKOS_VIEW_HPP 47 #include <type_traits> 49 #include <Kokkos_Core_fwd.hpp> 51 #if ! defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 53 #include <Kokkos_HostSpace.hpp> 54 #include <Kokkos_MemoryTraits.hpp> 56 #include <impl/Kokkos_StaticAssert.hpp> 57 #include <impl/Kokkos_Traits.hpp> 58 #include <impl/Kokkos_Shape.hpp> 59 #include <impl/Kokkos_AnalyzeShape.hpp> 60 #include <impl/Kokkos_Tags.hpp> 63 namespace Kokkos {
struct ALL ; }
65 #include <impl/Kokkos_ViewOffset.hpp> 66 #include <impl/Kokkos_ViewSupport.hpp> 75 template<
class ValueType ,
76 class ArraySpecialize ,
85 template<
class SrcViewType
97 template<
class DstViewSpecialize ,
98 class SrcViewSpecialize = void ,
100 struct ViewAssignment ;
102 template<
class DstMemorySpace ,
class SrcMemorySpace ,
class ExecutionSpace>
131 template<
class DataType ,
143 enum { Arg1IsLayout = Impl::is_array_layout<Arg1>::value };
145 enum { Arg1IsSpace = Impl::is_space<Arg1>::value };
146 enum { Arg2IsSpace = Impl::is_space<Arg2>::value };
148 enum { Arg1IsMemoryTraits = Impl::is_memory_traits<Arg1>::value };
149 enum { Arg2IsMemoryTraits = Impl::is_memory_traits<Arg2>::value };
150 enum { Arg3IsMemoryTraits = Impl::is_memory_traits<Arg3>::value };
152 enum { Arg1IsVoid = Impl::is_same< Arg1 , void >::value };
153 enum { Arg2IsVoid = Impl::is_same< Arg2 , void >::value };
154 enum { Arg3IsVoid = Impl::is_same< Arg3 , void >::value };
159 ( 1 == Arg1IsLayout + Arg1IsSpace + Arg1IsMemoryTraits + Arg1IsVoid )
160 , Arg1 >::type Arg1Verified ;
168 ( Arg1IsLayout && ( 1 == Arg2IsSpace + Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
169 ( Arg1IsSpace && ( 0 == Arg2IsSpace ) && ( 1 == Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
170 ( Arg1IsMemoryTraits && Arg2IsVoid ) ||
171 ( Arg1IsVoid && Arg2IsVoid )
172 , Arg2 >::type Arg2Verified ;
177 ( 1 == Arg3IsMemoryTraits + Arg3IsVoid ) &&
178 ( Arg1IsMemoryTraits + Arg2IsMemoryTraits + Arg3IsMemoryTraits <= 1 )
179 , Arg3 >::type Arg3Verified ;
182 typedef typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
183 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
184 Kokkos::DefaultExecutionSpace
185 >::type >::type::execution_space ExecutionSpace ;
187 typedef typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
188 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
189 Kokkos::DefaultExecutionSpace
190 >::type >::type::memory_space MemorySpace ;
192 typedef typename Impl::is_space<
193 typename Impl::if_c<( Arg1IsSpace ), Arg1Verified ,
194 typename Impl::if_c<( Arg2IsSpace ), Arg2Verified ,
195 Kokkos::DefaultExecutionSpace
196 >::type >::type >::host_mirror_space HostMirrorSpace ;
199 typedef typename Impl::if_c< Arg1IsLayout , Arg1Verified ,
200 typename ExecutionSpace::array_layout
201 >::type ArrayLayout ;
204 typedef typename Impl::if_c< Arg1IsMemoryTraits , Arg1Verified ,
205 typename Impl::if_c< Arg2IsMemoryTraits , Arg2Verified ,
206 typename Impl::if_c< Arg3IsMemoryTraits , Arg3Verified ,
208 >::type >::type >::type MemoryTraits ;
210 typedef Impl::AnalyzeShape<DataType> analysis ;
217 typedef DataType data_type ;
218 typedef typename analysis::const_type const_data_type ;
219 typedef typename analysis::non_const_type non_const_data_type ;
224 typedef typename analysis::array_intrinsic_type array_intrinsic_type ;
225 typedef typename analysis::const_array_intrinsic_type const_array_intrinsic_type ;
226 typedef typename analysis::non_const_array_intrinsic_type non_const_array_intrinsic_type ;
231 typedef typename analysis::value_type value_type ;
232 typedef typename analysis::const_value_type const_value_type ;
233 typedef typename analysis::non_const_value_type non_const_value_type ;
238 typedef ArrayLayout array_layout ;
239 typedef typename analysis::shape shape_type ;
241 enum { rank = shape_type::rank };
242 enum { rank_dynamic = shape_type::rank_dynamic };
247 typedef ExecutionSpace execution_space ;
248 typedef MemorySpace memory_space ;
250 typedef MemoryTraits memory_traits ;
251 typedef HostMirrorSpace host_mirror_space ;
253 typedef typename memory_space::size_type size_type ;
255 enum { is_hostspace = Impl::is_same< memory_space , HostSpace >::value };
256 enum { is_managed = memory_traits::Unmanaged == 0 };
257 enum { is_random_access = memory_traits::RandomAccess == 1 };
267 ,
typename analysis::specialize
282 class ViewDefault {};
286 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
288 {
typedef ViewDefault type ; };
290 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
291 struct ViewSpecialize< ValueType , void , LayoutRight , MemorySpace , MemoryTraits >
292 {
typedef ViewDefault type ; };
294 template<
class ValueType ,
class MemorySpace ,
class MemoryTraits >
295 struct ViewSpecialize< ValueType , void , LayoutStride , MemorySpace , MemoryTraits >
296 {
typedef ViewDefault type ; };
308 namespace ViewError {
310 struct allocation_constructor_requires_managed {};
311 struct allocation_constructor_requires_nonconst {};
312 struct user_pointer_constructor_requires_unmanaged {};
313 struct device_shmem_constructor_requires_unmanaged {};
315 struct scalar_operator_called_from_non_scalar_view {};
325 template<
class ReturnType ,
class Traits ,
class Layout ,
unsigned Rank ,
326 typename iType0 = int ,
typename iType1 = int ,
327 typename iType2 = int ,
typename iType3 = int ,
328 typename iType4 = int ,
typename iType5 = int ,
329 typename iType6 = int ,
typename iType7 = int ,
330 class Enable =
void >
333 template<
class ReturnType ,
class Traits ,
class Layout ,
unsigned Rank ,
334 typename iType0 ,
typename iType1 ,
335 typename iType2 ,
typename iType3 ,
336 typename iType4 ,
typename iType5 ,
337 typename iType6 ,
typename iType7 >
340 iType0 , iType1 , iType2 , iType3 ,
341 iType4 , iType5 , iType6 , iType7 ,
343 iType0(0) == 0 && iType1(0) == 0 && iType2(0) == 0 && iType3(0) == 0 &&
344 iType4(0) == 0 && iType5(0) == 0 && iType6(0) == 0 && iType7(0) == 0 &&
345 is_same< typename Traits::array_layout , Layout >::value &&
346 ( unsigned(Traits::rank) == Rank )
440 template<
class DataType ,
441 class Arg1Type = void ,
442 class Arg2Type = void ,
443 class Arg3Type = void ,
449 struct is_view :
public Impl::bool_< false > {};
451 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S >
452 struct is_view<
View< D , A1 , A2 , A3 , S > > :
public Impl::bool_< true > {};
455 using Kokkos::is_view ;
460 template<
class DataType ,
464 class View< DataType , Arg1Type , Arg2Type , Arg3Type , Impl::ViewDefault >
465 :
public ViewTraits< DataType , Arg1Type , Arg2Type, Arg3Type >
474 template<
class ,
class ,
class ,
class ,
class >
friend class View ;
477 template<
class ,
class ,
class >
friend struct Impl::ViewAssignment ;
482 typedef Impl::ViewOffset<
typename traits::shape_type
483 ,
typename traits::array_layout
487 typedef Impl::ViewDataManagement< traits > view_data_management ;
492 typename view_data_management::handle_type m_ptr_on_device ;
493 offset_map_type m_offset_map ;
494 view_data_management m_management ;
495 Impl::AllocationTracker m_tracker ;
502 typedef typename view_data_management::return_type reference_type ;
504 enum { reference_type_is_lvalue = view_data_management::ReturnTypeIsReference };
506 typedef View<
typename traits::array_intrinsic_type ,
507 typename traits::array_layout ,
508 typename traits::device_type ,
509 typename traits::memory_traits > array_type ;
511 typedef View<
typename traits::const_data_type ,
512 typename traits::array_layout ,
513 typename traits::device_type ,
514 typename traits::memory_traits > const_type ;
516 typedef View<
typename traits::non_const_data_type ,
517 typename traits::array_layout ,
518 typename traits::device_type ,
519 typename traits::memory_traits > non_const_type ;
521 typedef View<
typename traits::non_const_data_type ,
522 typename traits::array_layout ,
523 typename traits::host_mirror_space ,
529 enum { Rank = traits::rank };
531 KOKKOS_INLINE_FUNCTION offset_map_type shape()
const {
return m_offset_map ; }
532 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_0()
const {
return m_offset_map.N0 ; }
533 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_1()
const {
return m_offset_map.N1 ; }
534 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_2()
const {
return m_offset_map.N2 ; }
535 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_3()
const {
return m_offset_map.N3 ; }
536 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_4()
const {
return m_offset_map.N4 ; }
537 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_5()
const {
return m_offset_map.N5 ; }
538 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_6()
const {
return m_offset_map.N6 ; }
539 KOKKOS_INLINE_FUNCTION
typename traits::size_type dimension_7()
const {
return m_offset_map.N7 ; }
540 KOKKOS_INLINE_FUNCTION
typename traits::size_type size()
const {
return m_offset_map.cardinality(); }
542 template<
typename iType >
543 KOKKOS_INLINE_FUNCTION
544 typename traits::size_type dimension(
const iType & i )
const 545 {
return Impl::dimension( m_offset_map , i ); }
550 KOKKOS_INLINE_FUNCTION
553 KOKKOS_INLINE_FUNCTION
559 { m_offset_map.assign(0, 0,0,0,0,0,0,0,0); }
561 KOKKOS_INLINE_FUNCTION
562 View(
const View & rhs )
568 (void) Impl::ViewAssignment<
569 typename traits::specialize ,
570 typename traits::specialize >( *
this , rhs );
573 KOKKOS_INLINE_FUNCTION
574 View & operator = (
const View & rhs )
576 (void) Impl::ViewAssignment<
577 typename traits::specialize ,
578 typename traits::specialize >( *
this , rhs );
585 template<
class RT ,
class RL ,
class RD ,
class RM ,
class RS >
586 KOKKOS_INLINE_FUNCTION
593 (void) Impl::ViewAssignment<
594 typename traits::specialize , RS >( *
this , rhs );
597 template<
class RT ,
class RL ,
class RD ,
class RM ,
class RS >
598 KOKKOS_INLINE_FUNCTION
601 (void) Impl::ViewAssignment<
602 typename traits::specialize , RS >( *
this , rhs );
619 template<
class AllocationProperties >
621 View(
const AllocationProperties & prop ,
624 const typename Impl::ViewAllocProp< traits , AllocationProperties >::size_type n0 = 0 ,
625 const size_t n1 = 0 ,
626 const size_t n2 = 0 ,
627 const size_t n3 = 0 ,
628 const size_t n4 = 0 ,
629 const size_t n5 = 0 ,
630 const size_t n6 = 0 ,
631 const size_t n7 = 0 ,
632 const size_t n8 = 0 )
638 typedef Impl::ViewAllocProp< traits , AllocationProperties > Alloc ;
640 static_assert(!std::is_same<typename traits::array_layout, LayoutStride>::value,
641 "LayoutStride does not support View constructor which takes dimensions directly!");
643 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
644 if(Alloc::AllowPadding)
645 m_offset_map.set_padding();
647 m_ptr_on_device = view_data_management::template allocate< Alloc::Initialize >( Alloc::label(prop) , m_offset_map, m_tracker );
651 template<
class AllocationProperties >
653 View(
const AllocationProperties & prop ,
654 const typename traits::array_layout & layout ,
657 const typename Impl::ViewAllocProp< traits , AllocationProperties >::size_type = 0 )
663 typedef Impl::ViewAllocProp< traits , AllocationProperties > Alloc ;
665 m_offset_map.assign( layout );
666 if(Alloc::AllowPadding)
667 m_offset_map.set_padding();
669 m_ptr_on_device = view_data_management::template allocate< Alloc::Initialize >( Alloc::label(prop) , m_offset_map, m_tracker );
671 m_management.set_noncontiguous();
678 template<
class Type >
679 explicit KOKKOS_INLINE_FUNCTION
681 typename Impl::ViewRawPointerProp< traits , Type >::size_type n0 = 0 ,
682 const size_t n1 = 0 ,
683 const size_t n2 = 0 ,
684 const size_t n3 = 0 ,
685 const size_t n4 = 0 ,
686 const size_t n5 = 0 ,
687 const size_t n6 = 0 ,
688 const size_t n7 = 0 ,
689 const size_t n8 = 0 )
690 : m_ptr_on_device(ptr)
695 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
696 m_management.set_unmanaged();
699 template<
class Type >
700 explicit KOKKOS_INLINE_FUNCTION
702 typename traits::array_layout
const & layout ,
703 typename Impl::ViewRawPointerProp< traits , Type >::size_type = 0 )
704 : m_ptr_on_device(ptr)
709 m_offset_map.assign( layout );
710 m_management.set_unmanaged();
711 m_management.set_noncontiguous();
722 View( Impl::AllocationTracker
const &arg_tracker ,
723 const size_t n0 = 0 ,
724 const size_t n1 = 0 ,
725 const size_t n2 = 0 ,
726 const size_t n3 = 0 ,
727 const size_t n4 = 0 ,
728 const size_t n5 = 0 ,
729 const size_t n6 = 0 ,
730 const size_t n7 = 0 ,
731 const size_t n8 = 0 )
732 : m_ptr_on_device(reinterpret_cast<typename traits::value_type*>(arg_tracker.alloc_ptr()))
735 , m_tracker(arg_tracker)
737 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7, n8 );
739 const size_t req_size = m_offset_map.capacity() *
sizeof(
typename traits::value_type);
740 if ( m_tracker.alloc_size() < req_size ) {
741 Impl::throw_runtime_exception(
"Error: tracker.alloc_size() < req_size");
746 View( Impl::AllocationTracker
const & arg_tracker
747 ,
typename traits::array_layout
const & layout )
748 : m_ptr_on_device(reinterpret_cast<typename traits::value_type*>(arg_tracker.alloc_ptr()))
751 , m_tracker(arg_tracker)
753 m_offset_map.assign( layout );
755 const size_t req_size = m_offset_map.capacity() *
sizeof(
typename traits::value_type);
756 if ( m_tracker.alloc_size() < req_size ) {
757 Impl::throw_runtime_exception(
"Error: tracker.alloc_size() < req_size");
760 m_management.set_noncontiguous();
773 template<
class D ,
class A1 ,
class A2 ,
class A3
774 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
775 ,
class SubArg4_type ,
class SubArg5_type ,
class SubArg6_type ,
class SubArg7_type
777 KOKKOS_INLINE_FUNCTION
779 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
780 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
781 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
782 ,
const SubArg6_type & arg6 ,
const SubArg7_type & arg7
785 template<
class D ,
class A1 ,
class A2 ,
class A3
786 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
787 ,
class SubArg4_type ,
class SubArg5_type ,
class SubArg6_type
789 KOKKOS_INLINE_FUNCTION
791 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
792 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
793 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
794 ,
const SubArg6_type & arg6
797 template<
class D ,
class A1 ,
class A2 ,
class A3
798 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
799 ,
class SubArg4_type ,
class SubArg5_type
801 KOKKOS_INLINE_FUNCTION
803 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
804 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
805 ,
const SubArg4_type & arg4 ,
const SubArg5_type & arg5
808 template<
class D ,
class A1 ,
class A2 ,
class A3
809 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
812 KOKKOS_INLINE_FUNCTION
814 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
815 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
816 ,
const SubArg4_type & arg4
819 template<
class D ,
class A1 ,
class A2 ,
class A3
820 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
822 KOKKOS_INLINE_FUNCTION
824 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
825 ,
const SubArg2_type & arg2 ,
const SubArg3_type & arg3
828 template<
class D ,
class A1 ,
class A2 ,
class A3
829 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type
831 KOKKOS_INLINE_FUNCTION
833 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
834 ,
const SubArg2_type & arg2
837 template<
class D ,
class A1 ,
class A2 ,
class A3
838 ,
class SubArg0_type ,
class SubArg1_type
840 KOKKOS_INLINE_FUNCTION
842 ,
const SubArg0_type & arg0 ,
const SubArg1_type & arg1
845 template<
class D ,
class A1 ,
class A2 ,
class A3
848 KOKKOS_INLINE_FUNCTION
850 ,
const SubArg0_type & arg0
856 typedef Impl::if_c< ! traits::is_managed ,
857 const typename traits::execution_space::scratch_memory_space & ,
858 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
859 if_scratch_memory_constructor ;
861 explicit KOKKOS_INLINE_FUNCTION
862 View(
typename if_scratch_memory_constructor::type space ,
863 const unsigned n0 = 0 ,
864 const unsigned n1 = 0 ,
865 const unsigned n2 = 0 ,
866 const unsigned n3 = 0 ,
867 const unsigned n4 = 0 ,
868 const unsigned n5 = 0 ,
869 const unsigned n6 = 0 ,
870 const unsigned n7 = 0 )
876 typedef typename traits::value_type value_type_ ;
879 enum { mask = align - 1 };
881 m_offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7 );
883 typedef Impl::if_c< ! traits::is_managed ,
885 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
886 if_device_shmem_pointer ;
889 m_ptr_on_device = if_device_shmem_pointer::select(
890 (value_type_*) space.get_shmem(
unsigned(
sizeof(value_type_) * m_offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ) );
893 explicit KOKKOS_INLINE_FUNCTION
894 View(
typename if_scratch_memory_constructor::type space ,
895 typename traits::array_layout
const & layout)
901 typedef typename traits::value_type value_type_ ;
903 typedef Impl::if_c< ! traits::is_managed ,
905 Impl::ViewError::device_shmem_constructor_requires_unmanaged >
906 if_device_shmem_pointer ;
908 m_offset_map.assign( layout );
909 m_management.set_unmanaged();
910 m_management.set_noncontiguous();
913 enum { mask = align - 1 };
916 m_ptr_on_device = if_device_shmem_pointer::select(
917 (value_type_*) space.get_shmem(
unsigned(
sizeof(value_type_) * m_offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ) );
921 unsigned shmem_size(
const unsigned n0 = 0 ,
922 const unsigned n1 = 0 ,
923 const unsigned n2 = 0 ,
924 const unsigned n3 = 0 ,
925 const unsigned n4 = 0 ,
926 const unsigned n5 = 0 ,
927 const unsigned n6 = 0 ,
928 const unsigned n7 = 0 )
931 enum { mask = align - 1 };
933 typedef typename traits::value_type value_type_ ;
935 offset_map_type offset_map ;
937 offset_map.assign( n0, n1, n2, n3, n4, n5, n6, n7 );
939 return unsigned(
sizeof(value_type_) * offset_map.capacity() + unsigned(mask) ) & ~
unsigned(mask) ;
945 KOKKOS_FORCEINLINE_FUNCTION
946 bool is_null()
const {
return 0 == ptr_on_device() ; }
951 typedef Impl::if_c< traits::rank == 0 ,
952 typename traits::value_type ,
953 Impl::ViewError::scalar_operator_called_from_non_scalar_view >
956 typedef Impl::if_c< traits::rank == 0 ,
958 Impl::ViewError::scalar_operator_called_from_non_scalar_view >
959 if_scalar_operator_return ;
960 KOKKOS_INLINE_FUNCTION
961 const View & operator = (
const typename if_scalar_operator::type & rhs )
const 963 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
964 m_ptr_on_device[ 0 ] = if_scalar_operator::select( rhs );
968 KOKKOS_FORCEINLINE_FUNCTION
969 operator typename if_scalar_operator_return::type ()
const 971 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
972 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
975 KOKKOS_FORCEINLINE_FUNCTION
976 typename if_scalar_operator_return::type operator()()
const 978 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
979 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
982 KOKKOS_FORCEINLINE_FUNCTION
983 typename if_scalar_operator_return::type
operator*()
const 985 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
986 return if_scalar_operator_return::select( m_ptr_on_device[ 0 ] );
998 template<
typename iType0 >
999 KOKKOS_FORCEINLINE_FUNCTION
1001 operator[] (
const iType0 & i0 )
const 1003 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1004 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1006 return m_ptr_on_device[ i0 ];
1009 template<
typename iType0 >
1010 KOKKOS_FORCEINLINE_FUNCTION
1012 operator() (
const iType0 & i0 )
const 1014 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1015 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1017 return m_ptr_on_device[ i0 ];
1020 template<
typename iType0 >
1021 KOKKOS_FORCEINLINE_FUNCTION
1023 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1024 const int ,
const int ,
const int ,
const int )
const 1026 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1027 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1029 return m_ptr_on_device[ i0 ];
1032 template<
typename iType0 >
1033 KOKKOS_FORCEINLINE_FUNCTION
1035 operator[] (
const iType0 & i0 )
const 1037 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1038 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1040 return m_ptr_on_device[ i0 ];
1043 template<
typename iType0 >
1044 KOKKOS_FORCEINLINE_FUNCTION
1046 operator() (
const iType0 & i0 )
const 1048 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1049 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1051 return m_ptr_on_device[ i0 ];
1054 template<
typename iType0 >
1055 KOKKOS_FORCEINLINE_FUNCTION
1057 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1058 const int ,
const int ,
const int ,
const int )
const 1060 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1061 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1063 return m_ptr_on_device[ i0 ];
1066 template<
typename iType0 >
1067 KOKKOS_FORCEINLINE_FUNCTION
1069 typename Impl::if_c<
1070 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1071 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1072 void,
typename traits::array_layout>::type,
1074 operator[] (
const iType0 & i0 )
const 1076 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1077 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1079 return m_ptr_on_device[ m_offset_map(i0) ];
1082 template<
typename iType0 >
1083 KOKKOS_FORCEINLINE_FUNCTION
1085 typename Impl::if_c<
1086 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1087 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1088 void,
typename traits::array_layout>::type,
1090 operator() (
const iType0 & i0 )
const 1092 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1093 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1095 return m_ptr_on_device[ m_offset_map(i0) ];
1098 template<
typename iType0 >
1099 KOKKOS_FORCEINLINE_FUNCTION
1101 typename Impl::if_c<
1102 Impl::is_same<typename traits::array_layout, LayoutRight>::value ||
1103 Impl::is_same<typename traits::array_layout, LayoutLeft>::value ,
1104 void,
typename traits::array_layout>::type,
1106 at(
const iType0 & i0 ,
const int ,
const int ,
const int ,
1107 const int ,
const int ,
const int ,
const int )
const 1109 KOKKOS_ASSERT_SHAPE_BOUNDS_1( m_offset_map, i0 );
1110 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1112 return m_ptr_on_device[ m_offset_map(i0) ];
1117 template<
typename iType0 ,
typename iType1 >
1118 KOKKOS_FORCEINLINE_FUNCTION
1120 traits,
typename traits::array_layout, 2, iType0, iType1 >::type
1121 operator() (
const iType0 & i0 ,
const iType1 & i1 )
const 1123 KOKKOS_ASSERT_SHAPE_BOUNDS_2( m_offset_map, i0,i1 );
1124 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1126 return m_ptr_on_device[ m_offset_map(i0,i1) ];
1129 template<
typename iType0 ,
typename iType1 >
1130 KOKKOS_FORCEINLINE_FUNCTION
1132 traits,
typename traits::array_layout, 2, iType0, iType1 >::type
1133 at(
const iType0 & i0 ,
const iType1 & i1 ,
const int ,
const int ,
1134 const int ,
const int ,
const int ,
const int )
const 1136 KOKKOS_ASSERT_SHAPE_BOUNDS_2( m_offset_map, i0,i1 );
1137 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1139 return m_ptr_on_device[ m_offset_map(i0,i1) ];
1144 template<
typename iType0 ,
typename iType1 ,
typename iType2 >
1145 KOKKOS_FORCEINLINE_FUNCTION
1147 traits,
typename traits::array_layout, 3, iType0, iType1, iType2 >::type
1148 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 )
const 1150 KOKKOS_ASSERT_SHAPE_BOUNDS_3( m_offset_map, i0,i1,i2 );
1151 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1153 return m_ptr_on_device[ m_offset_map(i0,i1,i2) ];
1156 template<
typename iType0 ,
typename iType1 ,
typename iType2 >
1157 KOKKOS_FORCEINLINE_FUNCTION
1159 traits,
typename traits::array_layout, 3, iType0, iType1, iType2 >::type
1160 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const int ,
1161 const int ,
const int ,
const int ,
const int )
const 1163 KOKKOS_ASSERT_SHAPE_BOUNDS_3( m_offset_map, i0,i1,i2 );
1164 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1166 return m_ptr_on_device[ m_offset_map(i0,i1,i2) ];
1171 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 >
1172 KOKKOS_FORCEINLINE_FUNCTION
1174 traits,
typename traits::array_layout, 4, iType0, iType1, iType2, iType3 >::type
1175 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 )
const 1177 KOKKOS_ASSERT_SHAPE_BOUNDS_4( m_offset_map, i0,i1,i2,i3 );
1178 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1180 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3) ];
1183 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 >
1184 KOKKOS_FORCEINLINE_FUNCTION
1186 traits,
typename traits::array_layout, 4, iType0, iType1, iType2, iType3 >::type
1187 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1188 const int ,
const int ,
const int ,
const int )
const 1190 KOKKOS_ASSERT_SHAPE_BOUNDS_4( m_offset_map, i0,i1,i2,i3 );
1191 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1193 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3) ];
1198 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1200 KOKKOS_FORCEINLINE_FUNCTION
1202 traits,
typename traits::array_layout, 5, iType0, iType1, iType2, iType3 , iType4 >::type
1203 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1204 const iType4 & i4 )
const 1206 KOKKOS_ASSERT_SHAPE_BOUNDS_5( m_offset_map, i0,i1,i2,i3,i4 );
1207 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1209 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4) ];
1212 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1214 KOKKOS_FORCEINLINE_FUNCTION
1216 traits,
typename traits::array_layout, 5, iType0, iType1, iType2, iType3 , iType4 >::type
1217 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1218 const iType4 & i4 ,
const int ,
const int ,
const int )
const 1220 KOKKOS_ASSERT_SHAPE_BOUNDS_5( m_offset_map, i0,i1,i2,i3,i4 );
1221 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1223 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4) ];
1228 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1229 typename iType4 ,
typename iType5 >
1230 KOKKOS_FORCEINLINE_FUNCTION
1232 traits,
typename traits::array_layout, 6,
1233 iType0, iType1, iType2, iType3 , iType4, iType5 >::type
1234 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1235 const iType4 & i4 ,
const iType5 & i5 )
const 1237 KOKKOS_ASSERT_SHAPE_BOUNDS_6( m_offset_map, i0,i1,i2,i3,i4,i5 );
1238 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1240 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5) ];
1243 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1244 typename iType4 ,
typename iType5 >
1245 KOKKOS_FORCEINLINE_FUNCTION
1247 traits,
typename traits::array_layout, 6,
1248 iType0, iType1, iType2, iType3 , iType4, iType5 >::type
1249 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1250 const iType4 & i4 ,
const iType5 & i5 ,
const int ,
const int )
const 1252 KOKKOS_ASSERT_SHAPE_BOUNDS_6( m_offset_map, i0,i1,i2,i3,i4,i5 );
1253 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1255 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5) ];
1260 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1261 typename iType4 ,
typename iType5 ,
typename iType6 >
1262 KOKKOS_FORCEINLINE_FUNCTION
1264 traits,
typename traits::array_layout, 7,
1265 iType0, iType1, iType2, iType3 , iType4, iType5, iType6 >::type
1266 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1267 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 )
const 1269 KOKKOS_ASSERT_SHAPE_BOUNDS_7( m_offset_map, i0,i1,i2,i3,i4,i5,i6 );
1270 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1272 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6) ];
1275 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1276 typename iType4 ,
typename iType5 ,
typename iType6 >
1277 KOKKOS_FORCEINLINE_FUNCTION
1279 traits,
typename traits::array_layout, 7,
1280 iType0, iType1, iType2, iType3 , iType4, iType5, iType6 >::type
1281 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1282 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const int )
const 1284 KOKKOS_ASSERT_SHAPE_BOUNDS_7( m_offset_map, i0,i1,i2,i3,i4,i5,i6 );
1285 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1287 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6) ];
1292 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1293 typename iType4 ,
typename iType5 ,
typename iType6 ,
typename iType7 >
1294 KOKKOS_FORCEINLINE_FUNCTION
1296 traits,
typename traits::array_layout, 8,
1297 iType0, iType1, iType2, iType3 , iType4, iType5, iType6, iType7 >::type
1298 operator() (
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1299 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const iType7 & i7 )
const 1301 KOKKOS_ASSERT_SHAPE_BOUNDS_8( m_offset_map, i0,i1,i2,i3,i4,i5,i6,i7 );
1302 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1304 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6,i7) ];
1307 template<
typename iType0 ,
typename iType1 ,
typename iType2 ,
typename iType3 ,
1308 typename iType4 ,
typename iType5 ,
typename iType6 ,
typename iType7 >
1309 KOKKOS_FORCEINLINE_FUNCTION
1311 traits,
typename traits::array_layout, 8,
1312 iType0, iType1, iType2, iType3 , iType4, iType5, iType6, iType7 >::type
1313 at(
const iType0 & i0 ,
const iType1 & i1 ,
const iType2 & i2 ,
const iType3 & i3 ,
1314 const iType4 & i4 ,
const iType5 & i5 ,
const iType6 & i6 ,
const iType7 & i7 )
const 1316 KOKKOS_ASSERT_SHAPE_BOUNDS_8( m_offset_map, i0,i1,i2,i3,i4,i5,i6,i7 );
1317 KOKKOS_RESTRICT_EXECUTION_TO_DATA(
typename traits::memory_space , ptr_on_device() );
1319 return m_ptr_on_device[ m_offset_map(i0,i1,i2,i3,i4,i5,i6,i7) ];
1326 KOKKOS_FORCEINLINE_FUNCTION
1327 typename traits::value_type * ptr_on_device()
const 1328 {
return (
typename traits::value_type *) m_ptr_on_device ; }
1331 template<
typename iType >
1332 KOKKOS_INLINE_FUNCTION
1333 void stride( iType *
const s )
const 1334 { m_offset_map.stride(s); }
1337 KOKKOS_INLINE_FUNCTION
1338 typename traits::size_type capacity()
const 1339 {
return m_offset_map.capacity(); }
1343 KOKKOS_INLINE_FUNCTION
1344 bool is_contiguous()
const 1345 {
return m_management.is_contiguous(); }
1347 const Impl::AllocationTracker & tracker()
const {
return m_tracker; }
1357 template<
class LT ,
class LL ,
class LD ,
class LM ,
class LS ,
1358 class RT ,
class RL ,
class RD ,
class RM ,
class RS >
1359 KOKKOS_INLINE_FUNCTION
1360 typename Impl::enable_if<( Impl::is_same< LS , RS >::value ),
bool >::type
1369 Impl::is_same<
typename lhs_traits::const_data_type ,
1370 typename rhs_traits::const_data_type >::value &&
1371 Impl::is_same<
typename lhs_traits::array_layout ,
1372 typename rhs_traits::array_layout >::value &&
1373 Impl::is_same<
typename lhs_traits::memory_space ,
1374 typename rhs_traits::memory_space >::value &&
1375 Impl::is_same<
typename lhs_traits::specialize ,
1376 typename rhs_traits::specialize >::value &&
1377 lhs.ptr_on_device() == rhs.ptr_on_device() &&
1378 lhs.shape() == rhs.shape() ;
1381 template<
class LT ,
class LL ,
class LD ,
class LM ,
class LS ,
1382 class RT ,
class RL ,
class RD ,
class RM ,
class RS >
1383 KOKKOS_INLINE_FUNCTION
1403 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS >
1406 typename Impl::enable_if<(
1407 Impl::is_same<
typename ViewTraits<DT,DL,DD,DM>::non_const_value_type ,
1408 typename ViewTraits<DT,DL,DD,DM>::value_type >::value
1409 ),
typename ViewTraits<DT,DL,DD,DM>::const_value_type >::type & value )
1411 Impl::ViewFill< View<DT,DL,DD,DM,DS> >( dst , value );
1414 template<
class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1416 typename Impl::enable_if<( ViewTraits<ST,SL,SD,SM>::rank == 0 )>::type
1420 typedef typename src_traits::memory_space src_memory_space ;
1421 Impl::DeepCopy< HostSpace , src_memory_space >( & dst , src.ptr_on_device() ,
sizeof(ST) );
1427 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1428 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1432 typename Impl::enable_if<(
1445 typedef typename dst_type::memory_space dst_memory_space ;
1446 typedef typename src_type::memory_space src_memory_space ;
1447 typedef typename src_type::value_type value_type ;
1449 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1450 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() ,
sizeof(value_type) );
1458 template<
class DT ,
class DL ,
class DD ,
class DM ,
1459 class ST ,
class SL ,
class SD ,
class SM >
1463 typename Impl::enable_if<(
1482 typedef typename dst_type::memory_space dst_memory_space ;
1483 typedef typename src_type::memory_space src_memory_space ;
1485 enum { is_contiguous =
1486 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutLeft >::value ||
1487 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutRight >::value };
1489 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1493 const bool shapes_are_equal = dst.shape() == src.shape();
1495 if ( shapes_are_equal && is_contiguous && dst.capacity() == src.capacity() ) {
1500 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1502 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1509 size_t size_stride = stride[0]*src.dimension_0();
1510 size_t size_dim = src.dimension_0();
1511 for(
int i = 1; i<src.rank; i++) {
1512 if(stride[i]*src.dimension(i)>size_stride)
1513 size_stride = stride[i]*src.dimension(i);
1514 size_dim*=src.dimension(i);
1517 if( shapes_are_equal && size_stride == size_dim) {
1518 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1520 Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1522 Impl::ViewRemap< dst_type , src_type >( dst , src );
1532 template<
class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1533 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1537 const typename Impl::enable_if<(
1556 ( ! Impl::is_same< DS , SS >::value )
1563 assert_shapes_equal_dimension( dst.shape() , src.shape() );
1565 Impl::ViewRemap< dst_type , src_type >( dst , src );
1578 template<
class ExecSpace,
class DT ,
class DL ,
class DD ,
class DM ,
class DS >
1581 typename Impl::enable_if<(
1582 Impl::is_same<
typename ViewTraits<DT,DL,DD,DM>::non_const_value_type ,
1583 typename ViewTraits<DT,DL,DD,DM>::value_type >::value
1584 ),
typename ViewTraits<DT,DL,DD,DM>::const_value_type >::type & value )
1586 Impl::ViewFill< View<DT,DL,DD,DM,DS> >( dst , value );
1589 template<
class ExecSpace,
class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1591 typename Impl::enable_if<( ViewTraits<ST,SL,SD,SM>::rank == 0 )>::type
1595 typedef typename src_traits::memory_space src_memory_space ;
1596 Impl::DeepCopy< HostSpace , src_memory_space , ExecSpace >( exec , & dst , src.ptr_on_device() ,
sizeof(ST) );
1602 template<
class ExecSpace ,
1603 class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1604 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1609 typename Impl::enable_if<(
1622 typedef typename dst_type::memory_space dst_memory_space ;
1623 typedef typename src_type::memory_space src_memory_space ;
1624 typedef typename src_type::value_type value_type ;
1626 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1627 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() ,
sizeof(value_type) );
1635 template<
class ExecSpace ,
1636 class DT ,
class DL ,
class DD ,
class DM ,
1637 class ST ,
class SL ,
class SD ,
class SM >
1642 typename Impl::enable_if<(
1661 typedef typename dst_type::memory_space dst_memory_space ;
1662 typedef typename src_type::memory_space src_memory_space ;
1664 enum { is_contiguous =
1665 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutLeft >::value ||
1666 Impl::is_same< typename View<DT,DL,DD,DM,Impl::ViewDefault>::array_layout ,
LayoutRight >::value };
1668 if ( dst.ptr_on_device() != src.ptr_on_device() ) {
1672 const bool shapes_are_equal = dst.shape() == src.shape();
1674 if ( shapes_are_equal && is_contiguous && dst.capacity() == src.capacity() ) {
1679 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1681 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1688 size_t size_stride = stride[0]*src.dimension_0();
1689 size_t size_dim = src.dimension_0();
1690 for(
int i = 1; i<src.rank; i++) {
1691 if(stride[i]*src.dimension(i)>size_stride)
1692 size_stride = stride[i]*src.dimension(i);
1693 size_dim*=src.dimension(i);
1696 if( shapes_are_equal && size_stride == size_dim) {
1697 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.capacity();
1699 Impl::DeepCopy< dst_memory_space , src_memory_space , ExecSpace >( exec , dst.ptr_on_device() , src.ptr_on_device() , nbytes );
1701 Impl::ViewRemap< dst_type , src_type >( dst , src );
1711 template<
class ExecSpace ,
1712 class DT ,
class DL ,
class DD ,
class DM ,
class DS ,
1713 class ST ,
class SL ,
class SD ,
class SM ,
class SS >
1718 const typename Impl::enable_if<(
1737 ( ! Impl::is_same< DS , SS >::value )
1744 assert_shapes_equal_dimension( dst.shape() , src.shape() );
1746 Impl::ViewRemap< dst_type , src_type >( dst , src );
1755 template<
class T ,
class L ,
class D ,
class M ,
class S >
1756 typename Impl::enable_if<(
1758 !Impl::is_same<L,LayoutStride>::value
1764 typedef typename view_type::HostMirror host_view_type ;
1769 std::string label = src.tracker().label();
1770 label.append(
"_mirror");
1772 return host_view_type( label ,
1780 src.dimension_7() );
1783 template<
class T ,
class L ,
class D ,
class M ,
class S >
1784 typename Impl::enable_if<(
1786 Impl::is_same<L,LayoutStride>::value
1792 typedef typename view_type::HostMirror host_view_type ;
1797 std::string label = src.tracker().label();
1798 label.append(
"_mirror");
1800 src.stride(layout.stride);
1801 layout.dimension[0] = src.dimension_0();
1802 layout.dimension[1] = src.dimension_1();
1803 layout.dimension[2] = src.dimension_2();
1804 layout.dimension[3] = src.dimension_3();
1805 layout.dimension[4] = src.dimension_4();
1806 layout.dimension[5] = src.dimension_5();
1807 layout.dimension[6] = src.dimension_6();
1808 layout.dimension[7] = src.dimension_7();
1810 return host_view_type( label , layout );
1812 template<
class T ,
class L ,
class D ,
class M ,
class S >
1813 typename Impl::enable_if<(
1815 Impl::ViewAssignable< typename View<T,L,D,M,S>::HostMirror ,
View<T,L,D,M,S> >::value
1823 template<
class T ,
class L ,
class D ,
class M ,
class S >
1824 typename Impl::enable_if<(
1826 ! Impl::ViewAssignable< typename View<T,L,D,M,S>::HostMirror ,
View<T,L,D,M,S> >::value
1831 return create_mirror( src );
1837 template<
class T ,
class L ,
class D ,
class M ,
class S >
1841 const size_t n1 = 0 ,
1842 const size_t n2 = 0 ,
1843 const size_t n3 = 0 ,
1844 const size_t n4 = 0 ,
1845 const size_t n5 = 0 ,
1846 const size_t n6 = 0 ,
1847 const size_t n7 = 0 )
1851 const std::string label = v.tracker().label();
1853 view_type v_resized( label, n0, n1, n2, n3, n4, n5, n6, n7 );
1855 Impl::ViewRemap< view_type , view_type >( v_resized , v );
1857 view_type::execution_space::fence();
1863 template<
class T ,
class L ,
class D ,
class M ,
class S >
1867 const size_t n1 = 0 ,
1868 const size_t n2 = 0 ,
1869 const size_t n3 = 0 ,
1870 const size_t n4 = 0 ,
1871 const size_t n5 = 0 ,
1872 const size_t n6 = 0 ,
1873 const size_t n7 = 0 )
1878 const std::string label = v.tracker().label();
1881 v = view_type( label, n0, n1, n2, n3, n4, n5, n6, n7 );
1891 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1892 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1893 class ArgType4 ,
class ArgType5 ,
class ArgType6 ,
class ArgType7 >
1894 KOKKOS_INLINE_FUNCTION
1895 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1896 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1897 , ArgType4 , ArgType5 , ArgType6 , ArgType7
1900 const ArgType0 & arg0 ,
1901 const ArgType1 & arg1 ,
1902 const ArgType2 & arg2 ,
1903 const ArgType3 & arg3 ,
1904 const ArgType4 & arg4 ,
1905 const ArgType5 & arg5 ,
1906 const ArgType6 & arg6 ,
1907 const ArgType7 & arg7 )
1910 Impl::ViewSubview< View<D,A1,A2,A3,S>
1911 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1912 , ArgType4 , ArgType5 , ArgType6 , ArgType7
1916 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 );
1919 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1920 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1921 class ArgType4 ,
class ArgType5 ,
class ArgType6 >
1922 KOKKOS_INLINE_FUNCTION
1923 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1924 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1925 , ArgType4 , ArgType5 , ArgType6 ,
void 1928 const ArgType0 & arg0 ,
1929 const ArgType1 & arg1 ,
1930 const ArgType2 & arg2 ,
1931 const ArgType3 & arg3 ,
1932 const ArgType4 & arg4 ,
1933 const ArgType5 & arg5 ,
1934 const ArgType6 & arg6 )
1937 Impl::ViewSubview< View<D,A1,A2,A3,S>
1938 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1939 , ArgType4 , ArgType5 , ArgType6 ,
void 1943 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5, arg6 );
1946 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1947 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1948 class ArgType4 ,
class ArgType5 >
1949 KOKKOS_INLINE_FUNCTION
1950 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1951 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1952 , ArgType4 , ArgType5 , void ,
void 1955 const ArgType0 & arg0 ,
1956 const ArgType1 & arg1 ,
1957 const ArgType2 & arg2 ,
1958 const ArgType3 & arg3 ,
1959 const ArgType4 & arg4 ,
1960 const ArgType5 & arg5 )
1963 Impl::ViewSubview< View<D,A1,A2,A3,S>
1964 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1965 , ArgType4 , ArgType5 , void ,
void 1969 return DstViewType( src, arg0, arg1, arg2, arg3, arg4, arg5 );
1972 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1973 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
1975 KOKKOS_INLINE_FUNCTION
1976 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
1977 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1978 , ArgType4 , void , void ,
void 1981 const ArgType0 & arg0 ,
1982 const ArgType1 & arg1 ,
1983 const ArgType2 & arg2 ,
1984 const ArgType3 & arg3 ,
1985 const ArgType4 & arg4 )
1988 Impl::ViewSubview< View<D,A1,A2,A3,S>
1989 , ArgType0 , ArgType1 , ArgType2 , ArgType3
1990 , ArgType4 , void , void ,
void 1994 return DstViewType( src, arg0, arg1, arg2, arg3, arg4 );
1997 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
1998 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 >
1999 KOKKOS_INLINE_FUNCTION
2000 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2001 , ArgType0 , ArgType1 , ArgType2 , ArgType3
2002 , void , void , void ,
void 2005 const ArgType0 & arg0 ,
2006 const ArgType1 & arg1 ,
2007 const ArgType2 & arg2 ,
2008 const ArgType3 & arg3 )
2011 Impl::ViewSubview< View<D,A1,A2,A3,S>
2012 , ArgType0 , ArgType1 , ArgType2 , ArgType3
2013 , void , void , void ,
void 2017 return DstViewType( src, arg0, arg1, arg2, arg3 );
2020 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2021 class ArgType0 ,
class ArgType1 ,
class ArgType2 >
2022 KOKKOS_INLINE_FUNCTION
2023 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2024 , ArgType0 , ArgType1 , ArgType2 , void
2025 , void , void , void ,
void 2028 const ArgType0 & arg0 ,
2029 const ArgType1 & arg1 ,
2030 const ArgType2 & arg2 )
2033 Impl::ViewSubview< View<D,A1,A2,A3,S>
2034 , ArgType0 , ArgType1 , ArgType2 , void
2035 , void , void , void ,
void 2039 return DstViewType( src, arg0, arg1, arg2 );
2042 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2043 class ArgType0 ,
class ArgType1 >
2044 KOKKOS_INLINE_FUNCTION
2045 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2046 , ArgType0 , ArgType1 , void , void
2047 , void , void , void ,
void 2050 const ArgType0 & arg0 ,
2051 const ArgType1 & arg1 )
2054 Impl::ViewSubview< View<D,A1,A2,A3,S>
2055 , ArgType0 , ArgType1 , void , void
2056 , void , void , void ,
void 2060 return DstViewType( src, arg0, arg1 );
2063 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class S ,
2065 KOKKOS_INLINE_FUNCTION
2066 typename Impl::ViewSubview< View<D,A1,A2,A3,S>
2067 , ArgType0 , void , void , void
2068 , void , void , void ,
void 2071 const ArgType0 & arg0 )
2074 Impl::ViewSubview< View<D,A1,A2,A3,S>
2075 , ArgType0 , void , void , void
2076 , void , void , void ,
void 2080 return DstViewType( src, arg0 );
2088 #include <impl/Kokkos_ViewDefault.hpp> 2089 #include <impl/Kokkos_Atomic_View.hpp> 2091 #include <impl/Kokkos_ViewOffset.hpp> 2092 #include <impl/Kokkos_ViewSupport.hpp> 2096 struct ALL { KOKKOS_INLINE_FUNCTION
ALL(){} };
2104 #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.