XGCa
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
array_deep_copy.hpp
Go to the documentation of this file.
1 #ifndef ARRAY_DEEP_COPY_HPP
2 #define ARRAY_DEEP_COPY_HPP
3 #include "space_settings.hpp"
4 
5 // Facilitate deep_copy from Kokkos view to C/Fortran array and vice versa by wrapping the arrays in an
6 // unmanaged Kokkos View. The onus is on the user of these functions to ensure the array is the same dimensions
7 // as the View.
8 
9 // Device to host:
10 template<typename T, typename Device>
11 inline void array_deep_copy(T* array, const Kokkos::View<T*,Kokkos::LayoutRight,Device>& view){
12  Kokkos::View<T*,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
13  array,view.extent(0));
14  Kokkos::deep_copy(array_view, view);
15 }
16 
17 template<typename T, typename Device>
18 inline void array_deep_copy(T* array, const Kokkos::View<T**,Kokkos::LayoutRight,Device>& view){
19  Kokkos::View<T**,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
20  array,view.extent(0),view.extent(1));
21  Kokkos::deep_copy(array_view, view);
22 }
23 
24 template<typename T, typename Device>
25 inline void array_deep_copy(T* array, const Kokkos::View<T***,Kokkos::LayoutRight,Device>& view){
26  Kokkos::View<T***,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
27  array,view.extent(0),view.extent(1),view.extent(2));
28  Kokkos::deep_copy(array_view, view);
29 }
30 
31 template<typename T, typename Device>
32 inline void array_deep_copy(T* array, const Kokkos::View<T****,Kokkos::LayoutRight,Device>& view){
33  Kokkos::View<T****,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
34  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3));
35  Kokkos::deep_copy(array_view, view);
36 }
37 
38 template<typename T, typename Device>
39 inline void array_deep_copy(T* array, const Kokkos::View<T*****,Kokkos::LayoutRight,Device>& view){
40  Kokkos::View<T*****,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
41  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3),view.extent(4));
42  Kokkos::deep_copy(array_view, view);
43 }
44 
45 template<typename T, typename Device>
46 inline void array_deep_copy(T* array, const Kokkos::View<T******,Kokkos::LayoutRight,Device>& view){
47  Kokkos::View<T******,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
48  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3),view.extent(4),view.extent(5));
49  Kokkos::deep_copy(array_view, view);
50 }
51 
52 // And host to device:
53 template<typename T, typename Device>
54 inline void array_deep_copy(const Kokkos::View<T*,Kokkos::LayoutRight,Device>& view, T* array){
55  Kokkos::View<T*,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
56  array,view.extent(0));
57  Kokkos::deep_copy(view, array_view);
58 }
59 
60 template<typename T, typename Device>
61 inline void array_deep_copy(const Kokkos::View<T**,Kokkos::LayoutRight,Device>& view, T* array){
62  Kokkos::View<T**,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
63  array,view.extent(0),view.extent(1));
64  Kokkos::deep_copy(view, array_view);
65 }
66 
67 template<typename T, typename Device>
68 inline void array_deep_copy(const Kokkos::View<T***,Kokkos::LayoutRight,Device>& view, T* array){
69  Kokkos::View<T***,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
70  array,view.extent(0),view.extent(1),view.extent(2));
71  Kokkos::deep_copy(view, array_view);
72 }
73 
74 template<typename T, typename Device>
75 inline void array_deep_copy(const Kokkos::View<T****,Kokkos::LayoutRight,Device>& view, T* array){
76  Kokkos::View<T****,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
77  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3));
78  Kokkos::deep_copy(view, array_view);
79 }
80 
81 template<typename T, typename Device>
82 inline void array_deep_copy(const Kokkos::View<T*****,Kokkos::LayoutRight,Device>& view, T* array){
83  Kokkos::View<T*****,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
84  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3),view.extent(4));
85  Kokkos::deep_copy(view, array_view);
86 }
87 
88 template<typename T, typename Device>
89 inline void array_deep_copy(const Kokkos::View<T******,Kokkos::LayoutRight,Device>& view, T* array){
90  Kokkos::View<T******,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
91  array,view.extent(0),view.extent(1),view.extent(2),view.extent(3),view.extent(4),view.extent(5));
92  Kokkos::deep_copy(view, array_view);
93 }
94 
95 
96 /*** Deep copy from subset of array ***/
97 
98 // Uses the input (isp) as the last index of the array
99 
100 // Device to host:
101 template<typename T>
102 inline void subarray_deep_copy(T* array, const Kokkos::View<T*,Kokkos::LayoutRight,DeviceType>& view, int isp){
103  Kokkos::View<T*,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
104  array + view.size()*isp,view.extent(0));
105  Kokkos::deep_copy(array_view, view);
106 }
107 
108 template<typename T>
109 inline void subarray_deep_copy(T* array, const Kokkos::View<T***,Kokkos::LayoutRight,DeviceType>& view, int isp){
110  Kokkos::View<T***,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
111  array + view.size()*isp,view.extent(0),view.extent(1),view.extent(2));
112  Kokkos::deep_copy(array_view, view);
113 }
114 
115 // And host to device:
116 template<typename T>
117 inline void subarray_deep_copy(const Kokkos::View<T*,Kokkos::LayoutRight,DeviceType>& view, T* array, int isp){
118  Kokkos::View<T*,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
119  array + view.size()*isp,view.extent(0));
120  Kokkos::deep_copy(view, array_view);
121 }
122 
123 template<typename T>
124 inline void subarray_deep_copy(const Kokkos::View<T***,Kokkos::LayoutRight,DeviceType>& view, T* array, int isp){
125  Kokkos::View<T***,Kokkos::LayoutRight, Kokkos::HostSpace, Kokkos::MemoryTraits<Kokkos::Unmanaged>> array_view(
126  array + view.size()*isp,view.extent(0),view.extent(1),view.extent(2));
127  Kokkos::deep_copy(view, array_view);
128 }
129 
130 
131 
132 
133 #endif
void array_deep_copy(T *array, const Kokkos::View< T *, Kokkos::LayoutRight, Device > &view)
Definition: array_deep_copy.hpp:11
void subarray_deep_copy(T *array, const Kokkos::View< T *, Kokkos::LayoutRight, DeviceType > &view, int isp)
Definition: array_deep_copy.hpp:102