30 #ifndef KOKKOS_EXPERIMENTAL_VIEW_SACADO_FAD_CONTIGUOUS_HPP
31 #define KOKKOS_EXPERIMENTAL_VIEW_SACADO_FAD_CONTIGUOUS_HPP
34 #if defined(HAVE_SACADO_KOKKOSCORE)
42 template <
typename ViewType,
typename Enabled =
void>
43 struct ThreadLocalScalarType {
44 typedef typename ViewType::non_const_value_type type;
47 template <
typename ViewType>
48 struct ViewScalarStride {
49 static const unsigned stride =
50 Impl::LayoutScalarStride< typename ViewType::array_layout>::stride;
51 static const bool is_unit_stride =
52 Impl::LayoutScalarStride< typename ViewType::array_layout>::is_unit_stride;
62 template <
unsigned Size = 0>
64 static const unsigned PartitionSize = Size;
68 template<
typename iType0 ,
typename iType1 >
70 Partition(
const iType0 & i0 ,
const iType1 & i1 ) :
71 offset(i0), stride(i1) {
76 struct is_fad_partition {
77 static const bool value =
false;
80 template <
unsigned Str
ide>
81 struct is_fad_partition< Partition<Stride> > {
82 static const bool value =
true;
88 template <
typename T,
unsigned Str
ide = 0>
89 struct LocalScalarType {
92 template <
typename T,
unsigned Str
ide>
93 struct LocalScalarType<const
T, Stride> {
94 typedef typename LocalScalarType<T,Stride>::type lst;
95 typedef const lst type;
106 template <
typename T,
int N>
class StaticStorage;
107 template <
typename S>
class GeneralFad;
110 template <
typename T,
int N,
unsigned Str
ide>
111 struct LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,N> >,
113 static const int Ns = (
N+Stride-1) / Stride;
114 typedef Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,Ns> > type;
116 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
118 template <
typename T,
int N>
class SLFad;
120 template <
typename T,
int N,
unsigned Str
ide>
121 struct LocalScalarType< Fad::
SLFad<T,N>, Stride > {
122 static const int Ns = (
N+Stride-1) / Stride;
123 typedef Fad::SLFad<T,Ns> type;
133 template <
typename T,
int N>
class StaticFixedStorage;
134 template <
typename T,
int N>
class StaticStorage;
135 template <
typename S>
class GeneralFad;
138 template <
typename T,
int N,
unsigned Str
ide>
139 struct LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticFixedStorage<T,N> >,
141 static const int Ns = (
N+Stride-1) / Stride;
142 typedef typename std::conditional<
144 Fad::Exp::GeneralFad< Fad::Exp::StaticFixedStorage<T,Ns> > ,
145 Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,Ns> >
149 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
151 template <
typename T,
int N>
class SFad;
153 template <
typename T,
int N,
unsigned Str
ide>
154 struct LocalScalarType< Fad::
SFad<T,N>, Stride > {
155 static const int Ns = (
N+Stride-1) / Stride;
156 typedef typename std::conditional< Ns ==
N/Stride , Fad::SFad<T,Ns> , Fad::SLFad<T,Ns> >::type type;
160 template <
unsigned Str
ide,
typename T>
162 const T& partition_scalar(
const T& x) {
return x; }
167 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
170 #include "Kokkos_Core.hpp"
171 #include "impl/Kokkos_ViewMapping.hpp"
177 #if defined(__CUDA_ARCH__)
180 template <
typename T,
typename U>
class DynamicStorage;
181 template <
typename T,
int N>
class StaticFixedStorage;
182 template <
typename T,
int N>
class StaticStorage;
183 template <
typename S>
class GeneralFad;
186 #ifndef SACADO_VIEW_CUDA_HIERARCHICAL_DFAD
187 template <
unsigned Str
ide,
typename T,
typename U>
189 typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::DynamicStorage<T,U> >, Stride >::type
190 partition_scalar(
const Fad::Exp::GeneralFad< Fad::Exp::DynamicStorage<T,U> >& x) {
191 typedef typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::DynamicStorage<T,U> >, Stride >::type ret_type;
192 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
193 const int offset = threadIdx.x;
194 ret_type xp(size, x.val());
200 const T*
dx = x.dx();
201 for (
int i=0; i<size; ++i)
202 xp.fastAccessDx(i) = dx[offset+i*Stride];
207 template <
unsigned Str
ide,
typename T,
int N>
209 typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,N> >, Stride >::type
210 partition_scalar(
const Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,N> >& x) {
211 typedef typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticStorage<T,N> >, Stride >::type ret_type;
212 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
213 const int offset = threadIdx.x;
214 ret_type xp(size, x.val());
215 for (
int i=0; i<size; ++i)
216 xp.fastAccessDx(i) = x.fastAccessDx(offset+i*Stride);
219 template <
unsigned Str
ide,
typename T,
int N>
221 typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticFixedStorage<T,N> >, Stride >::type
222 partition_scalar(
const Fad::Exp::GeneralFad< Fad::Exp::StaticFixedStorage<T,N> >& x) {
223 typedef typename LocalScalarType< Fad::Exp::GeneralFad< Fad::Exp::StaticFixedStorage<T,N> >, Stride >::type ret_type;
224 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
225 const int offset = threadIdx.x;
226 ret_type xp(size, x.val());
227 for (
int i=0; i<size; ++i)
228 xp.fastAccessDx(i) = x.fastAccessDx(offset+i*Stride);
232 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
234 template <
typename T>
class DFad;
235 template <
typename T,
int N>
class SLFad;
236 template <
typename T,
int N>
class SFad;
238 #ifndef SACADO_VIEW_CUDA_HIERARCHICAL_DFAD
239 template <
unsigned Str
ide,
typename T>
241 typename LocalScalarType< Fad::DFad<T>, Stride >::type
242 partition_scalar(
const Fad::DFad<T>& x) {
243 typedef typename LocalScalarType< Fad::DFad<T>, Stride >::type ret_type;
244 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
245 const int offset = threadIdx.x;
246 ret_type xp(size, x.val());
252 const T* dx = x.dx();
253 for (
int i=0; i<size; ++i)
254 xp.fastAccessDx(i) = dx[offset+i*Stride];
259 template <
unsigned Str
ide,
typename T,
int N>
261 typename LocalScalarType< Fad::SLFad<T,N>, Stride >::type
262 partition_scalar(
const Fad::SLFad<T,N>& x) {
263 typedef typename LocalScalarType< Fad::SLFad<T,N>, Stride >::type ret_type;
264 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
265 const int offset = threadIdx.x;
266 ret_type xp(size, x.val());
267 for (
int i=0; i<size; ++i)
268 xp.fastAccessDx(i) = x.fastAccessDx(offset+i*Stride);
271 template <
unsigned Str
ide,
typename T,
int N>
273 typename LocalScalarType< Fad::SFad<T,N>, Stride >::type
274 partition_scalar(
const Fad::SFad<T,N>& x) {
275 typedef typename LocalScalarType< Fad::SFad<T,N>, Stride >::type ret_type;
276 const int size = (x.size()+blockDim.x-threadIdx.x-1) / blockDim.x;
277 const int offset = threadIdx.x;
278 ret_type xp(size, x.val());
279 for (
int i=0; i<size; ++i)
280 xp.fastAccessDx(i) = x.fastAccessDx(offset+i*Stride);
283 #endif // SACADO_NEW_FAD_DESIGN_IS_DEFAULT
285 #endif // defined(__CUDA_ARCH__)
293 template<
unsigned Stride,
typename D,
typename ... P >
295 typename Kokkos::Impl::ViewMapping<
void,
typename Kokkos::ViewTraits<
D,P...>, Sacado::Fad::Partition<Stride> >::type
296 partition(
const Kokkos::View<D,P...> & src ,
297 const unsigned offset ,
298 const unsigned stride )
300 typedef Kokkos::ViewTraits<
D,P...> traits;
301 typedef typename Kokkos::Impl::ViewMapping< void, traits, Sacado::Fad::Partition<Stride> >::type DstViewType;
302 const Sacado::Fad::Partition<Stride> part( offset , stride );
303 return DstViewType(src, part);
306 template <
typename ViewType>
307 struct ThreadLocalScalarType<
309 typename std::enable_if< is_view_fad_contiguous<ViewType>::value >::type > {
310 typedef typename ViewType::traits TraitsType;
311 typedef Impl::ViewMapping<TraitsType, typename TraitsType::specialize> MappingType;
312 typedef typename MappingType::thread_local_scalar_type type;
317 #if defined (KOKKOS_ENABLE_CUDA) && defined(SACADO_VIEW_CUDA_HIERARCHICAL)
318 template<
class OutputView >
319 struct SacadoViewFill<
321 typename std::enable_if<
322 ( Kokkos::is_view_fad_contiguous<OutputView>::value &&
323 std::is_same<typename OutputView::execution_space, Kokkos::Cuda>::value &&
324 !Kokkos::ViewScalarStride<OutputView>::is_unit_stride )
328 typedef typename OutputView::const_value_type const_value_type ;
329 typedef typename OutputView::execution_space execution_space ;
330 typedef Kokkos::TeamPolicy< execution_space> team_policy;
331 typedef typename team_policy::member_type team_impl_handle;
332 typedef typename Kokkos::ThreadLocalScalarType<OutputView>::type local_scalar_type;
333 static const unsigned stride = Kokkos::ViewScalarStride<OutputView>::stride;
335 const OutputView output ;
336 const_value_type input ;
339 void operator()(
const size_t i0 )
const
341 local_scalar_type input_stride = Sacado::partition_scalar<stride>(input);
343 const size_t n1 = output.extent(1);
344 const size_t n2 = output.extent(2);
345 const size_t n3 = output.extent(3);
346 const size_t n4 = output.extent(4);
347 const size_t n5 = output.extent(5);
348 const size_t n6 = output.extent(6);
349 const size_t n7 = output.extent(7);
351 for (
size_t i1 = 0 ; i1 < n1 ; ++i1 ) {
352 for (
size_t i2 = 0 ; i2 < n2 ; ++i2 ) {
353 for (
size_t i3 = 0 ; i3 < n3 ; ++i3 ) {
354 for (
size_t i4 = 0 ; i4 < n4 ; ++i4 ) {
355 for (
size_t i5 = 0 ; i5 < n5 ; ++i5 ) {
356 for (
size_t i6 = 0 ; i6 < n6 ; ++i6 ) {
357 for (
size_t i7 = 0 ; i7 < n7 ; ++i7 ) {
358 output.access(i0,i1,i2,i3,i4,i5,i6,i7) = input_stride ;
363 void operator()(
const team_impl_handle& team )
const
365 const size_t i0 = team.league_rank()*team.team_size() + team.team_rank();
366 if (i0 < output.extent(0))
370 SacadoViewFill(
const OutputView & arg_out , const_value_type & arg_in )
371 : output( arg_out ), input( arg_in )
373 const size_t team_size = 256 / stride;
374 team_policy policy( (output.extent(0)+team_size-1)/team_size ,
375 team_size , stride );
376 Kokkos::parallel_for( policy, *
this );
377 execution_space().fence();
390 template<
class ... Args >
391 struct is_ViewSpecializeSacadoFadContiguous {
enum { value =
false }; };
393 template<
class D ,
class ... P ,
class ... Args >
394 struct is_ViewSpecializeSacadoFadContiguous< Kokkos::
View<D,P...> , Args... > {
396 std::is_same<
typename Kokkos::ViewTraits<
D,P...>::specialize
397 , ViewSpecializeSacadoFadContiguous >::value
399 ( (
sizeof...(Args) == 0 ) ||
400 is_ViewSpecializeSacadoFadContiguous< Args... >::value ) };
414 constexpr
unsigned computeFadPartitionSize(
unsigned size,
unsigned stride)
417 ((size+stride-1)/stride) == (size/stride) ? ((size+stride-1)/stride) : 0;
423 template <
unsigned rank,
unsigned static_dim,
typename Layout>
425 typename std::enable_if< !std::is_same<Layout, LayoutLeft>::value &&
426 !std::is_same<Layout, LayoutStride>::value,
428 create_fad_array_layout(
const Layout& layout)
431 for (
int i=0; i<8; ++i)
432 dims[i] = layout.dimension[i];
434 dims[rank] = static_dim+1;
435 return Layout( dims[0], dims[1], dims[2], dims[3],
436 dims[4], dims[5], dims[6], dims[7] );
442 template <
unsigned rank,
unsigned static_dim,
typename Layout>
444 typename std::enable_if< std::is_same<Layout, LayoutStride>::value, Layout>::type
445 create_fad_array_layout(
const Layout& layout)
447 size_t dims[8], strides[8];
448 for (
int i=0; i<8; ++i) {
449 dims[i] = layout.dimension[i];
450 strides[i] = layout.stride[i];
452 if (static_dim > 0) {
453 dims[rank] = static_dim+1;
456 return Layout( dims[0], strides[0],
463 dims[7], strides[7] );
469 template <
unsigned rank,
unsigned static_dim,
typename Layout>
471 typename std::enable_if< std::is_same<Layout, LayoutLeft>::value, Layout >::type
472 create_fad_array_layout(
const Layout& layout)
475 for (
int i=0; i<8; ++i)
476 dims[i] = layout.dimension[i];
477 size_t fad_dim = static_dim == 0 ? dims[rank] : static_dim+1;
478 for (
int i=rank; i>=1; --i)
481 return Layout( dims[0], dims[1], dims[2], dims[3],
482 dims[4], dims[5], dims[6], dims[7] );
485 template <
unsigned Rank,
typename Dimension,
typename Layout>
487 typename std::enable_if< !std::is_same<Layout, LayoutLeft>::value,
size_t>::type
488 getFadDimension(
const ViewOffset<Dimension,Layout,void>& offset)
491 ( Rank == 0 ? offset.dimension_0() :
492 ( Rank == 1 ? offset.dimension_1() :
493 ( Rank == 2 ? offset.dimension_2() :
494 ( Rank == 3 ? offset.dimension_3() :
495 ( Rank == 4 ? offset.dimension_4() :
496 ( Rank == 5 ? offset.dimension_5() :
497 ( Rank == 6 ? offset.dimension_6() :
498 offset.dimension_7() )))))));
501 template <
unsigned Rank,
typename Dimension,
typename Layout>
503 typename std::enable_if< std::is_same<Layout, LayoutLeft>::value,
size_t >::type
504 getFadDimension(
const ViewOffset<Dimension,Layout,void>& offset)
506 return offset.dimension_0();
509 template<
class Traits >
510 class ViewMapping< Traits ,
511 typename std::enable_if<
512 ( std::is_same< typename Traits::specialize
513 , ViewSpecializeSacadoFadContiguous >::value
515 ( std::is_same< typename Traits::array_layout
516 , Kokkos::LayoutLeft >::value
518 std::is_same< typename Traits::array_layout
519 , Kokkos::LayoutRight >::value
521 std::is_same< typename Traits::array_layout
522 , Kokkos::LayoutStride >::value
525 , typename Traits::specialize
530 template< class ,
class ... >
friend class ViewMapping ;
531 template< class ,
class ... >
friend class Kokkos::View ;
533 typedef typename Traits::value_type fad_type ;
536 std::add_const< fad_value_type >::type const_fad_value_type ;
539 enum { is_assignable_data_type =
true };
542 enum { PartitionedFadStride = Traits::array_layout::scalar_stride };
546 enum { PartitionedFadStaticDimension =
547 computeFadPartitionSize(FadStaticDimension,PartitionedFadStride) };
549 #ifdef KOKKOS_ENABLE_CUDA
550 typedef typename Sacado::LocalScalarType< fad_type, unsigned(PartitionedFadStride) >::type strided_scalar_type;
551 typedef typename std::conditional< std::is_same<typename Traits::execution_space, Kokkos::Cuda>::value, strided_scalar_type, fad_type >::type thread_local_scalar_type;
553 typedef fad_type thread_local_scalar_type;
559 typedef fad_value_type * handle_type ;
561 typedef ViewArrayAnalysis< typename Traits::data_type > array_analysis ;
563 typedef ViewOffset<
typename Traits::dimension
564 ,
typename Traits::array_layout
569 static constexpr
bool is_layout_left =
570 std::is_same< typename Traits::array_layout, Kokkos::LayoutLeft>::value;
572 typename std::conditional<
574 typename array_analysis::dimension::
575 template prepend<0>::type,
576 typename array_analysis::dimension::
577 template append<0>::type >::type,
578 typename Traits::array_layout,
582 handle_type m_impl_handle ;
583 offset_type m_impl_offset ;
584 array_offset_type m_array_offset ;
585 sacado_size_type m_fad_size ;
588 unsigned m_original_fad_size ;
589 unsigned m_fad_stride ;
590 unsigned m_fad_index ;
597 enum { Rank = Traits::dimension::rank };
600 enum { Sacado_Rank = std::is_same< typename Traits::array_layout, Kokkos::LayoutLeft >::value ? 0 : Rank+1 };
603 template<
typename iType >
605 {
return m_impl_offset.m_dim.extent(r); }
608 typename Traits::array_layout layout()
const
609 {
return m_impl_offset.layout(); }
612 {
return m_impl_offset.dimension_0(); }
614 {
return m_impl_offset.dimension_1(); }
616 {
return m_impl_offset.dimension_2(); }
618 {
return m_impl_offset.dimension_3(); }
620 {
return m_impl_offset.dimension_4(); }
622 {
return m_impl_offset.dimension_5(); }
624 {
return m_impl_offset.dimension_6(); }
626 {
return m_impl_offset.dimension_7(); }
631 using is_regular = std::false_type ;
635 {
return m_impl_offset.stride_0(); }
637 {
return m_impl_offset.stride_1(); }
639 {
return m_impl_offset.stride_2(); }
641 {
return m_impl_offset.stride_3(); }
643 {
return m_impl_offset.stride_4(); }
645 {
return m_impl_offset.stride_5(); }
647 {
return m_impl_offset.stride_6(); }
649 {
return m_impl_offset.stride_7(); }
651 template<
typename iType >
653 { m_impl_offset.stride(s); }
657 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
658 {
return PartitionedFadStaticDimension ? PartitionedFadStaticDimension+1 : (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x + 1; }
660 {
return m_fad_size.value+1; }
665 {
return m_fad_stride; }
670 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
684 typedef fad_value_type * pointer_type ;
688 {
return m_array_offset.span(); }
692 {
return m_array_offset.span_is_contiguous() && (m_fad_stride == 1); }
696 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
697 {
return m_impl_handle + threadIdx.x; }
699 {
return m_impl_handle + m_fad_index; }
708 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
709 const unsigned index = threadIdx.x;
710 const unsigned strd = blockDim.x;
711 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
713 const unsigned index = m_fad_index;
714 const unsigned strd = m_fad_stride;
715 const unsigned size = m_fad_size.value;
717 return reference_type( m_impl_handle + index
718 , m_impl_handle + m_original_fad_size
722 template<
typename I0 >
724 typename std::enable_if< Kokkos::Impl::are_integral<I0>::value &&
725 is_layout_left, reference_type>::type
726 reference(
const I0 & i0 )
const
727 { pointer_type beg = m_impl_handle + m_array_offset(0,i0);
728 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
729 const unsigned index = threadIdx.x;
730 const unsigned strd = blockDim.x;
731 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
733 const unsigned index = m_fad_index;
734 const unsigned strd = m_fad_stride;
735 const unsigned size = m_fad_size.value;
737 return reference_type( beg + index
738 , beg + m_original_fad_size
742 template<
typename I0 >
744 typename std::enable_if< Kokkos::Impl::are_integral<I0>::value &&
745 !is_layout_left, reference_type>::type
746 reference(
const I0 & i0 )
const
747 { pointer_type beg = m_impl_handle + m_array_offset(i0,0);
748 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
749 const unsigned index = threadIdx.x;
750 const unsigned strd = blockDim.x;
751 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
753 const unsigned index = m_fad_index;
754 const unsigned strd = m_fad_stride;
755 const unsigned size = m_fad_size.value;
757 return reference_type( beg + index
758 , beg + m_original_fad_size
762 template<
typename I0 ,
typename I1 >
764 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1>::value &&
765 is_layout_left, reference_type>::type
766 reference(
const I0 & i0 ,
const I1 & i1 )
const
767 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1);
768 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
769 const unsigned index = threadIdx.x;
770 const unsigned strd = blockDim.x;
771 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
773 const unsigned index = m_fad_index;
774 const unsigned strd = m_fad_stride;
775 const unsigned size = m_fad_size.value;
777 return reference_type( beg + index
778 , beg + m_original_fad_size
782 template<
typename I0 ,
typename I1 >
784 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1>::value &&
785 !is_layout_left, reference_type>::type
786 reference(
const I0 & i0 ,
const I1 & i1 )
const
787 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,0);
788 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
789 const unsigned index = threadIdx.x;
790 const unsigned strd = blockDim.x;
791 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
793 const unsigned index = m_fad_index;
794 const unsigned strd = m_fad_stride;
795 const unsigned size = m_fad_size.value;
797 return reference_type( beg + index
798 , beg + m_original_fad_size
803 template<
typename I0 ,
typename I1 ,
typename I2 >
805 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2>::value &&
806 is_layout_left, reference_type>::type
807 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 )
const
808 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1,i2);
809 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
810 const unsigned index = threadIdx.x;
811 const unsigned strd = blockDim.x;
812 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
814 const unsigned index = m_fad_index;
815 const unsigned strd = m_fad_stride;
816 const unsigned size = m_fad_size.value;
818 return reference_type( beg + index
819 , beg + m_original_fad_size
823 template<
typename I0 ,
typename I1 ,
typename I2 >
825 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2>::value &&
826 !is_layout_left, reference_type>::type
827 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 )
const
828 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,i2,0);
829 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
830 const unsigned index = threadIdx.x;
831 const unsigned strd = blockDim.x;
832 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
834 const unsigned index = m_fad_index;
835 const unsigned strd = m_fad_stride;
836 const unsigned size = m_fad_size.value;
838 return reference_type( beg + index
839 , beg + m_original_fad_size
843 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3 >
845 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3>::value &&
846 is_layout_left, reference_type>::type
847 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3 )
const
848 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1,i2,i3);
849 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
850 const unsigned index = threadIdx.x;
851 const unsigned strd = blockDim.x;
852 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
854 const unsigned index = m_fad_index;
855 const unsigned strd = m_fad_stride;
856 const unsigned size = m_fad_size.value;
858 return reference_type( beg + index
859 , beg + m_original_fad_size
863 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3 >
865 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3>::value &&
866 !is_layout_left, reference_type>::type
867 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3 )
const
868 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,i2,i3,0);
869 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
870 const unsigned index = threadIdx.x;
871 const unsigned strd = blockDim.x;
872 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
874 const unsigned index = m_fad_index;
875 const unsigned strd = m_fad_stride;
876 const unsigned size = m_fad_size.value;
878 return reference_type( beg + index
879 , beg + m_original_fad_size
883 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
886 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4>::value &&
887 is_layout_left, reference_type>::type
888 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
889 ,
const I4 & i4 )
const
890 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1,i2,i3,i4);
891 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
892 const unsigned index = threadIdx.x;
893 const unsigned strd = blockDim.x;
894 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
896 const unsigned index = m_fad_index;
897 const unsigned strd = m_fad_stride;
898 const unsigned size = m_fad_size.value;
900 return reference_type( beg + index
901 , beg + m_original_fad_size
905 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
908 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4>::value &&
909 !is_layout_left, reference_type>::type
910 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
911 ,
const I4 & i4 )
const
912 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,i2,i3,i4,0);
913 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
914 const unsigned index = threadIdx.x;
915 const unsigned strd = blockDim.x;
916 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
918 const unsigned index = m_fad_index;
919 const unsigned strd = m_fad_stride;
920 const unsigned size = m_fad_size.value;
922 return reference_type( beg + index
923 , beg + m_original_fad_size
927 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
928 ,
typename I4 ,
typename I5 >
930 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4,I5>::value &&
931 is_layout_left, reference_type>::type
932 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
933 ,
const I4 & i4 ,
const I5 & i5 )
const
934 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1,i2,i3,i4,i5);
935 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
936 const unsigned index = threadIdx.x;
937 const unsigned strd = blockDim.x;
938 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
940 const unsigned index = m_fad_index;
941 const unsigned strd = m_fad_stride;
942 const unsigned size = m_fad_size.value;
944 return reference_type( beg + index
945 , beg + m_original_fad_size
949 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
950 ,
typename I4 ,
typename I5 >
952 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4,I5>::value &&
953 !is_layout_left, reference_type>::type
954 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
955 ,
const I4 & i4 ,
const I5 & i5 )
const
956 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,i2,i3,i4,i5,0);
957 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
958 const unsigned index = threadIdx.x;
959 const unsigned strd = blockDim.x;
960 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
962 const unsigned index = m_fad_index;
963 const unsigned strd = m_fad_stride;
964 const unsigned size = m_fad_size.value;
966 return reference_type( beg + index
967 , beg + m_original_fad_size
971 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
972 ,
typename I4 ,
typename I5 ,
typename I6 >
974 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4,I5,I6>::value &&
975 is_layout_left, reference_type>::type
976 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
977 ,
const I4 & i4 ,
const I5 & i5 ,
const I6 & i6 )
const
978 { pointer_type beg = m_impl_handle + m_array_offset(0,i0,i1,i2,i3,i4,i5,i6);
979 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
980 const unsigned index = threadIdx.x;
981 const unsigned strd = blockDim.x;
982 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
984 const unsigned index = m_fad_index;
985 const unsigned strd = m_fad_stride;
986 const unsigned size = m_fad_size.value;
988 return reference_type( beg + index
989 , beg + m_original_fad_size
993 template<
typename I0 ,
typename I1 ,
typename I2 ,
typename I3
994 ,
typename I4 ,
typename I5 ,
typename I6 >
996 typename std::enable_if< Kokkos::Impl::are_integral<I0,I1,I2,I3,I4,I5,I6>::value &&
997 !is_layout_left, reference_type>::type
998 reference(
const I0 & i0 ,
const I1 & i1 ,
const I2 & i2 ,
const I3 & i3
999 ,
const I4 & i4 ,
const I5 & i5 ,
const I6 & i6 )
const
1000 { pointer_type beg = m_impl_handle + m_array_offset(i0,i1,i2,i3,i4,i5,i6,0);
1001 #if defined(SACADO_VIEW_CUDA_HIERARCHICAL) && defined(__CUDA_ARCH__)
1002 const unsigned index = threadIdx.x;
1003 const unsigned strd = blockDim.x;
1004 const unsigned size = (m_fad_size.value+blockDim.x-threadIdx.x-1) / blockDim.x;
1006 const unsigned index = m_fad_index;
1007 const unsigned strd = m_fad_stride;
1008 const unsigned size = m_fad_size.value;
1010 return reference_type( beg + index
1011 , beg + m_original_fad_size
1019 static constexpr
size_t memory_span(
typename Traits::array_layout
const & layout )
1022 typedef std::integral_constant< unsigned , 0 > padding ;
1023 return array_offset_type(
1025 create_fad_array_layout<
unsigned(Rank),
unsigned(FadStaticDimension)>( layout ) ).span() *
sizeof(fad_value_type);
1031 KOKKOS_INLINE_FUNCTION ViewMapping() : m_impl_handle(0) , m_impl_offset() , m_array_offset() , m_fad_size(0) , m_original_fad_size(0) , m_fad_stride(1) , m_fad_index(0) {}
1039 template<
class ... P >
1042 ( ViewCtorProp< P ... >
const & prop
1043 ,
typename Traits::array_layout
const & local_layout
1045 : m_impl_handle( ( (ViewCtorProp<
void,pointer_type> const &) prop ).value )
1046 , m_impl_offset( std::integral_constant< unsigned , 0 >()
1049 std::integral_constant< unsigned , 0 >()
1050 , create_fad_array_layout<unsigned(Rank), unsigned(FadStaticDimension)>( local_layout ) )
1051 , m_fad_size( getFadDimension<unsigned(Rank)>( m_array_offset ) - 1 )
1052 , m_original_fad_size( m_fad_size.value )
1057 getFadDimension<unsigned(Rank)>( m_array_offset );
1058 if (
unsigned(FadStaticDimension) == 0 && fad_dim == 0)
1059 Kokkos::abort(
"invalid fad dimension (0) supplied!");
1067 template<
class ... P >
1068 SharedAllocationRecord<> *
1069 allocate_shared( ViewCtorProp< P... >
const & prop
1070 ,
typename Traits::array_layout
const & local_layout )
1072 typedef ViewCtorProp< P... > ctor_prop ;
1074 typedef typename ctor_prop::execution_space execution_space ;
1075 typedef typename Traits::memory_space memory_space ;
1076 typedef ViewValueFunctor< execution_space , fad_value_type > functor_type ;
1077 typedef SharedAllocationRecord< memory_space , functor_type > record_type ;
1080 typedef std::integral_constant< unsigned , 0 > padding ;
1083 enum { test_traits_check = Kokkos::Impl::check_has_common_view_alloc_prop< P... >::value };
1085 typename Traits::array_layout internal_layout =
1086 (test_traits_check ==
true)
1087 ? Kokkos::Impl::appendFadToLayoutViewAllocHelper< Traits, P... >::returnNewLayoutPlusFad(prop, local_layout)
1090 m_impl_offset = offset_type( padding(), internal_layout );
1093 array_offset_type( padding() ,
1094 create_fad_array_layout<
unsigned(Rank),
unsigned(FadStaticDimension)>( internal_layout ) );
1095 const unsigned fad_dim =
1096 getFadDimension<unsigned(Rank)>( m_array_offset );
1097 if (
unsigned(FadStaticDimension) == 0 && fad_dim == 0)
1098 Kokkos::abort(
"invalid fad dimension (0) supplied!");
1099 m_fad_size = fad_dim - 1 ;
1100 m_original_fad_size = m_fad_size.value ;
1104 const size_t alloc_size = m_array_offset.span() *
sizeof(fad_value_type);
1107 record_type *
const record =
1108 record_type::allocate( ( (ViewCtorProp<void,memory_space>
const &) prop ).value
1109 , ( (ViewCtorProp<void,std::string>
const &) prop ).value
1116 m_impl_handle = handle_type( reinterpret_cast< pointer_type >( record->data() ) );
1118 if ( ctor_prop::initialize ) {
1121 record->m_destroy = functor_type( ( (ViewCtorProp<void,execution_space>
const &) prop).value
1122 , (fad_value_type *) m_impl_handle
1123 , m_array_offset.span()
1127 record->m_destroy.construct_shared_allocation();
1148 template<
class DstTraits ,
class SrcTraits >
1149 class ViewMapping< DstTraits , SrcTraits ,
1150 typename std::enable_if<(
1151 Kokkos::Impl::MemorySpaceAccess
1152 < typename DstTraits::memory_space
1153 , typename SrcTraits::memory_space >::assignable
1156 std::is_same< typename DstTraits::specialize
1157 , ViewSpecializeSacadoFadContiguous >::value
1160 std::is_same< typename SrcTraits::specialize
1161 , ViewSpecializeSacadoFadContiguous >::value
1163 , typename DstTraits::specialize
1168 enum { is_assignable =
true };
1169 enum { is_assignable_data_type =
true };
1171 typedef Kokkos::Impl::SharedAllocationTracker TrackType ;
1172 typedef ViewMapping< DstTraits , typename DstTraits::specialize > DstType ;
1173 typedef ViewMapping< SrcTraits , typename SrcTraits::specialize > SrcFadType ;
1175 template<
class DstType >
1177 void assign( DstType & dst
1178 ,
const SrcFadType & src
1179 ,
const TrackType & )
1183 std::is_same<
typename DstTraits::array_layout
1184 , Kokkos::LayoutLeft >::value ||
1185 std::is_same<
typename DstTraits::array_layout
1186 , Kokkos::LayoutRight >::value ||
1187 std::is_same<
typename DstTraits::array_layout
1188 , Kokkos::LayoutStride >::value
1192 std::is_same<
typename SrcTraits::array_layout
1193 , Kokkos::LayoutLeft >::value ||
1194 std::is_same<
typename SrcTraits::array_layout
1195 , Kokkos::LayoutRight >::value ||
1196 std::is_same<
typename SrcTraits::array_layout
1197 , Kokkos::LayoutStride >::value
1199 ,
"View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
1202 std::is_same<
typename DstTraits::array_layout
1203 ,
typename SrcTraits::array_layout >::value ||
1204 std::is_same<
typename DstTraits::array_layout
1205 , Kokkos::LayoutStride >::value ,
1206 "View assignment must have compatible layout" );
1209 std::is_same<
typename DstTraits::scalar_array_type
1210 ,
typename SrcTraits::scalar_array_type >::value ||
1211 std::is_same<
typename DstTraits::scalar_array_type
1212 ,
typename SrcTraits::const_scalar_array_type >::value ,
1213 "View assignment must have same value type or const = non-const" );
1216 ViewDimensionAssignable
1217 <
typename DstType::offset_type::dimension_type
1218 ,
typename SrcFadType::offset_type::dimension_type >::value ,
1219 "View assignment must have compatible dimensions" );
1222 ViewDimensionAssignable
1223 <
typename DstType::array_offset_type::dimension_type
1224 ,
typename SrcFadType::array_offset_type::dimension_type >::value ,
1225 "View assignment must have compatible dimensions" );
1227 typedef typename DstType::offset_type dst_offset_type ;
1228 typedef typename DstType::array_offset_type dst_array_offset_type ;
1230 dst.m_impl_handle = src.m_impl_handle ;
1231 dst.m_impl_offset = dst_offset_type( src.m_impl_offset );
1232 dst.m_array_offset = dst_array_offset_type( src.m_array_offset );
1233 dst.m_fad_size = src.m_fad_size.value ;
1234 dst.m_original_fad_size = src.m_original_fad_size ;
1235 dst.m_fad_stride = src.m_fad_stride ;
1236 dst.m_fad_index = src.m_fad_index ;
1244 template<
class DstTraits ,
class SrcTraits >
1245 class ViewMapping< DstTraits , SrcTraits ,
1246 typename std::enable_if<(
1247 std::is_same< typename DstTraits::memory_space
1248 , typename SrcTraits::memory_space >::value
1251 std::is_same< typename DstTraits::specialize
1252 , ViewSpecializeSacadoFad >::value
1255 std::is_same< typename SrcTraits::specialize
1256 , ViewSpecializeSacadoFadContiguous >::value
1259 std::is_same< typename DstTraits::array_layout
1260 , Kokkos::LayoutStride >::value
1262 , typename DstTraits::specialize
1267 enum { is_assignable =
true };
1268 enum { is_assignable_data_type =
true };
1270 typedef Kokkos::Impl::SharedAllocationTracker TrackType ;
1271 typedef ViewMapping< DstTraits , typename DstTraits::specialize > DstType ;
1272 typedef ViewMapping< SrcTraits , typename SrcTraits::specialize > SrcFadType ;
1274 template<
class DstType >
1276 void assign( DstType & dst
1277 ,
const SrcFadType & src
1278 ,
const TrackType & )
1281 std::is_same<
typename SrcTraits::array_layout
1282 , Kokkos::LayoutLeft >::value ||
1283 std::is_same<
typename SrcTraits::array_layout
1284 , Kokkos::LayoutRight >::value ||
1285 std::is_same<
typename SrcTraits::array_layout
1286 , Kokkos::LayoutStride >::value ,
1287 "View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
1290 std::is_same<
typename DstTraits::value_type
1291 ,
typename SrcTraits::value_type >::value ||
1292 std::is_same<
typename DstTraits::value_type
1293 ,
typename SrcTraits::const_value_type >::value ,
1294 "View assignment must have same value type or const = non-const" );
1297 DstTraits::dimension::rank == SrcTraits::dimension::rank,
1298 "View assignment must have same rank" );
1300 typedef typename DstType::array_offset_type dst_offset_type ;
1302 dst.m_impl_handle = src.m_impl_handle ;
1303 dst.m_fad_size = src.m_fad_size.value ;
1304 dst.m_fad_stride = src.m_fad_stride ;
1305 dst.m_impl_offset = src.m_impl_offset;
1308 N[0] = src.m_array_offset.dimension_0();
1309 N[1] = src.m_array_offset.dimension_1();
1310 N[2] = src.m_array_offset.dimension_2();
1311 N[3] = src.m_array_offset.dimension_3();
1312 N[4] = src.m_array_offset.dimension_4();
1313 N[5] = src.m_array_offset.dimension_5();
1314 N[6] = src.m_array_offset.dimension_6();
1315 N[7] = src.m_array_offset.dimension_7();
1316 S[0] = src.m_array_offset.stride_0();
1317 S[1] = src.m_array_offset.stride_1();
1318 S[2] = src.m_array_offset.stride_2();
1319 S[3] = src.m_array_offset.stride_3();
1320 S[4] = src.m_array_offset.stride_4();
1321 S[5] = src.m_array_offset.stride_5();
1322 S[6] = src.m_array_offset.stride_6();
1323 S[7] = src.m_array_offset.stride_7();
1327 if (std::is_same<
typename SrcTraits::array_layout
1328 , Kokkos::LayoutLeft >::value)
1330 const size_t N_fad = N[0];
1331 const size_t S_fad = S[0];
1332 for (
int i=0; i<7; ++i) {
1336 N[DstTraits::dimension::rank] = N_fad;
1337 S[DstTraits::dimension::rank] = S_fad;
1339 Kokkos::LayoutStride ls( N[0], S[0],
1347 dst.m_array_offset = dst_offset_type(std::integral_constant<unsigned,0>(), ls);
1355 template<
class DstTraits ,
class SrcTraits >
1356 class ViewMapping< DstTraits , SrcTraits ,
1357 typename std::enable_if<(
1358 std::is_same< typename DstTraits::memory_space
1359 , typename SrcTraits::memory_space >::value
1362 std::is_same< typename DstTraits::specialize , void >::value
1365 std::is_same< typename SrcTraits::specialize
1366 , ViewSpecializeSacadoFadContiguous >::value
1368 , typename DstTraits::specialize
1373 enum { is_assignable =
true };
1374 enum { is_assignable_data_type =
true };
1376 typedef Kokkos::Impl::SharedAllocationTracker TrackType ;
1377 typedef ViewMapping< DstTraits , typename DstTraits::specialize > DstType ;
1378 typedef ViewMapping< SrcTraits , typename SrcTraits::specialize > SrcFadType ;
1383 template <
class DstType,
class SrcFadType,
class Enable =
void >
1384 struct AssignOffset;
1386 template <
class DstType,
class SrcFadType >
1387 struct AssignOffset< DstType, SrcFadType, typename std::enable_if< ((int)DstType::offset_type::dimension_type::rank != (int)SrcFadType::array_offset_type::dimension_type::rank) >::type >
1391 static void assign( DstType & dst,
const SrcFadType & src )
1393 typedef typename SrcTraits::value_type TraitsValueType;
1400 typedef typename DstType::offset_type::array_layout DstLayoutType;
1402 typedef typename SrcFadType::array_offset_type::dimension_type SrcViewDimension;
1407 static constexpr
bool is_layout_left =
1408 std::is_same< DstLayoutType, Kokkos::LayoutLeft>::value;
1410 typedef typename std::conditional< is_layout_left,
1411 typename SrcViewDimension:: template prepend< InnerStaticDim+1 >::type,
1412 typename SrcViewDimension:: template append < InnerStaticDim+1 >::type
1413 >::type SrcViewDimensionAppended;
1415 typedef std::integral_constant< unsigned , 0 > padding ;
1417 typedef ViewOffset< SrcViewDimensionAppended, DstLayoutType > TmpOffsetType;
1419 auto src_layout = src.m_array_offset.layout();
1421 if ( is_layout_left ) {
1422 auto prepend_layout = Kokkos::Impl::prependFadToLayout< DstLayoutType >::returnNewLayoutPlusFad(src_layout, InnerStaticDim+1);
1423 TmpOffsetType offset_tmp( padding(), prepend_layout );
1424 dst.m_impl_offset = offset_tmp;
1427 TmpOffsetType offset_tmp( padding(), src_layout );
1428 dst.m_impl_offset = offset_tmp;
1431 Kokkos::abort(
"Sacado error: Applying AssignOffset for case with nested Fads, but without nested Fads - something went wrong");
1436 template <
class DstType,
class SrcFadType >
1437 struct AssignOffset< DstType, SrcFadType, typename std::enable_if< ((int)DstType::offset_type::dimension_type::rank == (int)SrcFadType::array_offset_type::dimension_type::rank) >::type >
1440 static void assign( DstType & dst,
const SrcFadType & src )
1442 typedef typename DstType::offset_type dst_offset_type ;
1443 dst.m_impl_offset = dst_offset_type( src.m_array_offset );
1447 template<
class DstType >
1449 void assign( DstType & dst
1450 ,
const SrcFadType & src
1456 std::is_same<
typename DstTraits::array_layout
1457 , Kokkos::LayoutLeft >::value ||
1458 std::is_same<
typename DstTraits::array_layout
1459 , Kokkos::LayoutRight >::value ||
1460 std::is_same<
typename DstTraits::array_layout
1461 , Kokkos::LayoutStride >::value
1465 std::is_same<
typename SrcTraits::array_layout
1466 , Kokkos::LayoutLeft >::value ||
1467 std::is_same<
typename SrcTraits::array_layout
1468 , Kokkos::LayoutRight >::value ||
1469 std::is_same<
typename SrcTraits::array_layout
1470 , Kokkos::LayoutStride >::value
1472 ,
"View of FAD requires LayoutLeft, LayoutRight, or LayoutStride" );
1475 std::is_same<
typename DstTraits::array_layout
1476 ,
typename SrcTraits::array_layout >::value ||
1477 std::is_same<
typename DstTraits::array_layout
1478 , Kokkos::LayoutStride >::value ,
1479 "View assignment must have compatible layout" );
1481 if ( src.m_fad_index != 0 || src.m_fad_stride != 1 ) {
1482 Kokkos::abort(
"\n\n ****** Kokkos::View< Sacado::Fad ... > Cannot assign to array with partitioned view ******\n\n");
1485 AssignOffset< DstType, SrcFadType >::assign( dst, src );
1486 dst.m_impl_handle =
reinterpret_cast< typename DstType::handle_type
>(src.m_impl_handle) ;
1500 template<
class LayoutDest,
class LayoutSrc,
int RankDest,
int RankSrc,
int CurrentArg,
class ... SubViewArgs>
1501 struct SubviewLegalArgsCompileTime<Kokkos::LayoutContiguous<LayoutDest>,LayoutSrc,RankDest,RankSrc,CurrentArg,SubViewArgs...> {
1502 enum { value = SubviewLegalArgsCompileTime<LayoutDest,LayoutSrc,RankDest,RankSrc,CurrentArg,SubViewArgs...>::value };
1505 template<
class LayoutDest,
class LayoutSrc,
int RankDest,
int RankSrc,
int CurrentArg,
class ... SubViewArgs>
1506 struct SubviewLegalArgsCompileTime<LayoutDest,Kokkos::LayoutContiguous<LayoutSrc>,RankDest,RankSrc,CurrentArg,SubViewArgs...> {
1507 enum { value = SubviewLegalArgsCompileTime<LayoutDest,LayoutSrc,RankDest,RankSrc,CurrentArg,SubViewArgs...>::value };
1510 template<
class LayoutDest,
class LayoutSrc,
int RankDest,
int RankSrc,
int CurrentArg,
class ... SubViewArgs>
1511 struct SubviewLegalArgsCompileTime<Kokkos::LayoutContiguous<LayoutDest>,
Kokkos::LayoutContiguous<LayoutSrc>,RankDest,RankSrc,CurrentArg,SubViewArgs...> {
1512 enum { value = SubviewLegalArgsCompileTime<LayoutDest,LayoutSrc,RankDest,RankSrc,CurrentArg,SubViewArgs...>::value };
1517 template<
class SrcTraits ,
class Arg0 ,
class ... Args >
1519 < typename std::enable_if<(
1521 std::is_same< typename SrcTraits::specialize
1522 , ViewSpecializeSacadoFadContiguous >::value
1525 std::is_same< typename SrcTraits::array_layout
1526 , Kokkos::LayoutLeft >::value ||
1527 std::is_same< typename SrcTraits::array_layout
1528 , Kokkos::LayoutRight >::value ||
1529 std::is_same< typename SrcTraits::array_layout
1530 , Kokkos::LayoutStride >::value
1532 && !Sacado::Fad::is_fad_partition<Arg0>::value
1540 static_assert( SrcTraits::rank ==
sizeof...(Args)+1 ,
"" );
1544 , R0 = bool(is_integral_extent<0,Arg0,Args...>::value)
1545 , R1 = bool(is_integral_extent<1,Arg0,Args...>::value)
1546 , R2 = bool(is_integral_extent<2,Arg0,Args...>::value)
1547 , R3 = bool(is_integral_extent<3,Arg0,Args...>::value)
1548 , R4 = bool(is_integral_extent<4,Arg0,Args...>::value)
1549 , R5 = bool(is_integral_extent<5,Arg0,Args...>::value)
1550 , R6 = bool(is_integral_extent<6,Arg0,Args...>::value)
1554 enum { rank = unsigned(R0) + unsigned(R1) + unsigned(R2) + unsigned(R3)
1555 + unsigned(R4) + unsigned(R5) + unsigned(R6) };
1558 enum { R0_rev = ( 0 == SrcTraits::rank ? RZ : (
1559 1 == SrcTraits::rank ? R0 : (
1560 2 == SrcTraits::rank ? R1 : (
1561 3 == SrcTraits::rank ? R2 : (
1562 4 == SrcTraits::rank ? R3 : (
1563 5 == SrcTraits::rank ? R4 : (
1564 6 == SrcTraits::rank ? R5 : R6 ))))))) };
1567 typedef typename std::conditional<
1573 ( rank <= 2 && R0 && std::is_same< typename SrcTraits::array_layout , Kokkos::LayoutLeft >::value )
1577 ( rank <= 2 && R0_rev && std::is_same< typename SrcTraits::array_layout , Kokkos::LayoutRight >::value )
1579 >::type array_layout ;
1581 typedef typename SrcTraits::value_type fad_type ;
1583 typedef typename std::conditional< rank == 0 , fad_type ,
1584 typename std::conditional< rank == 1 , fad_type * ,
1585 typename std::conditional< rank == 2 , fad_type ** ,
1586 typename std::conditional< rank == 3 , fad_type *** ,
1587 typename std::conditional< rank == 4 , fad_type **** ,
1588 typename std::conditional< rank == 5 , fad_type ***** ,
1589 typename std::conditional< rank == 6 , fad_type ****** ,
1591 >::type >::type >::type >::type >::type >::type >::type
1596 typedef Kokkos::ViewTraits
1599 ,
typename SrcTraits::device_type
1600 ,
typename SrcTraits::memory_traits > traits_type ;
1602 typedef Kokkos::View
1605 ,
typename SrcTraits::device_type
1606 ,
typename SrcTraits::memory_traits > type ;
1610 static void assign( ViewMapping< traits_type , typename traits_type::specialize > & dst
1611 , ViewMapping< SrcTraits , typename SrcTraits::specialize >
const & src
1612 , Arg0 arg0 , Args ... args )
1614 typedef ViewMapping< traits_type , typename traits_type::specialize > DstType ;
1615 typedef typename DstType::offset_type dst_offset_type ;
1616 typedef typename DstType::array_offset_type dst_array_offset_type ;
1617 typedef typename DstType::handle_type dst_handle_type ;
1620 if (std::is_same< typename SrcTraits::array_layout, LayoutLeft >::value) {
1621 const SubviewExtents< SrcTraits::rank + 1 , rank + 1 >
1622 array_extents( src.m_array_offset.m_dim , Kokkos::ALL() , arg0 , args... );
1623 offset = src.m_array_offset( array_extents.domain_offset(0)
1624 , array_extents.domain_offset(1)
1625 , array_extents.domain_offset(2)
1626 , array_extents.domain_offset(3)
1627 , array_extents.domain_offset(4)
1628 , array_extents.domain_offset(5)
1629 , array_extents.domain_offset(6)
1630 , array_extents.domain_offset(7) );
1631 dst.m_array_offset = dst_array_offset_type( src.m_array_offset ,
1635 const SubviewExtents< SrcTraits::rank + 1 , rank + 1 >
1636 array_extents( src.m_array_offset.m_dim , arg0 , args... , Kokkos::ALL() );
1637 offset = src.m_array_offset( array_extents.domain_offset(0)
1638 , array_extents.domain_offset(1)
1639 , array_extents.domain_offset(2)
1640 , array_extents.domain_offset(3)
1641 , array_extents.domain_offset(4)
1642 , array_extents.domain_offset(5)
1643 , array_extents.domain_offset(6)
1644 , array_extents.domain_offset(7) );
1645 dst.m_array_offset = dst_array_offset_type( src.m_array_offset ,
1649 const SubviewExtents< SrcTraits::rank , rank >
1650 extents( src.m_impl_offset.m_dim , arg0 , args... );
1652 dst.m_impl_offset = dst_offset_type( src.m_impl_offset , extents );
1653 dst.m_impl_handle = dst_handle_type( src.m_impl_handle + offset );
1654 dst.m_fad_size = src.m_fad_size;
1655 dst.m_original_fad_size = src.m_original_fad_size;
1656 dst.m_fad_stride = src.m_fad_stride;
1657 dst.m_fad_index = src.m_fad_index;
1672 template<
class DataType,
class ...P,
unsigned Stride >
1675 ViewTraits<DataType,P...> ,
1676 Sacado::Fad::Partition<Stride>
1681 enum { is_assignable =
true };
1682 enum { is_assignable_data_type =
true };
1684 typedef ViewTraits<DataType,P...> src_traits;
1685 typedef ViewMapping< src_traits , typename src_traits::specialize > src_type ;
1687 typedef typename src_type::offset_type::dimension_type src_dimension;
1688 typedef typename src_traits::value_type fad_type;
1689 typedef typename Sacado::LocalScalarType<fad_type,Stride>::type strided_fad_type;
1691 ViewDataType< strided_fad_type , src_dimension >::type strided_data_type;
1692 typedef ViewTraits<strided_data_type,P...> dst_traits;
1693 typedef View<strided_data_type,P...> type;
1694 typedef ViewMapping< dst_traits , typename dst_traits::specialize > dst_type ;
1697 void assign( dst_type & dst
1698 ,
const src_type & src
1699 ,
const Sacado::Fad::Partition<Stride> & part )
1701 if ( Stride != part.stride && Stride != 0 ) {
1702 Kokkos::abort(
"\n\n ****** Kokkos::View< Sacado::Fad ... > Invalid size in partitioned view assignment ******\n\n");
1704 if ( src.m_fad_stride != 1 ) {
1705 Kokkos::abort(
"\n\n ****** Kokkos::View< Sacado::Fad ... > Can't partition already partitioned view ******\n\n");
1708 dst.m_impl_handle = src.m_impl_handle ;
1709 dst.m_impl_offset = src.m_impl_offset ;
1710 dst.m_array_offset = src.m_array_offset ;
1715 (src.m_fad_size.value + part.stride-part.offset-1) / part.stride ;
1717 dst.m_original_fad_size = src.m_original_fad_size ;
1718 dst.m_fad_stride = part.stride ;
1719 dst.m_fad_index = part.offset ;
1726 #endif // defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
1728 #endif // defined(HAVE_SACADO_KOKKOSCORE)
Base template specification for whether a type is a Fad type.
GeneralFad< StaticStorage< T, Num > > SLFad
Base template specification for static size.
#define KOKKOS_INLINE_FUNCTION
#define KOKKOS_DEFAULTED_FUNCTION
GeneralFad< DynamicStorage< T > > DFad
#define KOKKOS_FORCEINLINE_FUNCTION
GeneralFad< StaticFixedStorage< T, Num > > SFad
Base template specification for testing whether type is statically sized.
Get view type for any Fad type.