1
/* -*- c++ -*- ----------------------------------------------------------
2
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
3
http://lammps.sandia.gov, Sandia National Laboratories
4
Steve Plimpton, sjplimp@sandia.gov
6
Copyright (2003) Sandia Corporation. Under the terms of Contract
7
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
8
certain rights in this software. This software is distributed under
9
the GNU General Public License.
11
See the README file in the top-level LAMMPS directory.
12
------------------------------------------------------------------------- */
14
/* ----------------------------------------------------------------------
15
Kokkos versions of create/grow/destroy multi-dimensional arrays
16
------------------------------------------------------------------------- */
18
/* ----------------------------------------------------------------------
20
------------------------------------------------------------------------- */
22
template <typename TYPE>
23
TYPE create_kokkos(TYPE &data, typename TYPE::value_type *&array,
24
int n1, const char *name)
27
array = data.h_view.ptr_on_device();
31
template <typename TYPE, typename HTYPE>
32
TYPE create_kokkos(TYPE &data, HTYPE &h_data,
33
typename TYPE::value_type *&array, int n1,
36
data = TYPE(std::string(name),n1);
37
#ifndef KOKKOS_USE_CUDA_UVM
38
h_data = Kokkos::create_mirror_view(data);
42
array = h_data.ptr_on_device();
47
template <typename TYPE, typename HTYPE>
48
TYPE create_kokkos(TYPE &data, HTYPE &h_data,
49
int n1, const char *name)
51
data = TYPE(std::string(name),n1);
52
#ifndef KOKKOS_USE_CUDA_UVM
53
h_data = Kokkos::create_mirror_view(data);
60
/* ----------------------------------------------------------------------
61
grow or shrink 1st dim of a 1d array
62
last dim must stay the same
63
------------------------------------------------------------------------- */
65
template <typename TYPE>
66
TYPE grow_kokkos(TYPE &data, typename TYPE::value_type *&array,
67
int n1, const char *name)
69
if (array == NULL) return create_kokkos(data,array,n1,name);
72
array = data.h_view.ptr_on_device();
76
template <typename TYPE>
77
void destroy_kokkos(TYPE data, typename TYPE::value_type* &array)
79
if (array == NULL) return;
84
/* ----------------------------------------------------------------------
86
------------------------------------------------------------------------- */
88
template <typename TYPE>
89
TYPE destroy_kokkos(TYPE &data)
91
/*if(data.ptr_on_device()!=NULL)
92
free(data.ptr_on_device());*/
97
template <typename TYPE>
98
TYPE create_kokkos(TYPE &data, int n1, const char *name)
100
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
101
malloc(n1*sizeof(typename TYPE::non_const_value_type)*4);*/
102
data = TYPE(std::string(name),n1);
106
template <typename TYPE>
107
TYPE create_kokkos(TYPE &data, int n1, int n2, const char *name)
109
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
110
malloc(n1*n2*sizeof(typename TYPE::non_const_value_type)*4);*/
111
data = TYPE(std::string(name),n1,n2);
115
template <typename TYPE>
116
TYPE create_kokkos(TYPE &data, int n1, int n2, int n3 ,const char *name)
118
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
119
malloc(n1*n2*n3*sizeof(typename TYPE::non_const_value_type)*4);*/
120
data = TYPE(std::string(name),n1,n2,n3);
124
template <typename TYPE>
125
TYPE create_kokkos(TYPE &data, int n1, int n2, int n3, int n4 ,const char *name)
127
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
128
malloc(n1*n2*n3*n4*sizeof(typename TYPE::non_const_value_type)*4);*/
129
data = TYPE(std::string(name),n1,n2,n3,n4);
133
template <typename TYPE>
134
TYPE create_kokkos(TYPE &data, int n1, int n2, int n3, int n4, int n5 ,const char *name)
136
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
137
malloc(n1*n2*n3*n4*n5*sizeof(typename TYPE::non_const_value_type)*4);*/
138
data = TYPE(std::string(name),n1,n2,n3,n4,n5);
142
template <typename TYPE>
143
TYPE create_kokkos(TYPE &data, int n1, int n2, int n3, int n4, int n5 , int n6 ,const char *name)
145
/*typename TYPE::non_const_value_type* ptr = (typename TYPE::non_const_value_type*)
146
malloc(n1*n2*n3*n4*n5*n6*sizeof(typename TYPE::non_const_value_type)*4);*/
147
data = TYPE(std::string(name) ,n1,n2,n3,n4,n5,n6);
153
template <typename TYPE, typename HTYPE>
154
TYPE create_kokkos(TYPE &data, HTYPE &h_data, int n1, int n2,
157
data = TYPE(std::string(name),n1,n2);
158
#ifndef KOKKOS_USE_CUDA_UVM
159
h_data = Kokkos::create_mirror_view(data);
166
template <typename TYPE>
167
TYPE create_kokkos(TYPE &data, typename TYPE::value_type **&array,
168
int n1, int n2, const char *name)
170
data = TYPE(std::string(name),n1,n2);
171
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
172
array = (typename TYPE::value_type **) smalloc(nbytes,name);
175
for (int i = 0; i < n1; i++) {
176
array[i] = &data.h_view(i,0);
182
template <typename TYPE, typename HTYPE>
183
TYPE create_kokkos(TYPE &data, HTYPE &h_data,
184
typename TYPE::value_type **&array, int n1, int n2,
187
data = TYPE(std::string(name),n1,n2);
188
#ifndef KOKKOS_USE_CUDA_UVM
189
h_data = Kokkos::create_mirror_view(data);
193
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
194
array = (typename TYPE::value_type **) smalloc(nbytes,name);
197
for (int i = 0; i < n1; i++) {
198
array[i] = &h_data(i,0);
204
/* ----------------------------------------------------------------------
205
grow or shrink 1st dim of a 2d array
206
last dim must stay the same
207
------------------------------------------------------------------------- */
209
template <typename TYPE>
210
TYPE grow_kokkos(TYPE &data, typename TYPE::value_type **&array,
211
int n1, int n2, const char *name)
213
if (array == NULL) return create_kokkos(data,array,n1,n2,name);
215
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
216
array = (typename TYPE::value_type**) srealloc(array,nbytes,name);
218
for (int i = 0; i < n1; i++)
219
array[i] = &data.h_view(i,0);
224
template <typename TYPE>
225
TYPE create_kokkos(TYPE &data, typename TYPE::value_type **&array,
226
int n1, const char *name)
228
data = TYPE(std::string(name),n1);
229
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
230
array = (typename TYPE::value_type **) smalloc(nbytes,name);
232
for (int i = 0; i < n1; i++)
233
array[i] = &data.h_view(i,0);
238
template <typename TYPE>
239
TYPE grow_kokkos(TYPE &data, typename TYPE::value_type **&array,
240
int n1, const char *name)
242
if (array == NULL) return create_kokkos(data,array,n1,name);
246
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
247
array = (typename TYPE::value_type **) smalloc(nbytes,name);
249
for (int i = 0; i < n1; i++)
250
array[i] = &data.h_view(i,0);
255
/* ----------------------------------------------------------------------
257
------------------------------------------------------------------------- */
259
template <typename TYPE>
260
void destroy_kokkos(TYPE data, typename TYPE::value_type** &array)
262
if (array == NULL) return;