29
29
30
30
#include < dpnp_iface.hpp>
31
31
#include " dpnp_fptr.hpp"
32
+ #include " dpnpc_memory_adapter.hpp"
32
33
#include " queue_sycl.hpp"
33
34
34
35
template <typename _DataType>
35
36
class dpnp_diagonal_c_kernel ;
36
37
37
38
template <typename _DataType>
38
39
void dpnp_diagonal_c (
39
- void * array1_in, void * result1, const size_t offset, size_t * shape, size_t * res_shape, const size_t res_ndim)
40
+ void * array1_in, const size_t input1_size, void * result1, const size_t offset, size_t * shape, size_t * res_shape, const size_t res_ndim)
40
41
{
41
- _DataType* array_1 = reinterpret_cast <_DataType*>(array1_in);
42
- _DataType* result = reinterpret_cast <_DataType*>(result1);
43
-
44
- size_t res_size = 1 ;
45
- for (size_t i = 0 ; i < res_ndim; ++i)
42
+ const size_t res_size = std::accumulate (res_shape, res_shape + res_ndim, 1 , std::multiplies<size_t >());
43
+ if (!(res_size && input1_size))
46
44
{
47
- res_size *= res_shape[i] ;
45
+ return ;
48
46
}
49
47
48
+ DPNPC_ptr_adapter<_DataType> input1_ptr (array1_in, input1_size, true );
49
+ DPNPC_ptr_adapter<_DataType> result_ptr (result1, res_size, true , true );
50
+ _DataType* array_1 = input1_ptr.get_ptr ();
51
+ _DataType* result = result_ptr.get_ptr ();
52
+
50
53
if (res_ndim <= 1 )
51
54
{
52
55
for (size_t i = 0 ; i < res_shape[res_ndim - 1 ]; ++i)
@@ -146,7 +149,14 @@ void dpnp_diagonal_c(
146
149
template <typename _DataType>
147
150
void dpnp_fill_diagonal_c (void * array1_in, void * val_in, size_t * shape, const size_t ndim)
148
151
{
149
- _DataType* array_1 = reinterpret_cast <_DataType*>(array1_in);
152
+ const size_t result_size = std::accumulate (shape, shape + ndim, 1 , std::multiplies<size_t >());
153
+ if (!(result_size && array1_in))
154
+ {
155
+ return ;
156
+ }
157
+
158
+ DPNPC_ptr_adapter<_DataType> result_ptr (array1_in, result_size, true , true );
159
+ _DataType* array_1 = result_ptr.get_ptr ();
150
160
_DataType* val_arr = reinterpret_cast <_DataType*>(val_in);
151
161
152
162
size_t min_shape = shape[0 ];
@@ -172,11 +182,12 @@ void dpnp_fill_diagonal_c(void* array1_in, void* val_in, size_t* shape, const si
172
182
}
173
183
array_1[ind] = val;
174
184
}
185
+
175
186
return ;
176
187
}
177
188
178
189
template <typename _DataType>
179
- void dpnp_nonzero_c (const void * in_array1, void * result1, const size_t * shape, const size_t ndim, const size_t j)
190
+ void dpnp_nonzero_c (const void * in_array1, void * result1, const size_t result_size, const size_t * shape, const size_t ndim, const size_t j)
180
191
{
181
192
if ((in_array1 == nullptr ) || (result1 == nullptr ))
182
193
{
@@ -188,22 +199,21 @@ void dpnp_nonzero_c(const void* in_array1, void* result1, const size_t* shape, c
188
199
return ;
189
200
}
190
201
191
- const _DataType* arr = reinterpret_cast <const _DataType*>(in_array1);
192
- long * result = reinterpret_cast <long *>(result1);
202
+ const size_t input1_size = std::accumulate (shape, shape + ndim, 1 , std::multiplies<size_t >());
203
+
204
+ DPNPC_ptr_adapter<_DataType> input1_ptr (in_array1, input1_size, true );
205
+ DPNPC_ptr_adapter<long > result_ptr (result1, result_size, true , true );
206
+ const _DataType* arr = input1_ptr.get_ptr ();
207
+ long * result = result_ptr.get_ptr ();
193
208
194
- size_t size = 1 ;
195
- for (size_t i = 0 ; i < ndim; ++i)
196
- {
197
- size *= shape[i];
198
- }
199
209
200
210
size_t idx = 0 ;
201
- for (size_t i = 0 ; i < size ; ++i)
211
+ for (size_t i = 0 ; i < input1_size ; ++i)
202
212
{
203
213
if (arr[i] != 0 )
204
214
{
205
215
size_t ids[ndim];
206
- size_t ind1 = size ;
216
+ size_t ind1 = input1_size ;
207
217
size_t ind2 = i;
208
218
for (size_t k = 0 ; k < ndim; ++k)
209
219
{
@@ -216,6 +226,7 @@ void dpnp_nonzero_c(const void* in_array1, void* result1, const size_t* shape, c
216
226
idx += 1 ;
217
227
}
218
228
}
229
+
219
230
return ;
220
231
}
221
232
@@ -226,13 +237,16 @@ void dpnp_place_c(void* arr_in, long* mask_in, void* vals_in, const size_t arr_s
226
237
{
227
238
return ;
228
239
}
229
- _DataType* arr = reinterpret_cast <_DataType*>(arr_in);
230
240
231
241
if (!vals_size)
232
242
{
233
243
return ;
234
244
}
235
- _DataType* vals = reinterpret_cast <_DataType*>(vals_in);
245
+
246
+ DPNPC_ptr_adapter<_DataType> input1_ptr (vals_in, vals_size, true );
247
+ DPNPC_ptr_adapter<_DataType> result_ptr (arr_in, arr_size, true , true );
248
+ _DataType* vals = input1_ptr.get_ptr ();
249
+ _DataType* arr = result_ptr.get_ptr ();
236
250
237
251
size_t counter = 0 ;
238
252
for (size_t i = 0 ; i < arr_size; ++i)
@@ -243,18 +257,15 @@ void dpnp_place_c(void* arr_in, long* mask_in, void* vals_in, const size_t arr_s
243
257
counter += 1 ;
244
258
}
245
259
}
260
+
246
261
return ;
247
262
}
248
263
249
264
template <typename _DataType, typename _IndecesType, typename _ValueType>
250
265
void dpnp_put_c (
251
266
void * array1_in, void * ind_in, void * v_in, const size_t size, const size_t size_ind, const size_t size_v)
252
267
{
253
- _DataType* array_1 = reinterpret_cast <_DataType*>(array1_in);
254
- size_t * ind = reinterpret_cast <size_t *>(ind_in);
255
- _DataType* v = reinterpret_cast <_DataType*>(v_in);
256
-
257
- if ((array_1 == nullptr ) || (ind == nullptr ) || (v == nullptr ))
268
+ if ((array1_in == nullptr ) || (ind_in == nullptr ) || (v_in == nullptr ))
258
269
{
259
270
return ;
260
271
}
@@ -264,6 +275,13 @@ void dpnp_put_c(
264
275
return ;
265
276
}
266
277
278
+ DPNPC_ptr_adapter<size_t > input1_ptr (ind_in, size_ind, true );
279
+ DPNPC_ptr_adapter<_DataType> input2_ptr (v_in, size_v, true );
280
+ DPNPC_ptr_adapter<_DataType> result_ptr (array1_in, size, true , true );
281
+ size_t * ind = input1_ptr.get_ptr ();
282
+ _DataType* v = input2_ptr.get_ptr ();
283
+ _DataType* array_1 = result_ptr.get_ptr ();
284
+
267
285
for (size_t i = 0 ; i < size; ++i)
268
286
{
269
287
for (size_t j = 0 ; j < size_ind; ++j)
@@ -274,6 +292,7 @@ void dpnp_put_c(
274
292
}
275
293
}
276
294
}
295
+
277
296
return ;
278
297
}
279
298
@@ -287,18 +306,16 @@ void dpnp_put_along_axis_c(void* arr_in,
287
306
size_t size_indices,
288
307
size_t values_size)
289
308
{
290
- _DataType* arr = reinterpret_cast <_DataType*>(arr_in);
291
- size_t * indices = reinterpret_cast <size_t *>(indices_in);
292
- _DataType* values = reinterpret_cast <_DataType*>(values_in);
293
-
294
309
size_t res_ndim = ndim - 1 ;
295
310
size_t res_shape[res_ndim];
311
+ const size_t size_arr = std::accumulate (shape, shape + ndim, 1 , std::multiplies<size_t >());
296
312
297
- size_t size_arr = 1 ;
298
- for (size_t i = 0 ; i < ndim; ++i)
299
- {
300
- size_arr *= shape[i];
301
- }
313
+ DPNPC_ptr_adapter<size_t > input1_ptr (indices_in, size_indices, true );
314
+ DPNPC_ptr_adapter<_DataType> input2_ptr (values_in, values_size, true );
315
+ DPNPC_ptr_adapter<_DataType> result_ptr (arr_in, size_arr, true , true );
316
+ size_t * indices = input1_ptr.get_ptr ();
317
+ _DataType* values = input2_ptr.get_ptr ();
318
+ _DataType* arr = result_ptr.get_ptr ();
302
319
303
320
if (axis != res_ndim)
304
321
{
@@ -459,11 +476,13 @@ template <typename _DataType, typename _IndecesType>
459
476
class dpnp_take_c_kernel ;
460
477
461
478
template <typename _DataType, typename _IndecesType>
462
- void dpnp_take_c (void * array1_in, void * indices1, void * result1, size_t size)
479
+ void dpnp_take_c (void * array1_in, const size_t array1_size, void * indices1, void * result1, size_t size)
463
480
{
464
- _DataType* array_1 = reinterpret_cast <_DataType*>(array1_in);
481
+ DPNPC_ptr_adapter<_DataType> input1_ptr (array1_in, array1_size, true );
482
+ DPNPC_ptr_adapter<_IndecesType> input2_ptr (indices1, size);
483
+ _DataType* array_1 = input1_ptr.get_ptr ();
484
+ _IndecesType* indices = input2_ptr.get_ptr ();
465
485
_DataType* result = reinterpret_cast <_DataType*>(result1);
466
- _IndecesType* indices = reinterpret_cast <_IndecesType*>(indices1);
467
486
468
487
cl::sycl::range<1 > gws (size);
469
488
auto kernel_parallel_for_func = [=](cl::sycl::id<1 > global_id) {
0 commit comments