Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Kokkos_View_Fad_Fwd.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Sacado Package
4 //
5 // Copyright 2006 NTESS and the Sacado contributors.
6 // SPDX-License-Identifier: LGPL-2.1-or-later
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef KOKKOS_VIEW_FAD_FWD_HPP
11 #define KOKKOS_VIEW_FAD_FWD_HPP
12 
13 #include "Sacado_ConfigDefs.h"
14 #if defined(HAVE_SACADO_KOKKOS)
15 
16 // We are hooking into Kokkos Core internals here
17 // Need to define this macro since we include non-public headers
18 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
19 #define KOKKOS_IMPL_PUBLIC_INCLUDE
20 #define KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
21 #endif
22 // Only include forward declarations so any overloads appear before they
23 // might be used inside Kokkos
24 #include "Kokkos_Core_fwd.hpp"
25 #include "Kokkos_View.hpp"
26 #ifdef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
27 #undef KOKKOS_IMPL_PUBLIC_INCLUDE
28 #undef KOKKOS_IMPL_PUBLIC_INCLUDE_NOTDEFINED_CORE
29 #endif
30 
31 #if (KOKKOS_VERSION > 40700) && !defined(KOKKOS_ENABLE_IMPL_VIEW_LEGACY) \
32 && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
33 #define SACADO_HAS_NEW_KOKKOS_VIEW_IMPL
34 #endif
35 
36 
37 #ifdef SACADO_HAS_NEW_KOKKOS_VIEW_IMPL
38 namespace Sacado {
39 
40 // Whether a given type is a view with Sacado FAD scalar type
41 template <typename view_type>
42 struct is_view_fad;
43 
44 }
45 
46 namespace Kokkos {
47 using Sacado::is_view_fad;
48 }
49 #else
50 namespace Kokkos {
51 
52 // Whether a given type is a view with Sacado FAD scalar type
53 template <typename view_type>
54 struct is_view_fad;
55 
56 }
57 #endif
58 
59 #ifndef SACADO_HAS_NEW_KOKKOS_VIEW_IMPL
60 // Make sure the user really wants these View specializations
61 #if defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
62 
63 namespace Kokkos {
64 namespace Impl {
65 
66 struct ViewSpecializeSacadoFad;
67 struct ViewSpecializeSacadoFadContiguous;
68 
69 // Overload view_copy for Fad View's:
70 // 1. Should be faster than using Fad directly
71 // 2. Fixes issues with hierarchical parallelism since the default
72 // implementation uses MDRangePolicy which doesn't work with hierarchical
73 // parallelism.
74 // Needs to go before include of Kokkos_Core.hpp so it is in scope when
75 // Kokkos_CopyViews.hpp is included by Kokkos_Core.hpp, which internally
76 // calls view_copy().
77 template<class DT, class ... DP,
78  class ST, class ... SP>
79 typename std::enable_if< is_view_fad< Kokkos::View<DT,DP...> >::value &&
80  is_view_fad< Kokkos::View<ST,SP...> >::value
81  >::type
82 view_copy(const Kokkos::View<DT,DP...>& dst, const Kokkos::View<ST,SP...>& src);
83 
84 template<class ExecutionSpace,
85  class DT, class ... DP,
86  class ST, class ... SP>
87 typename std::enable_if< is_view_fad< Kokkos::View<DT,DP...> >::value &&
88  is_view_fad< Kokkos::View<ST,SP...> >::value
89  >::type
90 view_copy(const ExecutionSpace& space,
91  const Kokkos::View<DT,DP...>& dst, const Kokkos::View<ST,SP...>& src);
92 
93 template<class Space, class T, class ... P>
94 struct MirrorViewType;
95 
96 } // namespace Impl
97 
98 // Declare overloads of create_mirror() so they are in scope
99 // Kokkos_Core.hpp is included later
100 
101 template< class T , class ... P >
102 inline
103 typename std::enable_if<
104  ( std::is_same< typename ViewTraits<T,P...>::specialize ,
105  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
106  std::is_same< typename ViewTraits<T,P...>::specialize ,
107  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
108  !std::is_same< typename Kokkos::ViewTraits<T,P...>::array_layout,
109  Kokkos::LayoutStride >::value,
110  typename Kokkos::View<T,P...>::host_mirror_type>::type
111 create_mirror(const Kokkos::View<T,P...> & src);
112 
113 template< class T , class ... P >
114 inline
115 typename std::enable_if<
116  ( std::is_same< typename ViewTraits<T,P...>::specialize ,
117  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
118  std::is_same< typename ViewTraits<T,P...>::specialize ,
119  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
120  std::is_same< typename Kokkos::ViewTraits<T,P...>::array_layout,
121  Kokkos::LayoutStride >::value,
122  typename Kokkos::View<T,P...>::host_mirror_type>::type
123 create_mirror(const Kokkos::View<T,P...> & src);
124 
125 template<class Space, class T, class ... P,
127 typename std::enable_if<
128  std::is_same< typename ViewTraits<T,P...>::specialize ,
129  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
130  std::is_same< typename ViewTraits<T,P...>::specialize ,
131  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value,
132  typename Impl::MirrorViewType<Space,T,P ...>::dest_view_type>::type
133 create_mirror(const Space&, const Kokkos::View<T,P...> & src);
134 
135 template< class T , class ... P >
136 inline
137 typename std::enable_if<
138  ( std::is_same< typename ViewTraits<T,P...>::specialize ,
139  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
140  std::is_same< typename ViewTraits<T,P...>::specialize ,
141  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
142  !std::is_same< typename Kokkos::ViewTraits<T,P...>::array_layout,
143  Kokkos::LayoutStride >::value,
144  typename Kokkos::View<T,P...>::host_mirror_type>::type
145 create_mirror(Kokkos::Impl::WithoutInitializing_t wi,
146  const Kokkos::View<T,P...> & src);
147 
148 template< class T , class ... P >
149 inline
150 typename std::enable_if<
151  ( std::is_same< typename ViewTraits<T,P...>::specialize ,
152  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
153  std::is_same< typename ViewTraits<T,P...>::specialize ,
154  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
155  std::is_same< typename Kokkos::ViewTraits<T,P...>::array_layout,
156  Kokkos::LayoutStride >::value,
157  typename Kokkos::View<T,P...>::host_mirror_type>::type
158 create_mirror(Kokkos::Impl::WithoutInitializing_t wi,
159  const Kokkos::View<T,P...> & src);
160 
161 template<class Space, class T, class ... P,
163 typename std::enable_if<
164  ( std::is_same< typename ViewTraits<T,P...>::specialize ,
165  Kokkos::Impl::ViewSpecializeSacadoFad >::value ||
166  std::is_same< typename ViewTraits<T,P...>::specialize ,
167  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ),
168  typename Impl::MirrorViewType<Space,T,P ...>::dest_view_type>::type
169 create_mirror(Kokkos::Impl::WithoutInitializing_t wi,
170  const Space&, const Kokkos::View<T,P...> & src);
171 
172 template <class Space, class T, class... P>
173 typename Impl::MirrorViewType<Space, T, P...>::view_type
174 create_mirror_view_and_copy(
175  const Space&, const Kokkos::View<T, P...>& src,
176  std::string const& name = "",
177  typename std::enable_if<
178  ( std::is_same<typename ViewTraits<T, P...>::specialize,
179  Kokkos::Impl::ViewSpecializeSacadoFad>::value ||
180  std::is_same< typename ViewTraits<T,P...>::specialize ,
181  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
182  Impl::MirrorViewType<Space, T, P...>::is_same_memspace>::type* =
183  nullptr);
184 
185 template <class Space, class T, class... P>
186 typename Impl::MirrorViewType<Space, T, P...>::view_type
187 create_mirror_view_and_copy(
188  const Space&, const Kokkos::View<T, P...>& src,
189  std::string const& name = "",
190  typename std::enable_if<
191  ( std::is_same<typename ViewTraits<T, P...>::specialize,
192  Kokkos::Impl::ViewSpecializeSacadoFad>::value ||
193  std::is_same< typename ViewTraits<T,P...>::specialize ,
194  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value ) &&
195  !Impl::MirrorViewType<Space, T, P...>::is_same_memspace>::type* =
196  nullptr);
197 
198 namespace Impl {
199 
200 template <unsigned N, typename... Args>
201 KOKKOS_FUNCTION std::enable_if_t<
202  N == View<Args...>::Rank &&
203  (std::is_same<typename ViewTraits<Args...>::specialize,
204  Kokkos::Impl::ViewSpecializeSacadoFad>::value ||
205  std::is_same<typename ViewTraits<Args...>::specialize,
206  Kokkos::Impl::ViewSpecializeSacadoFadContiguous>::value),
207  View<Args...>>
208 as_view_of_rank_n(View<Args...> v);
209 
210 // Placeholder implementation to compile generic code for DynRankView; should
211 // never be called
212 template <unsigned N, typename T, typename... Args>
213 std::enable_if_t<
214  N != View<T, Args...>::Rank &&
215  (std::is_same<typename ViewTraits<T, Args...>::specialize,
216  Kokkos::Impl::ViewSpecializeSacadoFad>::value ||
217  std::is_same<typename ViewTraits<T, Args...>::specialize,
218  Kokkos::Impl::ViewSpecializeSacadoFadContiguous>::value),
219  View<typename RankDataType<typename View<T, Args...>::value_type, N>::type,
220  Args...>>
221 as_view_of_rank_n(View<T, Args...>);
222 
223 }
224 
225 namespace Experimental {
226 
227 template <class DT, class... DP>
228 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
229  const View<DT, DP...>& dst,
230  typename ViewTraits<DT, DP...>::const_value_type& value,
231  typename std::enable_if<(
232  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
233  Kokkos::Impl::ViewSpecializeSacadoFad >::value
234  ||
235  std::is_same< typename ViewTraits<DT,DP...>::specialize,
236  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
237  && (unsigned(ViewTraits<DT, DP...>::rank) == 1))>::type* = nullptr);
238 
239 template <class DT, class... DP>
240 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
241  const View<DT, DP...>& dst,
242  typename ViewTraits<DT, DP...>::const_value_type& value,
243  typename std::enable_if<(
244  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
245  Kokkos::Impl::ViewSpecializeSacadoFad >::value
246  ||
247  std::is_same< typename ViewTraits<DT,DP...>::specialize,
248  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
249  && (unsigned(ViewTraits<DT, DP...>::rank) == 2))>::type* = nullptr);
250 
251 template <class DT, class... DP>
252 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
253  const View<DT, DP...>& dst,
254  typename ViewTraits<DT, DP...>::const_value_type& value,
255  typename std::enable_if<(
256  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
257  Kokkos::Impl::ViewSpecializeSacadoFad >::value
258  ||
259  std::is_same< typename ViewTraits<DT,DP...>::specialize,
260  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
261  && (unsigned(ViewTraits<DT, DP...>::rank) == 3))>::type* = nullptr);
262 
263 template <class DT, class... DP>
264 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
265  const View<DT, DP...>& dst,
266  typename ViewTraits<DT, DP...>::const_value_type& value,
267  typename std::enable_if<(
268  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
269  Kokkos::Impl::ViewSpecializeSacadoFad >::value
270  ||
271  std::is_same< typename ViewTraits<DT,DP...>::specialize,
272  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
273  && (unsigned(ViewTraits<DT, DP...>::rank) == 4))>::type* = nullptr);
274 
275 template <class DT, class... DP>
276 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
277  const View<DT, DP...>& dst,
278  typename ViewTraits<DT, DP...>::const_value_type& value,
279  typename std::enable_if<(
280  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
281  Kokkos::Impl::ViewSpecializeSacadoFad >::value
282  ||
283  std::is_same< typename ViewTraits<DT,DP...>::specialize,
284  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
285  && (unsigned(ViewTraits<DT, DP...>::rank) == 5))>::type* = nullptr);
286 
287 template <class DT, class... DP>
288 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
289  const View<DT, DP...>& dst,
290  typename ViewTraits<DT, DP...>::const_value_type& value,
291  typename std::enable_if<(
292  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
293  Kokkos::Impl::ViewSpecializeSacadoFad >::value
294  ||
295  std::is_same< typename ViewTraits<DT,DP...>::specialize,
296  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
297  && (unsigned(ViewTraits<DT, DP...>::rank) == 6))>::type* = nullptr);
298 
299 template <class DT, class... DP>
300 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
301  const View<DT, DP...>& dst,
302  typename ViewTraits<DT, DP...>::const_value_type& value,
303  typename std::enable_if<(
304  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
305  Kokkos::Impl::ViewSpecializeSacadoFad >::value
306  ||
307  std::is_same< typename ViewTraits<DT,DP...>::specialize,
308  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
309  && (unsigned(ViewTraits<DT, DP...>::rank) == 7))>::type* = nullptr);
310 
311 template <class TeamType, class DT, class... DP>
312 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
313  const TeamType& team, const View<DT, DP...>& dst,
314  typename ViewTraits<DT, DP...>::const_value_type& value,
315  typename std::enable_if<(
316  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
317  Kokkos::Impl::ViewSpecializeSacadoFad >::value
318  ||
319  std::is_same< typename ViewTraits<DT,DP...>::specialize,
320  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
321  && (unsigned(ViewTraits<DT, DP...>::rank) == 1))>::type* = nullptr);
322 
323 template <class TeamType, class DT, class... DP>
324 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
325  const TeamType& team, const View<DT, DP...>& dst,
326  typename ViewTraits<DT, DP...>::const_value_type& value,
327  typename std::enable_if<(
328  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
329  Kokkos::Impl::ViewSpecializeSacadoFad >::value
330  ||
331  std::is_same< typename ViewTraits<DT,DP...>::specialize,
332  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
333  && (unsigned(ViewTraits<DT, DP...>::rank) == 2))>::type* = nullptr);
334 
335 template <class TeamType, class DT, class... DP>
336 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
337  const TeamType& team, const View<DT, DP...>& dst,
338  typename ViewTraits<DT, DP...>::const_value_type& value,
339  typename std::enable_if<(
340  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
341  Kokkos::Impl::ViewSpecializeSacadoFad >::value
342  ||
343  std::is_same< typename ViewTraits<DT,DP...>::specialize,
344  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
345  && (unsigned(ViewTraits<DT, DP...>::rank) == 3))>::type* = nullptr);
346 
347 template <class TeamType, class DT, class... DP>
348 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
349  const TeamType& team, const View<DT, DP...>& dst,
350  typename ViewTraits<DT, DP...>::const_value_type& value,
351  typename std::enable_if<(
352  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
353  Kokkos::Impl::ViewSpecializeSacadoFad >::value
354  ||
355  std::is_same< typename ViewTraits<DT,DP...>::specialize,
356  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
357  && (unsigned(ViewTraits<DT, DP...>::rank) == 4))>::type* = nullptr);
358 
359 template <class TeamType, class DT, class... DP>
360 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
361  const TeamType& team, const View<DT, DP...>& dst,
362  typename ViewTraits<DT, DP...>::const_value_type& value,
363  typename std::enable_if<(
364  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
365  Kokkos::Impl::ViewSpecializeSacadoFad >::value
366  ||
367  std::is_same< typename ViewTraits<DT,DP...>::specialize,
368  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
369  && (unsigned(ViewTraits<DT, DP...>::rank) == 5))>::type* = nullptr);
370 
371 template <class TeamType, class DT, class... DP>
372 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
373  const TeamType& team, const View<DT, DP...>& dst,
374  typename ViewTraits<DT, DP...>::const_value_type& value,
375  typename std::enable_if<(
376  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
377  Kokkos::Impl::ViewSpecializeSacadoFad >::value
378  ||
379  std::is_same< typename ViewTraits<DT,DP...>::specialize,
380  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
381  && (unsigned(ViewTraits<DT, DP...>::rank) == 6))>::type* = nullptr);
382 
383 template <class TeamType, class DT, class... DP>
384 void KOKKOS_INLINE_FUNCTION local_deep_copy_contiguous(
385  const TeamType& team, const View<DT, DP...>& dst,
386  typename ViewTraits<DT, DP...>::const_value_type& value,
387  typename std::enable_if<(
388  ( std::is_same< typename ViewTraits<DT,DP...>::specialize,
389  Kokkos::Impl::ViewSpecializeSacadoFad >::value
390  ||
391  std::is_same< typename ViewTraits<DT,DP...>::specialize,
392  Kokkos::Impl::ViewSpecializeSacadoFadContiguous >::value )
393  && (unsigned(ViewTraits<DT, DP...>::rank) == 7))>::type* = nullptr);
394 
395 }
396 
397 } // namespace Kokkos
398 
399 #endif // defined(HAVE_SACADO_VIEW_SPEC) && !defined(SACADO_DISABLE_FAD_VIEW_SPEC)
400 #endif
401 
402 #endif // defined(HAVE_SACADO_KOKKOS)
403 
404 #endif /* #ifndef KOKKOS_VIEW_FAD_FWD_HPP */
#define T
Definition: Sacado_rad.hpp:553
int value
const int N