44 #ifndef KOKKOS_EXPERIMENTAL_VIEW_HPP 45 #define KOKKOS_EXPERIMENTAL_VIEW_HPP 48 #include <type_traits> 49 #include <initializer_list> 51 #include <Kokkos_Core_fwd.hpp> 52 #include <Kokkos_HostSpace.hpp> 53 #include <Kokkos_MemoryTraits.hpp> 62 template<
class DataType >
63 struct ViewArrayAnalysis ;
65 template<
class DataType ,
class ValueType ,
class ArrayLayout >
66 struct ViewDataAnalysis ;
68 template<
class ,
class =
void ,
typename Enable =
void >
69 class ViewMapping {
enum { is_assignable =
false }; };
71 template<
class DstMemorySpace ,
class SrcMemorySpace >
102 template<
class DataType ,
114 enum { Arg1IsLayout = Kokkos::Impl::is_array_layout<Arg1>::value };
116 enum { Arg1IsSpace = Kokkos::Impl::is_space<Arg1>::value };
117 enum { Arg2IsSpace = Kokkos::Impl::is_space<Arg2>::value };
119 enum { Arg1IsMemoryTraits = Kokkos::Impl::is_memory_traits<Arg1>::value };
120 enum { Arg2IsMemoryTraits = Kokkos::Impl::is_memory_traits<Arg2>::value };
121 enum { Arg3IsMemoryTraits = Kokkos::Impl::is_memory_traits<Arg3>::value };
123 enum { Arg1IsVoid = std::is_same< Arg1 , void >::value };
124 enum { Arg2IsVoid = std::is_same< Arg2 , void >::value };
125 enum { Arg3IsVoid = std::is_same< Arg3 , void >::value };
127 static_assert( 1 == Arg1IsLayout + Arg1IsSpace + Arg1IsMemoryTraits + Arg1IsVoid
128 ,
"Template argument #1 must be layout, space, traits, or void" );
135 static_assert( ( Arg1IsLayout && ( 1 == Arg2IsSpace + Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
136 ( Arg1IsSpace && ( 0 == Arg2IsSpace ) && ( 1 == Arg2IsMemoryTraits + Arg2IsVoid ) ) ||
137 ( Arg1IsMemoryTraits && Arg2IsVoid ) ||
138 ( Arg1IsVoid && Arg2IsVoid )
139 ,
"Template argument #2 must be space, traits, or void" );
142 static_assert( ( 1 == Arg3IsMemoryTraits + Arg3IsVoid ) &&
143 ( Arg1IsMemoryTraits + Arg2IsMemoryTraits + Arg3IsMemoryTraits <= 1 )
144 ,
"Template argument #3 must be traits or void" );
147 typename std::conditional< Arg1IsSpace , Arg1 ,
148 typename std::conditional< Arg2IsSpace , Arg2 , Kokkos::DefaultExecutionSpace
149 >::type >::type::execution_space
153 typename std::conditional< Arg1IsSpace , Arg1 ,
154 typename std::conditional< Arg2IsSpace , Arg2 , Kokkos::DefaultExecutionSpace
155 >::type >::type::memory_space
159 typename Kokkos::Impl::is_space<
160 typename std::conditional< Arg1IsSpace , Arg1 ,
161 typename std::conditional< Arg2IsSpace , Arg2 , Kokkos::DefaultExecutionSpace
162 >::type >::type >::host_mirror_space
166 typename std::conditional< Arg1IsLayout , Arg1 , typename ExecutionSpace::array_layout >::type
171 typename std::conditional< Arg1IsMemoryTraits , Arg1 ,
172 typename std::conditional< Arg2IsMemoryTraits , Arg2 ,
173 typename std::conditional< Arg3IsMemoryTraits , Arg3 , MemoryManaged
174 >::type >::type >::type
178 typedef Kokkos::Experimental::Impl::ViewArrayAnalysis< DataType > array_analysis ;
181 typedef Kokkos::Experimental::Impl::
182 ViewDataAnalysis< DataType
183 ,
typename array_analysis::non_const_value_type
192 typedef typename data_analysis::type data_type ;
193 typedef typename data_analysis::const_type const_data_type ;
194 typedef typename data_analysis::non_const_type non_const_data_type ;
199 typedef typename data_analysis::array_scalar_type array_scalar_type ;
200 typedef typename data_analysis::const_array_scalar_type const_array_scalar_type ;
201 typedef typename data_analysis::non_const_array_scalar_type non_const_array_scalar_type ;
206 typedef typename data_analysis::value_type value_type ;
207 typedef typename data_analysis::const_value_type const_value_type ;
208 typedef typename data_analysis::non_const_value_type non_const_value_type ;
213 typedef ArrayLayout array_layout ;
214 typedef typename data_analysis::dimension dimension ;
215 typedef typename data_analysis::specialize specialize ;
217 enum { rank = dimension::rank };
218 enum { rank_dynamic = dimension::rank_dynamic };
223 typedef ExecutionSpace execution_space ;
224 typedef MemorySpace memory_space ;
226 typedef MemoryTraits memory_traits ;
227 typedef HostMirrorSpace host_mirror_space ;
229 typedef typename memory_space::size_type size_type ;
231 enum { is_hostspace = std::is_same< memory_space , HostSpace >::value };
232 enum { is_managed = memory_traits::Unmanaged == 0 };
233 enum { is_random_access = memory_traits::RandomAccess == 1 };
318 template<
class DataType
321 ,
class Arg3 =
void >
330 #include <impl/KokkosExp_ViewMapping.hpp> 331 #include <impl/KokkosExp_ViewAllocProp.hpp> 332 #include <impl/KokkosExp_ViewArray.hpp> 342 constexpr Kokkos::Experimental::Impl::ALL_t
343 ALL = Kokkos::Experimental::Impl::ALL_t();
345 constexpr Kokkos::Experimental::Impl::WithoutInitializing_t
346 WithoutInitializing = Kokkos::Experimental::Impl::WithoutInitializing_t();
348 constexpr Kokkos::Experimental::Impl::AllowPadding_t
349 AllowPadding = Kokkos::Experimental::Impl::AllowPadding_t();
362 template<
class ... Args >
364 Kokkos::Experimental::Impl::ViewAllocProp< Args ... >
365 view_alloc( Args ... args )
367 return Kokkos::Experimental::Impl::ViewAllocProp< Args ... >( args ... );
381 ,
bool R0 = false ,
bool R1 = false ,
bool R2 = false ,
bool R3 = false
382 ,
bool R4 = false ,
bool R5 = false ,
bool R6 = false ,
bool R7 =
false >
383 using Subview =
typename Kokkos::Experimental::Impl::SubviewType< V, R0 , R1 , R2 , R3 , R4 , R5 , R6 , R7 >::type ;
385 template<
class DataType ,
class Arg1 ,
class Arg2 ,
class Arg3 >
389 template<
class ,
class ,
class ,
class >
friend class View ;
392 typedef Kokkos::Experimental::Impl::ViewMapping< traits > map_type ;
393 typedef Kokkos::Experimental::Impl::SharedAllocationTracker track_type ;
402 typedef View<
typename traits::array_scalar_type ,
403 typename traits::array_layout ,
405 typename traits::memory_traits >
409 typedef View<
typename traits::const_data_type ,
410 typename traits::array_layout ,
411 typename traits::device_type ,
412 typename traits::memory_traits >
416 typedef View<
typename traits::non_const_data_type ,
417 typename traits::array_layout ,
418 typename traits::device_type ,
419 typename traits::memory_traits >
423 typedef View<
typename traits::non_const_data_type ,
424 typename traits::array_layout ,
425 typename traits::host_mirror_space ,
432 enum { Rank = map_type::Rank };
434 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_0()
const {
return m_map.dimension_0(); }
435 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_1()
const {
return m_map.dimension_1(); }
436 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_2()
const {
return m_map.dimension_2(); }
437 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_3()
const {
return m_map.dimension_3(); }
438 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_4()
const {
return m_map.dimension_4(); }
439 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_5()
const {
return m_map.dimension_5(); }
440 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_6()
const {
return m_map.dimension_6(); }
441 KOKKOS_INLINE_FUNCTION constexpr
size_t dimension_7()
const {
return m_map.dimension_7(); }
443 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_0()
const {
return m_map.stride_0(); }
444 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_1()
const {
return m_map.stride_1(); }
445 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_2()
const {
return m_map.stride_2(); }
446 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_3()
const {
return m_map.stride_3(); }
447 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_4()
const {
return m_map.stride_4(); }
448 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_5()
const {
return m_map.stride_5(); }
449 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_6()
const {
return m_map.stride_6(); }
450 KOKKOS_INLINE_FUNCTION constexpr
size_t stride_7()
const {
return m_map.stride_7(); }
455 typedef typename map_type::reference_type reference_type ;
457 enum { reference_type_is_lvalue_reference = std::is_lvalue_reference< reference_type >::value };
459 KOKKOS_INLINE_FUNCTION constexpr
size_t span()
const {
return m_map.span(); }
460 KOKKOS_INLINE_FUNCTION constexpr
bool span_is_contiguous()
const {
return m_map.span_is_contiguous(); }
461 KOKKOS_INLINE_FUNCTION constexpr
typename traits::value_type * data()
const {
return m_map.data(); }
464 KOKKOS_INLINE_FUNCTION constexpr
bool is_contiguous()
const {
return m_map.span_is_contiguous(); }
466 KOKKOS_INLINE_FUNCTION constexpr
typename traits::value_type * ptr_on_device()
const {
return m_map.data(); }
471 KOKKOS_INLINE_FUNCTION
472 const map_type & implementation_map()
const {
return m_map ; }
479 std::conditional< Rank == 0 , reference_type
480 , Kokkos::Experimental::Impl::Error_view_scalar_reference_to_non_scalar_view >::type
481 scalar_operator_reference_type ;
484 std::conditional< Rank == 0 ,
const int
485 , Kokkos::Experimental::Impl::Error_view_scalar_reference_to_non_scalar_view >::type
486 scalar_operator_index_type ;
492 KOKKOS_FORCEINLINE_FUNCTION
493 scalar_operator_reference_type operator()()
const 495 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, 0, 0, 0, 0, 0, 0, 0, 0 );
496 return scalar_operator_reference_type( m_map.reference() );
499 KOKKOS_FORCEINLINE_FUNCTION
501 operator()( scalar_operator_index_type i0
502 ,
const int i1 = 0 ,
const int i2 = 0 ,
const int i3 = 0
503 ,
const int i4 = 0 ,
const int i5 = 0 ,
const int i6 = 0 ,
const int i7 = 0 )
const 505 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
506 return m_map.reference();
511 template<
typename I0 >
512 KOKKOS_FORCEINLINE_FUNCTION
513 typename std::enable_if<( Rank == 1 && std::is_integral<I0>::value
514 ), reference_type >::type
515 operator[](
const I0 & i0 )
const 517 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, 0, 0, 0, 0, 0, 0, 0 );
518 return m_map.reference(i0);
521 template<
typename I0 >
522 KOKKOS_FORCEINLINE_FUNCTION
523 typename std::enable_if<( Rank == 1 && std::is_integral<I0>::value
524 ), reference_type >::type
525 operator()(
const I0 & i0 )
const 527 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, 0, 0, 0, 0, 0, 0, 0 );
528 return m_map.reference(i0);
531 template<
typename I0 >
532 KOKKOS_FORCEINLINE_FUNCTION
534 operator()(
const I0 & i0
535 ,
typename std::enable_if<( Rank == 1 && std::is_integral<I0>::value ),
const int >::type i1
536 ,
const int i2 = 0 ,
const int i3 = 0
537 ,
const int i4 = 0 ,
const int i5 = 0 ,
const int i6 = 0 ,
const int i7 = 0 )
const 539 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
540 return m_map.reference(i0);
545 template<
typename I0 ,
typename I1 >
546 KOKKOS_FORCEINLINE_FUNCTION
547 typename std::enable_if<( Rank == 2 &&
548 std::is_integral<I0>::value &&
549 std::is_integral<I1>::value
550 ), reference_type >::type
551 operator()(
const I0 & i0 ,
const I1 & i1 )
const 553 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, 0, 0, 0, 0, 0, 0 );
554 return m_map.reference(i0,i1);
557 template<
typename I0 ,
typename I1 >
558 KOKKOS_FORCEINLINE_FUNCTION
560 operator()(
const I0 & i0 ,
const I1 & i1
561 ,
typename std::enable_if<( Rank == 2 &&
562 std::is_integral<I0>::value &&
563 std::is_integral<I1>::value
564 ),
const int >::type i2
566 ,
const int i4 = 0 ,
const int i5 = 0 ,
const int i6 = 0 ,
const int i7 = 0 )
const 568 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
569 return m_map.reference(i0,i1);
574 template<
typename I0 ,
typename I1 ,
typename I2 >
575 KOKKOS_FORCEINLINE_FUNCTION
576 typename std::enable_if<( Rank == 3 &&
577 std::is_integral<I0>::value &&
578 std::is_integral<I1>::value &&
579 std::is_integral<I2>::value
580 ), reference_type >::type
581 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 )
const 583 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, 0, 0, 0, 0, 0 );
584 return m_map.reference(i0,i1,i2);
587 template<
typename I0 ,
typename I1 ,
typename I2 >
588 KOKKOS_FORCEINLINE_FUNCTION
590 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2
591 ,
typename std::enable_if<( Rank == 3 &&
592 std::is_integral<I0>::value &&
593 std::is_integral<I1>::value &&
594 std::is_integral<I2>::value
595 ),
const int >::type i3
596 ,
const int i4 = 0 ,
const int i5 = 0 ,
const int i6 = 0 ,
const int i7 = 0 )
const 598 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
599 return m_map.reference(i0,i1,i2);
604 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3 >
605 KOKKOS_FORCEINLINE_FUNCTION
606 typename std::enable_if<( Rank == 4 &&
607 std::is_integral<I0>::value &&
608 std::is_integral<I1>::value &&
609 std::is_integral<I2>::value &&
610 std::is_integral<I3>::value
611 ), reference_type >::type
612 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3 )
const 614 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, 0, 0, 0, 0 );
615 return m_map.reference(i0,i1,i2,i3);
618 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3 >
619 KOKKOS_FORCEINLINE_FUNCTION
621 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
622 ,
typename std::enable_if<( Rank == 4 &&
623 std::is_integral<I0>::value &&
624 std::is_integral<I1>::value &&
625 std::is_integral<I2>::value &&
626 std::is_integral<I3>::value
627 ),
const int >::type i4
628 ,
const int i5 = 0 ,
const int i6 = 0 ,
const int i7 = 0 )
const 630 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
631 return m_map.reference(i0,i1,i2,i3);
636 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
638 KOKKOS_FORCEINLINE_FUNCTION
639 typename std::enable_if<( Rank == 5 &&
640 std::is_integral<I0>::value &&
641 std::is_integral<I1>::value &&
642 std::is_integral<I2>::value &&
643 std::is_integral<I3>::value &&
644 std::is_integral<I4>::value
645 ), reference_type >::type
646 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
647 ,
const I4 & i4 )
const 649 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, 0, 0, 0 );
650 return m_map.reference(i0,i1,i2,i3,i4);
653 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
655 KOKKOS_FORCEINLINE_FUNCTION
657 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
659 ,
typename std::enable_if<( Rank == 5 &&
660 std::is_integral<I0>::value &&
661 std::is_integral<I1>::value &&
662 std::is_integral<I2>::value &&
663 std::is_integral<I3>::value &&
664 std::is_integral<I4>::value
665 ),
const int >::type i5
666 ,
const int i6 = 0 ,
const int i7 = 0 )
const 668 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
669 return m_map.reference(i0,i1,i2,i3,i4);
674 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
675 ,
typename I4 ,
typename I5 >
676 KOKKOS_FORCEINLINE_FUNCTION
677 typename std::enable_if<( Rank == 6 &&
678 std::is_integral<I0>::value &&
679 std::is_integral<I1>::value &&
680 std::is_integral<I2>::value &&
681 std::is_integral<I3>::value &&
682 std::is_integral<I4>::value &&
683 std::is_integral<I5>::value
684 ), reference_type >::type
685 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
686 ,
const I4 & i4 ,
const I5 & i5 )
const 688 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, 0, 0 );
689 return m_map.reference(i0,i1,i2,i3,i4,i5);
692 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
693 ,
typename I4 ,
typename I5 >
694 KOKKOS_FORCEINLINE_FUNCTION
696 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
697 ,
const I4 & i4 ,
const I5 & i5
698 ,
typename std::enable_if<( Rank == 6 &&
699 std::is_integral<I0>::value &&
700 std::is_integral<I1>::value &&
701 std::is_integral<I2>::value &&
702 std::is_integral<I3>::value &&
703 std::is_integral<I4>::value
704 ),
const int >::type i6
705 ,
const int i7 = 0 )
const 707 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
708 return m_map.reference(i0,i1,i2,i3,i4,i5);
713 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
714 ,
typename I4 ,
typename I5 ,
typename I6 >
715 KOKKOS_FORCEINLINE_FUNCTION
716 typename std::enable_if<( Rank == 7 &&
717 std::is_integral<I0>::value &&
718 std::is_integral<I1>::value &&
719 std::is_integral<I2>::value &&
720 std::is_integral<I3>::value &&
721 std::is_integral<I4>::value &&
722 std::is_integral<I5>::value &&
723 std::is_integral<I6>::value
724 ), reference_type >::type
725 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
726 ,
const I4 & i4 ,
const I5 & i5 ,
const I6 & i6 )
const 728 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, 0 );
729 return m_map.reference(i0,i1,i2,i3,i4,i5,i6);
732 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
733 ,
typename I4 ,
typename I5 ,
typename I6 >
734 KOKKOS_FORCEINLINE_FUNCTION
736 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
737 ,
const I4 & i4 ,
const I5 & i5 ,
const I6 & i6
738 ,
typename std::enable_if<( Rank == 7 &&
739 std::is_integral<I0>::value &&
740 std::is_integral<I1>::value &&
741 std::is_integral<I2>::value &&
742 std::is_integral<I3>::value &&
743 std::is_integral<I4>::value
744 ),
const int >::type i7
747 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
748 return m_map.reference(i0,i1,i2,i3,i4,i5,i6);
753 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
754 ,
typename I4 ,
typename I5 ,
typename I6 ,
typename I7 >
755 KOKKOS_FORCEINLINE_FUNCTION
756 typename std::enable_if<( Rank == 8 &&
757 std::is_integral<I0>::value &&
758 std::is_integral<I1>::value &&
759 std::is_integral<I2>::value &&
760 std::is_integral<I3>::value &&
761 std::is_integral<I4>::value &&
762 std::is_integral<I5>::value &&
763 std::is_integral<I6>::value &&
764 std::is_integral<I7>::value
765 ), reference_type >::type
766 operator()(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
767 ,
const I4 & i4 ,
const I5 & i5 ,
const I6 & i6 ,
const I7 & i7 )
const 769 KOKKOS_ASSERT_VIEW_MAPPING_ACCESS(
typename traits::memory_space, m_map, Rank, i0, i1, i2, i3, i4, i5, i6, i7 );
770 return m_map.reference(i0,i1,i2,i3,i4,i5,i6,i7);
775 KOKKOS_INLINE_FUNCTION
778 KOKKOS_INLINE_FUNCTION
779 View() : m_track(), m_map() {}
781 KOKKOS_INLINE_FUNCTION
782 View(
const View & rhs ) : m_track( rhs.m_track ), m_map( rhs.m_map ) {}
784 KOKKOS_INLINE_FUNCTION
785 View( View && rhs ) : m_track( rhs.m_track ), m_map( rhs.m_map ) {}
787 KOKKOS_INLINE_FUNCTION
788 View & operator = (
const View & rhs ) { m_track = rhs.m_track ; m_map = rhs.m_map ;
return *this ; }
790 KOKKOS_INLINE_FUNCTION
791 View & operator = ( View && rhs ) { m_track = rhs.m_track ; m_map = rhs.m_map ;
return *this ; }
795 template<
class RT ,
class R1 ,
class R2 ,
class R3 >
796 KOKKOS_INLINE_FUNCTION
798 : m_track( rhs.m_track )
802 typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits > Mapping ;
803 static_assert( Mapping::is_assignable ,
"Incompatible View copy construction" );
804 Mapping::assign( m_map , rhs.m_map , rhs.m_track );
807 template<
class RT ,
class R1 ,
class R2 ,
class R3 >
808 KOKKOS_INLINE_FUNCTION
810 : m_track( rhs.m_track )
814 typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits > Mapping ;
815 static_assert( Mapping::is_assignable ,
"Incompatible View move construction" );
816 Mapping::assign( m_map , rhs.m_map , rhs.m_track );
819 template<
class RT ,
class R1 ,
class R2 ,
class R3 >
820 KOKKOS_INLINE_FUNCTION
824 typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits > Mapping ;
825 static_assert( Mapping::is_assignable ,
"Incompatible View copy assignment" );
826 Mapping::assign( m_map , rhs.m_map , rhs.m_track );
827 m_track.operator=( rhs.m_track );
831 template<
class RT ,
class R1 ,
class R2 ,
class R3 >
832 KOKKOS_INLINE_FUNCTION
836 typedef Kokkos::Experimental::Impl::ViewMapping< traits , SrcTraits > Mapping ;
837 static_assert( Mapping::is_assignable ,
"Incompatible View move assignment" );
838 Mapping::assign( m_map , rhs.m_map , rhs.m_track );
839 m_track.operator=( rhs.m_track );
849 template<
class ExecSpace >
850 struct DestroyFunctor {
854 void destroy_shared_allocation() { m_map.destroy( m_space ); }
860 const std::string label()
const {
return m_track.template get_label< typename traits::memory_space >(); }
862 template<
class Prop >
864 View(
const Prop & arg_prop
865 ,
const size_t arg_N0 = 0
866 ,
const size_t arg_N1 = 0
867 ,
const size_t arg_N2 = 0
868 ,
const size_t arg_N3 = 0
869 ,
const size_t arg_N4 = 0
870 ,
const size_t arg_N5 = 0
871 ,
const size_t arg_N6 = 0
872 ,
const size_t arg_N7 = 0
878 typedef Kokkos::Experimental::Impl::ViewAllocProp< typename traits::device_type , Prop > alloc_prop ;
880 typedef typename alloc_prop::execution_space execution_space ;
881 typedef typename traits::memory_space memory_space ;
882 typedef DestroyFunctor< execution_space > destroy_functor ;
883 typedef Kokkos::Experimental::Impl::SharedAllocationRecord< memory_space , destroy_functor > record_type ;
885 static_assert( traits::is_managed ,
"View allocation constructor requires managed memory" );
887 const alloc_prop prop( arg_prop );
890 if ( prop.initialize.value && ! prop.execution.is_initialized() ) {
891 Kokkos::Impl::throw_runtime_exception(
"Constructing View and initializing data with uninitialized execution space");
895 const size_t alloc_size = map_type::memory_span( prop.allow_padding
896 , arg_N0 , arg_N1 , arg_N2 , arg_N3
897 , arg_N4 , arg_N5 , arg_N6 , arg_N7 );
900 record_type *
const record = record_type::allocate( prop.memory , prop.label , alloc_size );
904 m_map = map_type( record->data()
906 , arg_N0 , arg_N1 , arg_N2 , arg_N3
907 , arg_N4 , arg_N5 , arg_N6 , arg_N7 );
912 if ( prop.initialize.value ) {
913 m_map.construct( prop.execution );
915 record->m_destroy.m_map = m_map ;
916 record->m_destroy.m_space = prop.execution ;
920 m_track = track_type( record );
923 template<
class Prop >
925 View(
const Prop & arg_prop
926 ,
const typename traits::array_layout & arg_layout
932 typedef Kokkos::Experimental::Impl::ViewAllocProp< typename traits::device_type , Prop > alloc_prop ;
934 typedef typename alloc_prop::execution_space execution_space ;
935 typedef typename traits::memory_space memory_space ;
936 typedef DestroyFunctor< execution_space > destroy_functor ;
937 typedef Kokkos::Experimental::Impl::SharedAllocationRecord< memory_space , destroy_functor > record_type ;
939 static_assert( traits::is_managed ,
"View allocation constructor requires managed memory" );
941 const alloc_prop prop( arg_prop );
944 if ( prop.initialize.value && ! prop.execution.is_initialized() ) {
945 Kokkos::Impl::throw_runtime_exception(
"Constructing View and initializing data with uninitialized execution space");
949 const size_t alloc_size = map_type::memory_span( prop.allow_padding , arg_layout );
952 record_type *
const record = record_type::allocate( prop.memory , prop.label , alloc_size );
956 m_map = map_type( record->data() , prop.allow_padding , arg_layout );
960 if ( prop.initialize.value ) {
961 m_map.construct( prop.execution );
963 record->m_destroy.m_map = m_map ;
964 record->m_destroy.m_space = prop.execution ;
968 m_track = track_type( record );
973 static constexpr
size_t memory_span(
const size_t arg_N0 = 0
974 ,
const size_t arg_N1 = 0
975 ,
const size_t arg_N2 = 0
976 ,
const size_t arg_N3 = 0
977 ,
const size_t arg_N4 = 0
978 ,
const size_t arg_N5 = 0
979 ,
const size_t arg_N6 = 0
980 ,
const size_t arg_N7 = 0
983 return map_type::memory_span( std::integral_constant<bool,false>()
984 , arg_N0 , arg_N1 , arg_N2 , arg_N3
985 , arg_N4 , arg_N5 , arg_N6 , arg_N7 );
989 View(
typename traits::value_type *
const arg_ptr
990 ,
const size_t arg_N0 = 0
991 ,
const size_t arg_N1 = 0
992 ,
const size_t arg_N2 = 0
993 ,
const size_t arg_N3 = 0
994 ,
const size_t arg_N4 = 0
995 ,
const size_t arg_N5 = 0
996 ,
const size_t arg_N6 = 0
997 ,
const size_t arg_N7 = 0
1000 , m_map( arg_ptr , std::integral_constant<bool,false>()
1001 , arg_N0 , arg_N1 , arg_N2 , arg_N3
1002 , arg_N4 , arg_N5 , arg_N6 , arg_N7 )
1006 View(
typename traits::value_type *
const arg_ptr
1007 ,
typename traits::array_layout & arg_layout
1010 , m_map( arg_ptr , std::integral_constant<bool,false>(), arg_layout )
1017 size_t shmem_size(
const size_t arg_N0 = 0 ,
1018 const size_t arg_N1 = 0 ,
1019 const size_t arg_N2 = 0 ,
1020 const size_t arg_N3 = 0 ,
1021 const size_t arg_N4 = 0 ,
1022 const size_t arg_N5 = 0 ,
1023 const size_t arg_N6 = 0 ,
1024 const size_t arg_N7 = 0 )
1026 return map_type::memory_span( std::integral_constant<bool,false>()
1027 , arg_N0 , arg_N1 , arg_N2 , arg_N3
1028 , arg_N4 , arg_N5 , arg_N6 , arg_N7 );
1031 explicit KOKKOS_INLINE_FUNCTION
1032 View(
const typename traits::execution_space::scratch_memory_space & arg_space
1033 ,
const size_t arg_N0 = 0
1034 ,
const size_t arg_N1 = 0
1035 ,
const size_t arg_N2 = 0
1036 ,
const size_t arg_N3 = 0
1037 ,
const size_t arg_N4 = 0
1038 ,
const size_t arg_N5 = 0
1039 ,
const size_t arg_N6 = 0
1040 ,
const size_t arg_N7 = 0 )
1042 , m_map( arg_space.get_shmem( map_type::memory_span( std::integral_constant<bool,false>()
1043 , arg_N0 , arg_N1 , arg_N2 , arg_N3
1044 , arg_N4 , arg_N5 , arg_N6 , arg_N7 ) )
1045 , std::integral_constant<bool,false>()
1046 , arg_N0 , arg_N1 , arg_N2 , arg_N3
1047 , arg_N4 , arg_N5 , arg_N6 , arg_N7 )
1056 KOKKOS_INLINE_FUNCTION
1057 View(
const track_type & arg_track ,
const map_type & arg_map )
1058 : m_track( arg_track )
1062 explicit KOKKOS_INLINE_FUNCTION
1063 View(
const track_type & rhs )
1070 template<
class D ,
class A1 ,
class A2 ,
class A3
1071 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1072 ,
class T4 ,
class T5 ,
class T6 ,
class T7 >
1074 KOKKOS_INLINE_FUNCTION
1075 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1076 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1077 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1078 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1079 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1080 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1081 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1082 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1083 , Kokkos::Experimental::Impl::ViewOffsetRange<T7>::is_range
1086 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1087 , T4
const & arg4 , T5
const & arg5 , T6
const & arg6 , T7
const & arg7
1090 template<
class D ,
class A1 ,
class A2 ,
class A3
1091 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1092 ,
class T4 ,
class T5 ,
class T6 >
1094 KOKKOS_INLINE_FUNCTION
1095 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1096 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1097 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1098 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1099 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1100 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1101 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1102 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1105 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1106 , T4
const & arg4 , T5
const & arg5 , T6
const & arg6
1109 template<
class D ,
class A1 ,
class A2 ,
class A3
1110 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1111 ,
class T4 ,
class T5 >
1113 KOKKOS_INLINE_FUNCTION
1114 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1115 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1116 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1117 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1118 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1119 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1120 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1123 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1124 , T4
const & arg4 , T5
const & arg5
1127 template<
class D ,
class A1 ,
class A2 ,
class A3
1128 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1131 KOKKOS_INLINE_FUNCTION
1132 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1133 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1134 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1135 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1136 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1137 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1140 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1144 template<
class D ,
class A1 ,
class A2 ,
class A3
1145 ,
class T0 ,
class T1 ,
class T2 ,
class T3 >
1147 KOKKOS_INLINE_FUNCTION
1148 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1149 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1150 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1151 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1152 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1155 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1158 template<
class D ,
class A1 ,
class A2 ,
class A3
1159 ,
class T0 ,
class T1 ,
class T2 >
1161 KOKKOS_INLINE_FUNCTION
1162 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1163 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1164 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1165 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1168 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2
1171 template<
class D ,
class A1 ,
class A2 ,
class A3
1172 ,
class T0 ,
class T1 >
1174 KOKKOS_INLINE_FUNCTION
1175 Kokkos::Experimental::Subview< View< D , A1 , A2 , A3 >
1176 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1177 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1180 , T0
const & arg0 , T1
const & arg1
1183 template<
class D,
class A1,
class A2,
class A3,
class T0 >
1185 KOKKOS_INLINE_FUNCTION
1186 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1187 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1193 template<
class >
struct is_view :
public std::false_type {};
1195 template<
class D,
class A1,
class A2,
class A3 >
1196 struct is_view< View<D,A1,A2,A3> > :
public std::true_type {};
1201 template<
class D,
class A1,
class A2,
class A3
1202 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1203 ,
class T4 ,
class T5 ,
class T6 ,
class T7 >
1204 KOKKOS_INLINE_FUNCTION
1205 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1206 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1207 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1208 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1209 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1210 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1211 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1212 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1213 , Kokkos::Experimental::Impl::ViewOffsetRange<T7>::is_range
1216 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1217 , T4
const & arg4 , T5
const & arg5 , T6
const & arg6 , T7
const & arg7
1222 typedef Kokkos::Experimental::Impl::SubviewMapping
1223 <
typename SrcView::traits
1224 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1225 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1226 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1227 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1228 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1229 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1230 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1231 , Kokkos::Experimental::Impl::ViewOffsetRange<T7>::is_range
1234 typedef typename Mapping::type DstView ;
1236 static_assert( SrcView::Rank == 8 ,
"Subview of rank 8 View requires 8 arguments" );
1238 DstView dst( src.m_track );
1240 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 );
1245 template<
class D,
class A1,
class A2,
class A3
1246 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1247 ,
class T4 ,
class T5 ,
class T6 >
1248 KOKKOS_INLINE_FUNCTION
1249 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1250 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1251 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1252 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1253 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1254 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1255 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1256 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1259 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1260 , T4
const & arg4 , T5
const & arg5 , T6
const & arg6
1265 typedef Kokkos::Experimental::Impl::SubviewMapping
1266 <
typename SrcView::traits
1267 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1268 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1269 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1270 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1271 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1272 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1273 , Kokkos::Experimental::Impl::ViewOffsetRange<T6>::is_range
1276 typedef typename Mapping::type DstView ;
1278 static_assert( SrcView::Rank == 7 ,
"Subview of rank 7 View requires 7 arguments" );
1280 DstView dst( src.m_track );
1282 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, arg3, arg4, arg5, arg6, 0 );
1287 template<
class D,
class A1,
class A2,
class A3
1288 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1289 ,
class T4 ,
class T5 >
1290 KOKKOS_INLINE_FUNCTION
1291 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1292 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1293 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1294 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1295 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1296 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1297 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1300 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1301 , T4
const & arg4 , T5
const & arg5
1306 typedef Kokkos::Experimental::Impl::SubviewMapping
1307 <
typename SrcView::traits
1308 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1309 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1310 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1311 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1312 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1313 , Kokkos::Experimental::Impl::ViewOffsetRange<T5>::is_range
1316 typedef typename Mapping::type DstView ;
1318 static_assert( SrcView::Rank == 6 ,
"Subview of rank 6 View requires 6 arguments" );
1320 DstView dst( src.m_track );
1322 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, arg3, arg4, arg5, 0, 0 );
1327 template<
class D,
class A1,
class A2,
class A3
1328 ,
class T0 ,
class T1 ,
class T2 ,
class T3
1330 KOKKOS_INLINE_FUNCTION
1331 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1332 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1333 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1334 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1335 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1336 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1339 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1345 typedef Kokkos::Experimental::Impl::SubviewMapping
1346 <
typename SrcView::traits
1347 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1348 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1349 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1350 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1351 , Kokkos::Experimental::Impl::ViewOffsetRange<T4>::is_range
1354 typedef typename Mapping::type DstView ;
1356 static_assert( SrcView::Rank == 5 ,
"Subview of rank 5 View requires 5 arguments" );
1358 DstView dst( src.m_track );
1360 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, arg3, arg4, 0, 0, 0 );
1365 template<
class D,
class A1,
class A2,
class A3
1366 ,
class T0 ,
class T1 ,
class T2 ,
class T3 >
1367 KOKKOS_INLINE_FUNCTION
1368 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1369 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1370 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1371 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1372 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1375 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2 , T3
const & arg3
1380 typedef Kokkos::Experimental::Impl::SubviewMapping
1381 <
typename SrcView::traits
1382 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1383 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1384 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1385 , Kokkos::Experimental::Impl::ViewOffsetRange<T3>::is_range
1388 typedef typename Mapping::type DstView ;
1390 static_assert( SrcView::Rank == 4 ,
"Subview of rank 4 View requires 4 arguments" );
1392 DstView dst( src.m_track );
1394 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, arg3, 0, 0, 0, 0 );
1399 template<
class D,
class A1,
class A2,
class A3
1400 ,
class T0 ,
class T1 ,
class T2 >
1401 KOKKOS_INLINE_FUNCTION
1402 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1403 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1404 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1405 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1408 , T0
const & arg0 , T1
const & arg1 , T2
const & arg2
1413 typedef Kokkos::Experimental::Impl::SubviewMapping
1414 <
typename SrcView::traits
1415 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1416 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1417 , Kokkos::Experimental::Impl::ViewOffsetRange<T2>::is_range
1420 typedef typename Mapping::type DstView ;
1422 static_assert( SrcView::Rank == 3 ,
"Subview of rank 3 View requires 3 arguments" );
1424 DstView dst( src.m_track );
1426 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, arg2, 0, 0, 0, 0, 0 );
1431 template<
class D,
class A1,
class A2,
class A3
1432 ,
class T0 ,
class T1 >
1433 KOKKOS_INLINE_FUNCTION
1434 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1435 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1436 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1439 , T0
const & arg0 , T1
const & arg1
1444 typedef Kokkos::Experimental::Impl::SubviewMapping
1445 <
typename SrcView::traits
1446 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1447 , Kokkos::Experimental::Impl::ViewOffsetRange<T1>::is_range
1450 typedef typename Mapping::type DstView ;
1452 static_assert( SrcView::Rank == 2 ,
"Subview of rank 2 View requires 2 arguments" );
1454 DstView dst( src.m_track );
1456 Mapping::assign( dst.m_map, src.m_map, arg0, arg1, 0, 0, 0, 0, 0, 0 );
1461 template<
class D,
class A1,
class A2,
class A3,
class T0 >
1462 KOKKOS_INLINE_FUNCTION
1463 Kokkos::Experimental::Subview< View< D, A1, A2, A3 >
1464 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1470 typedef Kokkos::Experimental::Impl::SubviewMapping
1471 <
typename SrcView::traits
1472 , Kokkos::Experimental::Impl::ViewOffsetRange<T0>::is_range
1475 typedef typename Mapping::type DstView ;
1477 static_assert( SrcView::Rank == 1 ,
"Subview of rank 1 View requires 1 arguments" );
1479 DstView dst( src.m_track );
1481 Mapping::assign( dst.m_map , src.m_map , arg0, 0, 0, 0, 0, 0, 0, 0 );
1495 template<
class LT ,
class L1 ,
class L2 ,
class L3
1496 ,
class RT ,
class R1 ,
class R2 ,
class R3 >
1497 KOKKOS_INLINE_FUNCTION
1506 std::is_same<
typename lhs_traits::const_value_type ,
1507 typename rhs_traits::const_value_type >::value &&
1508 std::is_same<
typename lhs_traits::array_layout ,
1509 typename rhs_traits::array_layout >::value &&
1510 std::is_same<
typename lhs_traits::memory_space ,
1511 typename rhs_traits::memory_space >::value &&
1512 lhs_traits::Rank == rhs_traits::Rank &&
1513 lhs.data() == rhs.data() &&
1514 lhs.span() == rhs.span() &&
1515 lhs.dimension_0() == rhs.dimension_0() &&
1516 lhs.dimension_1() == rhs.dimension_1() &&
1517 lhs.dimension_2() == rhs.dimension_2() &&
1518 lhs.dimension_3() == rhs.dimension_3() &&
1519 lhs.dimension_4() == rhs.dimension_4() &&
1520 lhs.dimension_5() == rhs.dimension_5() &&
1521 lhs.dimension_6() == rhs.dimension_6() &&
1522 lhs.dimension_7() == rhs.dimension_7();
1525 template<
class LT ,
class L1 ,
class L2 ,
class L3
1526 ,
class RT ,
class R1 ,
class R2 ,
class R3 >
1527 KOKKOS_INLINE_FUNCTION
1544 template<
class OutputView ,
typename Enable =
void >
1547 typedef typename OutputView::const_value_type const_value_type ;
1549 const OutputView output ;
1550 const_value_type input ;
1552 KOKKOS_INLINE_FUNCTION
1553 void operator()(
const size_t i0 )
const 1555 const size_t n1 = output.dimension_1();
1556 const size_t n2 = output.dimension_2();
1557 const size_t n3 = output.dimension_3();
1558 const size_t n4 = output.dimension_4();
1559 const size_t n5 = output.dimension_5();
1560 const size_t n6 = output.dimension_6();
1561 const size_t n7 = output.dimension_7();
1563 for (
size_t i1 = 0 ; i1 < n1 ; ++i1 ) {
1564 for (
size_t i2 = 0 ; i2 < n2 ; ++i2 ) {
1565 for (
size_t i3 = 0 ; i3 < n3 ; ++i3 ) {
1566 for (
size_t i4 = 0 ; i4 < n4 ; ++i4 ) {
1567 for (
size_t i5 = 0 ; i5 < n5 ; ++i5 ) {
1568 for (
size_t i6 = 0 ; i6 < n6 ; ++i6 ) {
1569 for (
size_t i7 = 0 ; i7 < n7 ; ++i7 ) {
1570 output(i0,i1,i2,i3,i4,i5,i6,i7) = input ;
1574 ViewFill(
const OutputView & arg_out , const_value_type & arg_in )
1575 : output( arg_out ), input( arg_in )
1577 typedef typename OutputView::execution_space execution_space ;
1582 execution_space::fence();
1586 template<
class OutputView >
1587 struct ViewFill< OutputView , typename std::enable_if< OutputView::Rank == 0 >::type > {
1588 ViewFill(
const OutputView & dst ,
const typename OutputView::const_value_type & src )
1590 Kokkos::Impl::DeepCopy< typename OutputView::memory_space , Kokkos::HostSpace >
1591 ( dst.data() , & src ,
sizeof(
typename OutputView::const_value_type) );
1595 template<
class OutputView ,
class InputView >
1598 const OutputView output ;
1599 const InputView input ;
1609 ViewRemap(
const OutputView & arg_out ,
const InputView & arg_in )
1610 : output( arg_out ), input( arg_in )
1611 , n0( std::min( (
size_t)arg_out.dimension_0() , (size_t)arg_in.dimension_0() ) )
1612 , n1( std::min( (
size_t)arg_out.dimension_1() , (size_t)arg_in.dimension_1() ) )
1613 , n2( std::min( (
size_t)arg_out.dimension_2() , (size_t)arg_in.dimension_2() ) )
1614 , n3( std::min( (
size_t)arg_out.dimension_3() , (size_t)arg_in.dimension_3() ) )
1615 , n4( std::min( (
size_t)arg_out.dimension_4() , (size_t)arg_in.dimension_4() ) )
1616 , n5( std::min( (
size_t)arg_out.dimension_5() , (size_t)arg_in.dimension_5() ) )
1617 , n6( std::min( (
size_t)arg_out.dimension_6() , (size_t)arg_in.dimension_6() ) )
1618 , n7( std::min( (
size_t)arg_out.dimension_7() , (size_t)arg_in.dimension_7() ) )
1620 typedef typename OutputView::execution_space execution_space ;
1625 KOKKOS_INLINE_FUNCTION
1626 void operator()(
const size_t i0 )
const 1628 for (
size_t i1 = 0 ; i1 < n1 ; ++i1 ) {
1629 for (
size_t i2 = 0 ; i2 < n2 ; ++i2 ) {
1630 for (
size_t i3 = 0 ; i3 < n3 ; ++i3 ) {
1631 for (
size_t i4 = 0 ; i4 < n4 ; ++i4 ) {
1632 for (
size_t i5 = 0 ; i5 < n5 ; ++i5 ) {
1633 for (
size_t i6 = 0 ; i6 < n6 ; ++i6 ) {
1634 for (
size_t i7 = 0 ; i7 < n7 ; ++i7 ) {
1635 output(i0,i1,i2,i3,i4,i5,i6,i7) = input(i0,i1,i2,i3,i4,i5,i6,i7);
1651 template<
class DT ,
class D1 ,
class D2 ,
class D3 >
1654 ,
typename ViewTraits<DT,D1,D2,D3>::const_value_type & value )
1656 static_assert( std::is_same<
typename ViewTraits<DT,D1,D2,D3>::non_const_value_type ,
1657 typename ViewTraits<DT,D1,D2,D3>::value_type >::value
1658 ,
"ERROR: Incompatible deep_copy( View , value )" );
1660 Kokkos::Experimental::Impl::ViewFill< View<DT,D1,D2,D3> >( dst , value );
1664 template<
class ST ,
class S1 ,
class S2 ,
class S3 >
1669 ,
"ERROR: Non-rank-zero view in deep_copy( value , View )" );
1672 typedef typename src_traits::memory_space src_memory_space ;
1673 Kokkos::Impl::DeepCopy< HostSpace , src_memory_space >( & dst , src.data() ,
sizeof(ST) );
1678 template<
class DT ,
class D1 ,
class D2 ,
class D3
1679 ,
class ST ,
class S1 ,
class S2 ,
class S3 >
1683 typename std::enable_if<(
1688 std::is_same<
typename ViewTraits<DT,D1,D2,D3>::value_type ,
1689 typename ViewTraits<ST,S1,S2,S3>::non_const_value_type >::value
1695 typedef typename dst_type::value_type value_type ;
1696 typedef typename dst_type::memory_space dst_memory_space ;
1697 typedef typename src_type::memory_space src_memory_space ;
1699 if ( dst.data() != src.data() ) {
1700 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() ,
sizeof(value_type) );
1708 template<
class DT ,
class D1 ,
class D2 ,
class D3 ,
1709 class ST ,
class S1 ,
class S2 ,
class S3 >
1713 typename std::enable_if<(
1715 std::is_same<
typename ViewTraits<DT,D1,D2,D3>::value_type ,
1716 typename ViewTraits<DT,D1,D2,D3>::non_const_value_type >::value
1725 std::is_same<
typename ViewTraits<DT,D1,D2,D3>::specialize ,
void >::value
1727 std::is_same<
typename ViewTraits<ST,S1,S2,S3>::specialize ,
void >::value
1733 typedef typename dst_type::execution_space dst_execution_space ;
1734 typedef typename dst_type::memory_space dst_memory_space ;
1735 typedef typename src_type::memory_space src_memory_space ;
1737 enum { DstExecCanAccessSrc =
1738 Kokkos::Impl::VerifyExecutionCanAccessMemorySpace< typename dst_execution_space::memory_space , src_memory_space >::value };
1740 if ( (
void *) dst.data() != (
void*) src.data() ) {
1747 if ( std::is_same<
typename ViewTraits<DT,D1,D2,D3>::value_type ,
1748 typename ViewTraits<ST,S1,S2,S3>::non_const_value_type >::value &&
1749 std::is_same<
typename ViewTraits<DT,D1,D2,D3>::array_layout ,
1750 typename ViewTraits<ST,S1,S2,S3>::array_layout >::value &&
1751 dst.span_is_contiguous() &&
1752 src.span_is_contiguous() &&
1753 dst.span() == src.span() &&
1754 dst.dimension_0() == src.dimension_0() &&
1755 dst.dimension_1() == src.dimension_1() &&
1756 dst.dimension_2() == src.dimension_2() &&
1757 dst.dimension_3() == src.dimension_3() &&
1758 dst.dimension_4() == src.dimension_4() &&
1759 dst.dimension_5() == src.dimension_5() &&
1760 dst.dimension_6() == src.dimension_6() &&
1761 dst.dimension_7() == src.dimension_7() ) {
1763 const size_t nbytes =
sizeof(
typename dst_type::value_type) * dst.span();
1765 Kokkos::Impl::DeepCopy< dst_memory_space , src_memory_space >( dst.data() , src.data() , nbytes );
1767 else if ( DstExecCanAccessSrc ) {
1769 Kokkos::Experimental::Impl::ViewRemap< dst_type , src_type >( dst , src );
1772 Kokkos::Impl::throw_runtime_exception(
"deep_copy given views that would require a temporary allocation");
1786 template<
class T ,
class A1,
class A2,
class A3 >
1790 ,
typename std::enable_if<
1791 ! std::is_same<
typename Kokkos::Experimental::ViewTraits<T,A1,A2,A3>::array_layout
1797 typedef typename src_type::HostMirror dst_type ;
1799 return dst_type( std::string( src.label() ).append(
"_mirror")
1807 , src.dimension_7() );
1810 template<
class T ,
class A1,
class A2,
class A3 >
1814 ,
typename std::enable_if<
1815 std::is_same<
typename Kokkos::Experimental::ViewTraits<T,A1,A2,A3>::array_layout
1821 typedef typename src_type::HostMirror dst_type ;
1825 layout.dimension[0] = src.dimension_0();
1826 layout.dimension[1] = src.dimension_1();
1827 layout.dimension[2] = src.dimension_2();
1828 layout.dimension[3] = src.dimension_3();
1829 layout.dimension[4] = src.dimension_4();
1830 layout.dimension[5] = src.dimension_5();
1831 layout.dimension[6] = src.dimension_6();
1832 layout.dimension[7] = src.dimension_7();
1834 layout.stride[0] = src.stride_0();
1835 layout.stride[1] = src.stride_1();
1836 layout.stride[2] = src.stride_2();
1837 layout.stride[3] = src.stride_3();
1838 layout.stride[4] = src.stride_4();
1839 layout.stride[5] = src.stride_5();
1840 layout.stride[6] = src.stride_6();
1841 layout.stride[7] = src.stride_7();
1843 return dst_type( std::string( src.label() ).append(
"_mirror") , layout );
1846 template<
class T ,
class A1 ,
class A2 ,
class A3 >
1850 ,
typename std::enable_if<(
1851 std::is_same<
typename Kokkos::Experimental::View<T,A1,A2,A3>::memory_space
1852 ,
typename Kokkos::Experimental::View<T,A1,A2,A3>::HostMirror::memory_space
1855 std::is_same<
typename Kokkos::Experimental::View<T,A1,A2,A3>::data_type
1856 ,
typename Kokkos::Experimental::View<T,A1,A2,A3>::HostMirror::data_type
1864 template<
class T ,
class A1 ,
class A2 ,
class A3 >
1868 ,
typename std::enable_if< ! (
1869 std::is_same<
typename Kokkos::Experimental::View<T,A1,A2,A3>::memory_space
1870 ,
typename Kokkos::Experimental::View<T,A1,A2,A3>::HostMirror::memory_space
1873 std::is_same<
typename Kokkos::Experimental::View<T,A1,A2,A3>::data_type
1874 ,
typename Kokkos::Experimental::View<T,A1,A2,A3>::HostMirror::data_type
1879 return Kokkos::Experimental::create_mirror( src );
1892 template<
class T ,
class A1 ,
class A2 ,
class A3 >
1895 const size_t n0 = 0 ,
1896 const size_t n1 = 0 ,
1897 const size_t n2 = 0 ,
1898 const size_t n3 = 0 ,
1899 const size_t n4 = 0 ,
1900 const size_t n5 = 0 ,
1901 const size_t n6 = 0 ,
1902 const size_t n7 = 0 )
1908 view_type v_resized( v.label(), n0, n1, n2, n3, n4, n5, n6, n7 );
1910 Kokkos::Experimental::Impl::ViewRemap< view_type , view_type >( v_resized , v );
1916 template<
class T ,
class A1 ,
class A2 ,
class A3 >
1919 const size_t n0 = 0 ,
1920 const size_t n1 = 0 ,
1921 const size_t n2 = 0 ,
1922 const size_t n3 = 0 ,
1923 const size_t n4 = 0 ,
1924 const size_t n5 = 0 ,
1925 const size_t n6 = 0 ,
1926 const size_t n7 = 0 )
1932 const std::string label = v.label();
1935 v = view_type( label, n0, n1, n2, n3, n4, n5, n6, n7 );
1944 #if defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 1948 template<
class D ,
class A1 =
void ,
class A2 =
void ,
class A3 =
void >
1951 template<
class D ,
class A1 =
void ,
class A2 =
void ,
class A3 =
void ,
class S =
void >
1954 using Kokkos::Experimental::deep_copy ;
1955 using Kokkos::Experimental::create_mirror ;
1956 using Kokkos::Experimental::create_mirror_view ;
1957 using Kokkos::Experimental::subview ;
1958 using Kokkos::Experimental::resize ;
1959 using Kokkos::Experimental::realloc ;
1963 using Kokkos::Experimental::is_view ;
1965 class ViewDefault {};
1967 template<
class SrcViewType
1977 struct ViewSubview ;
1983 #include <impl/Kokkos_Atomic_View.hpp>
View< typename traits::const_data_type, typename traits::array_layout, typename traits::device_type, typename traits::memory_traits > const_type
Compatible view of const data type.
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.
View< typename traits::non_const_data_type, typename traits::array_layout, typename traits::host_mirror_space, void > HostMirror
Compatible HostMirror view.
KOKKOS_INLINE_FUNCTION bool operator!=(const complex< RealType > &x, const complex< RealType > &y)
Inequality operator for two complex numbers.
View< typename traits::non_const_data_type, typename traits::array_layout, typename traits::device_type, typename traits::memory_traits > non_const_type
Compatible view of non-const data type.
View< typename traits::array_scalar_type, typename traits::array_layout, typename traits::device_type, typename traits::memory_traits > array_type
Compatible view of array of scalar types.
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory...
Traits class for accessing attributes of a View.
Memory space for main process and CPU execution spaces.
Implementation of the ParallelFor operator that has a partial specialization for the device...
KOKKOS_INLINE_FUNCTION bool operator==(const complex< RealType > &x, const complex< RealType > &y)
Equality operator for two complex numbers.
Execution policy for work over a range of an integral type.
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.
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.
View to an array of data.