50 #ifndef KOKKOS_DUALVIEW_HPP 51 #define KOKKOS_DUALVIEW_HPP 53 #include <Kokkos_Core.hpp> 54 #include <impl/Kokkos_Error.hpp> 93 template<
class DataType ,
94 class Arg1Type = void ,
95 class Arg2Type = void ,
96 class Arg3Type =
void>
97 class DualView :
public ViewTraits< DataType , Arg1Type , Arg2Type, Arg3Type >
102 typedef ViewTraits< DataType , Arg1Type , Arg2Type, Arg3Type > traits ;
105 typedef typename traits::host_mirror_space host_mirror_space ;
108 typedef View<
typename traits::data_type ,
115 typedef typename t_dev::HostMirror t_host ;
119 typedef View<
typename traits::const_data_type ,
122 Arg3Type > t_dev_const ;
126 typedef typename t_dev_const::HostMirror t_host_const;
129 typedef View<
typename traits::const_data_type ,
130 typename traits::array_layout ,
131 typename traits::device_type ,
132 MemoryRandomAccess > t_dev_const_randomread ;
137 typedef typename t_dev_const_randomread::HostMirror t_host_const_randomread;
140 typedef View<
typename traits::data_type ,
141 typename traits::array_layout ,
142 typename traits::device_type ,
143 MemoryUnmanaged> t_dev_um;
146 typedef View<
typename t_host::data_type ,
147 typename t_host::array_layout ,
148 typename t_host::device_type ,
149 MemoryUnmanaged> t_host_um;
152 typedef View<
typename traits::const_data_type ,
153 typename traits::array_layout ,
154 typename traits::device_type ,
155 MemoryUnmanaged> t_dev_const_um;
158 typedef View<
typename t_host::const_data_type,
159 typename t_host::array_layout,
160 typename t_host::device_type,
161 MemoryUnmanaged> t_host_const_um;
174 View<unsigned int,LayoutLeft,typename t_host::execution_space> modified_device;
175 View<unsigned int,LayoutLeft,typename t_host::execution_space> modified_host;
187 modified_device (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_device")),
188 modified_host (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_host"))
200 DualView (
const std::string& label,
209 : d_view (label, n0, n1, n2, n3, n4, n5, n6, n7)
210 , h_view (create_mirror_view (d_view))
211 , modified_device (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_device"))
212 , modified_host (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_host"))
216 template<
class SS,
class LS,
class DS,
class MS>
217 DualView (
const DualView<SS,LS,DS,MS>& src) :
220 modified_device (src.modified_device),
221 modified_host (src.modified_host)
225 template<
class SD,
class S1 ,
class S2 ,
class S3
226 ,
class Arg0 ,
class ... Args >
227 DualView(
const DualView<SD,S1,S2,S3> & src
231 : d_view(
Kokkos::subview( src.d_view , arg0 , args ... ) )
232 , h_view(
Kokkos::subview( src.h_view , arg0 , args ... ) )
233 , modified_device (src.modified_device)
234 , modified_host (src.modified_host)
247 DualView (
const t_dev& d_view_,
const t_host& h_view_) :
250 modified_device (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_device")),
251 modified_host (View<unsigned int,LayoutLeft,typename t_host::execution_space> (
"DualView::modified_host"))
253 #if ! defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 254 Impl::assert_shapes_are_equal (d_view.shape (), h_view.shape ());
256 if ( d_view.rank != h_view.rank ||
257 d_view.dimension_0() != h_view.dimension_0() ||
258 d_view.dimension_1() != h_view.dimension_1() ||
259 d_view.dimension_2() != h_view.dimension_2() ||
260 d_view.dimension_3() != h_view.dimension_3() ||
261 d_view.dimension_4() != h_view.dimension_4() ||
262 d_view.dimension_5() != h_view.dimension_5() ||
263 d_view.dimension_6() != h_view.dimension_6() ||
264 d_view.dimension_7() != h_view.dimension_7() ||
265 d_view.stride_0() != h_view.stride_0() ||
266 d_view.stride_1() != h_view.stride_1() ||
267 d_view.stride_2() != h_view.stride_2() ||
268 d_view.stride_3() != h_view.stride_3() ||
269 d_view.stride_4() != h_view.stride_4() ||
270 d_view.stride_5() != h_view.stride_5() ||
271 d_view.stride_6() != h_view.stride_6() ||
272 d_view.stride_7() != h_view.stride_7() ||
273 d_view.span() != h_view.span() ) {
274 Kokkos::Impl::throw_runtime_exception(
"DualView constructed with incompatible views");
304 template<
class Device >
305 KOKKOS_INLINE_FUNCTION
306 const typename Impl::if_c<
307 Impl::is_same<
typename t_dev::memory_space,
308 typename Device::memory_space>::value,
310 t_host>::type& view ()
const 314 typename t_dev::memory_space,
315 typename Device::memory_space>::value,
317 t_host >::select (d_view , h_view);
337 template<
class Device>
338 void sync(
const typename Impl::enable_if<
339 ( Impl::is_same< typename traits::data_type , typename traits::non_const_data_type>::value) ||
340 ( Impl::is_same< Device , int>::value)
343 const unsigned int dev =
346 typename t_dev::memory_space,
347 typename Device::memory_space>::value ,
349 unsigned int>::select (1, 0);
352 if ((modified_host () > 0) && (modified_host () >= modified_device ())) {
354 modified_host() = modified_device() = 0;
357 if ((modified_device () > 0) && (modified_device () >= modified_host ())) {
359 modified_host() = modified_device() = 0;
362 if(Impl::is_same<typename t_host::memory_space,typename t_dev::memory_space>::value) {
363 t_dev::execution_space::fence();
364 t_host::execution_space::fence();
368 template<
class Device>
369 void sync (
const typename Impl::enable_if<
370 ( ! Impl::is_same< typename traits::data_type , typename traits::non_const_data_type>::value ) ||
371 ( Impl::is_same< Device , int>::value)
374 const unsigned int dev =
377 typename t_dev::memory_space,
378 typename Device::memory_space>::value,
380 unsigned int>::select (1, 0);
382 if ((modified_host () > 0) && (modified_host () >= modified_device ())) {
383 Impl::throw_runtime_exception(
"Calling sync on a DualView with a const datatype.");
386 if ((modified_device () > 0) && (modified_device () >= modified_host ())) {
387 Impl::throw_runtime_exception(
"Calling sync on a DualView with a const datatype.");
392 template<
class Device>
395 const unsigned int dev =
398 typename t_dev::memory_space,
399 typename Device::memory_space>::value ,
401 unsigned int>::select (1, 0);
404 if ((modified_host () > 0) && (modified_host () >= modified_device ())) {
408 if ((modified_device () > 0) && (modified_device () >= modified_host ())) {
419 template<
class Device>
421 const unsigned int dev =
424 typename t_dev::memory_space,
425 typename Device::memory_space>::value,
427 unsigned int>::select (1, 0);
431 modified_device () = (modified_device () > modified_host () ?
432 modified_device () : modified_host ()) + 1;
435 modified_host () = (modified_device () > modified_host () ?
436 modified_device () : modified_host ()) + 1;
449 void realloc(
const size_t n0 = 0 ,
450 const size_t n1 = 0 ,
451 const size_t n2 = 0 ,
452 const size_t n3 = 0 ,
453 const size_t n4 = 0 ,
454 const size_t n5 = 0 ,
455 const size_t n6 = 0 ,
456 const size_t n7 = 0 ) {
457 ::Kokkos::realloc(d_view,n0,n1,n2,n3,n4,n5,n6,n7);
458 h_view = create_mirror_view( d_view );
461 modified_device() = modified_host() = 0;
468 void resize(
const size_t n0 = 0 ,
469 const size_t n1 = 0 ,
470 const size_t n2 = 0 ,
471 const size_t n3 = 0 ,
472 const size_t n4 = 0 ,
473 const size_t n5 = 0 ,
474 const size_t n6 = 0 ,
475 const size_t n7 = 0 ) {
476 if(modified_device() >= modified_host()) {
478 ::Kokkos::resize(d_view,n0,n1,n2,n3,n4,n5,n6,n7);
479 h_view = create_mirror_view( d_view );
482 modified_device() = modified_device()+1;
487 ::Kokkos::realloc(d_view,n0,n1,n2,n3,n4,n5,n6,n7);
488 t_host temp_view = create_mirror_view( d_view );
496 modified_host() = modified_host()+1;
505 size_t capacity()
const {
506 #if defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 507 return d_view.span();
509 return d_view.capacity();
514 template<
typename iType>
515 void stride(iType* stride_)
const {
516 d_view.stride(stride_);
520 size_t dimension_0()
const {
return d_view.dimension_0();}
522 size_t dimension_1()
const {
return d_view.dimension_1();}
524 size_t dimension_2()
const {
return d_view.dimension_2();}
526 size_t dimension_3()
const {
return d_view.dimension_3();}
528 size_t dimension_4()
const {
return d_view.dimension_4();}
530 size_t dimension_5()
const {
return d_view.dimension_5();}
532 size_t dimension_6()
const {
return d_view.dimension_6();}
534 size_t dimension_7()
const {
return d_view.dimension_7();}
547 #if defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 552 template<
class D,
class A1,
class A2,
class A3,
class ... Args >
553 struct DualViewSubview {
555 typedef typename Kokkos::Experimental::Impl::ViewMapping
559 >::traits_type dst_traits ;
561 typedef Kokkos::DualView
562 <
typename dst_traits::data_type
563 ,
typename dst_traits::array_layout
564 ,
typename dst_traits::device_type
565 ,
typename dst_traits::memory_traits
572 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
class ... Args >
573 typename Impl::DualViewSubview<D,A1,A2,A3,Args...>::type
574 subview(
const DualView<D,A1,A2,A3> & src , Args ... args )
577 Impl::DualViewSubview<D,A1,A2,A3,Args...>::type( src , args ... );
593 template<
class SrcDataType ,
class SrcArg1Type ,
class SrcArg2Type ,
class SrcArg3Type
594 ,
class SubArg0_type ,
class SubArg1_type ,
class SubArg2_type ,
class SubArg3_type
595 ,
class SubArg4_type ,
class SubArg5_type ,
class SubArg6_type ,
class SubArg7_type
597 struct ViewSubview< DualView< SrcDataType , SrcArg1Type , SrcArg2Type , SrcArg3Type >
598 , SubArg0_type , SubArg1_type , SubArg2_type , SubArg3_type
599 , SubArg4_type , SubArg5_type , SubArg6_type , SubArg7_type >
603 typedef DualView< SrcDataType , SrcArg1Type , SrcArg2Type , SrcArg3Type > SrcViewType ;
605 enum { V0 = Impl::is_same< SubArg0_type , void >::value ? 1 : 0 };
606 enum { V1 = Impl::is_same< SubArg1_type , void >::value ? 1 : 0 };
607 enum { V2 = Impl::is_same< SubArg2_type , void >::value ? 1 : 0 };
608 enum { V3 = Impl::is_same< SubArg3_type , void >::value ? 1 : 0 };
609 enum { V4 = Impl::is_same< SubArg4_type , void >::value ? 1 : 0 };
610 enum { V5 = Impl::is_same< SubArg5_type , void >::value ? 1 : 0 };
611 enum { V6 = Impl::is_same< SubArg6_type , void >::value ? 1 : 0 };
612 enum { V7 = Impl::is_same< SubArg7_type , void >::value ? 1 : 0 };
617 Impl::StaticAssert<( SrcViewType::rank ==
625 V7 ? 7 : 8 ))))))) ))
627 ( SrcViewType::rank ==
628 ( 8 - ( V0 + V1 + V2 + V3 + V4 + V5 + V6 + V7 ) ) )
629 >::value ? SrcViewType::rank : 0 };
631 enum { R0 = Impl::ViewOffsetRange< SubArg0_type >::is_range ? 1 : 0 };
632 enum { R1 = Impl::ViewOffsetRange< SubArg1_type >::is_range ? 1 : 0 };
633 enum { R2 = Impl::ViewOffsetRange< SubArg2_type >::is_range ? 1 : 0 };
634 enum { R3 = Impl::ViewOffsetRange< SubArg3_type >::is_range ? 1 : 0 };
635 enum { R4 = Impl::ViewOffsetRange< SubArg4_type >::is_range ? 1 : 0 };
636 enum { R5 = Impl::ViewOffsetRange< SubArg5_type >::is_range ? 1 : 0 };
637 enum { R6 = Impl::ViewOffsetRange< SubArg6_type >::is_range ? 1 : 0 };
638 enum { R7 = Impl::ViewOffsetRange< SubArg7_type >::is_range ? 1 : 0 };
640 enum { OutputRank = unsigned(R0) + unsigned(R1) + unsigned(R2) + unsigned(R3)
641 + unsigned(R4) + unsigned(R5) + unsigned(R6) + unsigned(R7) };
644 enum { R0_rev = 0 == InputRank ? 0u : (
645 1 == InputRank ? unsigned(R0) : (
646 2 == InputRank ? unsigned(R1) : (
647 3 == InputRank ? unsigned(R2) : (
648 4 == InputRank ? unsigned(R3) : (
649 5 == InputRank ? unsigned(R4) : (
650 6 == InputRank ? unsigned(R5) : (
651 7 == InputRank ? unsigned(R6) : unsigned(R7) ))))))) };
653 typedef typename SrcViewType::array_layout SrcViewLayout ;
656 typedef typename Impl::if_c<
663 ( OutputRank <= 2 && R0 && Impl::is_same<SrcViewLayout,LayoutLeft>::value )
667 ( OutputRank <= 2 && R0_rev && Impl::is_same<SrcViewLayout,LayoutRight>::value )
671 typedef typename Impl::if_c< OutputRank == 0 ,
typename SrcViewType::value_type ,
672 typename Impl::if_c< OutputRank == 1 ,
typename SrcViewType::value_type *,
673 typename Impl::if_c< OutputRank == 2 ,
typename SrcViewType::value_type **,
674 typename Impl::if_c< OutputRank == 3 ,
typename SrcViewType::value_type ***,
675 typename Impl::if_c< OutputRank == 4 ,
typename SrcViewType::value_type ****,
676 typename Impl::if_c< OutputRank == 5 ,
typename SrcViewType::value_type *****,
677 typename Impl::if_c< OutputRank == 6 ,
typename SrcViewType::value_type ******,
678 typename Impl::if_c< OutputRank == 7 ,
typename SrcViewType::value_type *******,
679 typename SrcViewType::value_type ********
680 >::type >::type >::type >::type >::type >::type >::type >::type OutputData ;
686 typedef typename Impl::if_c< Impl::is_space< SrcArg1Type >::value , SrcArg1Type ,
687 typename Impl::if_c< Impl::is_space< SrcArg2Type >::value , SrcArg2Type ,
typename SrcViewType::execution_space
688 >::type >::type OutputSpace ;
695 Impl::if_c< Impl::is_same< SrcViewLayout , OutputViewLayout >::value
696 , Kokkos::DualView< OutputData , SrcArg1Type , SrcArg2Type , SrcArg3Type >
697 , Kokkos::DualView< OutputData , OutputViewLayout , OutputSpace
698 ,
typename SrcViewType::memory_traits >
707 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
709 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
710 , ArgType0 , void , void , void
711 , void , void , void ,
void 713 subview(
const DualView<D,A1,A2,A3> & src ,
714 const ArgType0 & arg0 )
717 Impl::ViewSubview< DualView<D,A1,A2,A3>
718 , ArgType0 , void , void , void
719 , void , void , void ,
void 722 DstViewType sub_view;
723 sub_view.d_view = subview(src.d_view,arg0);
724 sub_view.h_view = subview(src.h_view,arg0);
725 sub_view.modified_device = src.modified_device;
726 sub_view.modified_host = src.modified_host;
731 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
732 class ArgType0 ,
class ArgType1 >
733 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
734 , ArgType0 , ArgType1 , void , void
735 , void , void , void ,
void 737 subview(
const DualView<D,A1,A2,A3> & src ,
738 const ArgType0 & arg0 ,
739 const ArgType1 & arg1 )
742 Impl::ViewSubview< DualView<D,A1,A2,A3>
743 , ArgType0 , ArgType1 , void , void
744 , void , void , void ,
void 747 DstViewType sub_view;
748 sub_view.d_view = subview(src.d_view,arg0,arg1);
749 sub_view.h_view = subview(src.h_view,arg0,arg1);
750 sub_view.modified_device = src.modified_device;
751 sub_view.modified_host = src.modified_host;
755 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
756 class ArgType0 ,
class ArgType1 ,
class ArgType2 >
757 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
758 , ArgType0 , ArgType1 , ArgType2 , void
759 , void , void , void ,
void 761 subview(
const DualView<D,A1,A2,A3> & src ,
762 const ArgType0 & arg0 ,
763 const ArgType1 & arg1 ,
764 const ArgType2 & arg2 )
767 Impl::ViewSubview< DualView<D,A1,A2,A3>
768 , ArgType0 , ArgType1 , ArgType2 , void
769 , void , void , void ,
void 772 DstViewType sub_view;
773 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2);
774 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2);
775 sub_view.modified_device = src.modified_device;
776 sub_view.modified_host = src.modified_host;
780 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
781 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 >
782 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
783 , ArgType0 , ArgType1 , ArgType2 , ArgType3
784 , void , void , void ,
void 786 subview(
const DualView<D,A1,A2,A3> & src ,
787 const ArgType0 & arg0 ,
788 const ArgType1 & arg1 ,
789 const ArgType2 & arg2 ,
790 const ArgType3 & arg3 )
793 Impl::ViewSubview< DualView<D,A1,A2,A3>
794 , ArgType0 , ArgType1 , ArgType2 , ArgType3
795 , void , void , void ,
void 798 DstViewType sub_view;
799 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2,arg3);
800 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2,arg3);
801 sub_view.modified_device = src.modified_device;
802 sub_view.modified_host = src.modified_host;
806 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
807 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
809 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
810 , ArgType0 , ArgType1 , ArgType2 , ArgType3
811 , ArgType4 , void , void ,
void 813 subview(
const DualView<D,A1,A2,A3> & src ,
814 const ArgType0 & arg0 ,
815 const ArgType1 & arg1 ,
816 const ArgType2 & arg2 ,
817 const ArgType3 & arg3 ,
818 const ArgType4 & arg4 )
821 Impl::ViewSubview< DualView<D,A1,A2,A3>
822 , ArgType0 , ArgType1 , ArgType2 , ArgType3
823 , ArgType4 , void , void ,
void 826 DstViewType sub_view;
827 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2,arg3,arg4);
828 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2,arg3,arg4);
829 sub_view.modified_device = src.modified_device;
830 sub_view.modified_host = src.modified_host;
834 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
835 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
836 class ArgType4 ,
class ArgType5 >
837 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
838 , ArgType0 , ArgType1 , ArgType2 , ArgType3
839 , ArgType4 , ArgType5 , void ,
void 841 subview(
const DualView<D,A1,A2,A3> & src ,
842 const ArgType0 & arg0 ,
843 const ArgType1 & arg1 ,
844 const ArgType2 & arg2 ,
845 const ArgType3 & arg3 ,
846 const ArgType4 & arg4 ,
847 const ArgType5 & arg5 )
850 Impl::ViewSubview< DualView<D,A1,A2,A3>
851 , ArgType0 , ArgType1 , ArgType2 , ArgType3
852 , ArgType4 , ArgType5 , void ,
void 855 DstViewType sub_view;
856 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2,arg3,arg4,arg5);
857 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2,arg3,arg4,arg5);
858 sub_view.modified_device = src.modified_device;
859 sub_view.modified_host = src.modified_host;
863 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
864 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
865 class ArgType4 ,
class ArgType5 ,
class ArgType6 >
866 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
867 , ArgType0 , ArgType1 , ArgType2 , ArgType3
868 , ArgType4 , ArgType5 , ArgType6 ,
void 870 subview(
const DualView<D,A1,A2,A3> & src ,
871 const ArgType0 & arg0 ,
872 const ArgType1 & arg1 ,
873 const ArgType2 & arg2 ,
874 const ArgType3 & arg3 ,
875 const ArgType4 & arg4 ,
876 const ArgType5 & arg5 ,
877 const ArgType6 & arg6 )
880 Impl::ViewSubview< DualView<D,A1,A2,A3>
881 , ArgType0 , ArgType1 , ArgType2 , ArgType3
882 , ArgType4 , ArgType5 , ArgType6 ,
void 885 DstViewType sub_view;
886 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2,arg3,arg4,arg5,arg6);
887 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2,arg3,arg4,arg5,arg6);
888 sub_view.modified_device = src.modified_device;
889 sub_view.modified_host = src.modified_host;
893 template<
class D ,
class A1 ,
class A2 ,
class A3 ,
894 class ArgType0 ,
class ArgType1 ,
class ArgType2 ,
class ArgType3 ,
895 class ArgType4 ,
class ArgType5 ,
class ArgType6 ,
class ArgType7 >
896 typename Impl::ViewSubview< DualView<D,A1,A2,A3>
897 , ArgType0 , ArgType1 , ArgType2 , ArgType3
898 , ArgType4 , ArgType5 , ArgType6 , ArgType7
900 subview(
const DualView<D,A1,A2,A3> & src ,
901 const ArgType0 & arg0 ,
902 const ArgType1 & arg1 ,
903 const ArgType2 & arg2 ,
904 const ArgType3 & arg3 ,
905 const ArgType4 & arg4 ,
906 const ArgType5 & arg5 ,
907 const ArgType6 & arg6 ,
908 const ArgType7 & arg7 )
911 Impl::ViewSubview< DualView<D,A1,A2,A3>
912 , ArgType0 , ArgType1 , ArgType2 , ArgType3
913 , ArgType4 , ArgType5 , ArgType6 , ArgType7
916 DstViewType sub_view;
917 sub_view.d_view = subview(src.d_view,arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7);
918 sub_view.h_view = subview(src.h_view,arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7);
919 sub_view.modified_device = src.modified_device;
920 sub_view.modified_host = src.modified_host;
937 template<
class DT ,
class DL ,
class DD ,
class DM ,
938 class ST ,
class SL ,
class SD ,
class SM >
941 const DualView<ST,SL,SD,SM>& src )
943 if (src.modified_device () >= src.modified_host ()) {
945 dst.template modify<typename DualView<DT,DL,DD,DM>::device_type> ();
948 dst.template modify<typename DualView<DT,DL,DD,DM>::host_mirror_space> ();
952 template<
class ExecutionSpace ,
953 class DT ,
class DL ,
class DD ,
class DM ,
954 class ST ,
class SL ,
class SD ,
class SM >
957 DualView<DT,DL,DD,DM> dst,
958 const DualView<ST,SL,SD,SM>& src )
960 if (src.modified_device () >= src.modified_host ()) {
961 deep_copy (exec, dst.d_view, src.d_view);
962 dst.template modify<typename DualView<DT,DL,DD,DM>::device_type> ();
964 deep_copy (exec, dst.h_view, src.h_view);
965 dst.template modify<typename DualView<DT,DL,DD,DM>::host_mirror_space> ();
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 indicated arbitrarily strided multi-index mapping into contiguous memory...
Traits class for accessing attributes of a View.
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.