Skip to content

Commit e5b088c

Browse files
Merge pull request #1218 from IntelPython/use_dpctl_full
Use full() function from dpctl.tensor
2 parents eeab8dd + 3e0e79c commit e5b088c

13 files changed

+224
-164
lines changed

dpnp/backend/include/dpnp_iface_fptr.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,7 @@ enum class DPNPFuncName : size_t
178178
DPNP_FN_FMOD, /**< Used in numpy.fmod() impl */
179179
DPNP_FN_FMOD_EXT, /**< Used in numpy.fmod() impl, requires extra parameters */
180180
DPNP_FN_FULL, /**< Used in numpy.full() impl */
181-
DPNP_FN_FULL_EXT, /**< Used in numpy.full() impl, requires extra parameters */
182181
DPNP_FN_FULL_LIKE, /**< Used in numpy.full_like() impl */
183-
DPNP_FN_FULL_LIKE_EXT, /**< Used in numpy.full_like() impl, requires extra parameters */
184182
DPNP_FN_HYPOT, /**< Used in numpy.hypot() impl */
185183
DPNP_FN_HYPOT_EXT, /**< Used in numpy.hypot() impl, requires extra parameters */
186184
DPNP_FN_IDENTITY, /**< Used in numpy.identity() impl */

dpnp/backend/kernels/dpnp_krnl_arraycreation.cpp

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -313,18 +313,12 @@ void dpnp_full_c(void* array_in, void* result, const size_t size)
313313
size,
314314
dep_event_vec_ref);
315315
DPCTLEvent_WaitAndThrow(event_ref);
316+
DPCTLEvent_Delete(event_ref);
316317
}
317318

318319
template <typename _DataType>
319320
void (*dpnp_full_default_c)(void*, void*, const size_t) = dpnp_full_c<_DataType>;
320321

321-
template <typename _DataType>
322-
DPCTLSyclEventRef (*dpnp_full_ext_c)(DPCTLSyclQueueRef,
323-
void*,
324-
void*,
325-
const size_t,
326-
const DPCTLEventVectorRef) = dpnp_full_c<_DataType>;
327-
328322
template <typename _DataType>
329323
DPCTLSyclEventRef dpnp_full_like_c(DPCTLSyclQueueRef q_ref,
330324
void* array_in,
@@ -346,18 +340,12 @@ void dpnp_full_like_c(void* array_in, void* result, const size_t size)
346340
size,
347341
dep_event_vec_ref);
348342
DPCTLEvent_WaitAndThrow(event_ref);
343+
DPCTLEvent_Delete(event_ref);
349344
}
350345

351346
template <typename _DataType>
352347
void (*dpnp_full_like_default_c)(void*, void*, const size_t) = dpnp_full_like_c<_DataType>;
353348

354-
template <typename _DataType>
355-
DPCTLSyclEventRef (*dpnp_full_like_ext_c)(DPCTLSyclQueueRef,
356-
void*,
357-
void*,
358-
const size_t,
359-
const DPCTLEventVectorRef) = dpnp_full_like_c<_DataType>;
360-
361349
template <typename _KernelNameSpecialization>
362350
class dpnp_identity_c_kernel;
363351

@@ -1338,14 +1326,6 @@ void func_map_init_arraycreation(func_map_t& fmap)
13381326
fmap[DPNPFuncName::DPNP_FN_FULL][eft_C128][eft_C128] = {eft_C128,
13391327
(void*)dpnp_full_default_c<std::complex<double>>};
13401328

1341-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_full_ext_c<int32_t>};
1342-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_full_ext_c<int64_t>};
1343-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_full_ext_c<float>};
1344-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_DBL][eft_DBL] = {eft_DBL, (void*)dpnp_full_ext_c<double>};
1345-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_BLN][eft_BLN] = {eft_BLN, (void*)dpnp_full_ext_c<bool>};
1346-
fmap[DPNPFuncName::DPNP_FN_FULL_EXT][eft_C128][eft_C128] = {eft_C128,
1347-
(void*)dpnp_full_ext_c<std::complex<double>>};
1348-
13491329
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_full_like_default_c<int32_t>};
13501330
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_full_like_default_c<int64_t>};
13511331
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_full_like_default_c<float>};
@@ -1354,14 +1334,6 @@ void func_map_init_arraycreation(func_map_t& fmap)
13541334
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE][eft_C128][eft_C128] = {
13551335
eft_C128, (void*)dpnp_full_like_default_c<std::complex<double>>};
13561336

1357-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_full_like_ext_c<int32_t>};
1358-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_full_like_ext_c<int64_t>};
1359-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_full_like_ext_c<float>};
1360-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_DBL][eft_DBL] = {eft_DBL, (void*)dpnp_full_like_ext_c<double>};
1361-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_BLN][eft_BLN] = {eft_BLN, (void*)dpnp_full_like_ext_c<bool>};
1362-
fmap[DPNPFuncName::DPNP_FN_FULL_LIKE_EXT][eft_C128][eft_C128] = {
1363-
eft_C128, (void*)dpnp_full_like_ext_c<std::complex<double>>};
1364-
13651337
fmap[DPNPFuncName::DPNP_FN_IDENTITY][eft_INT][eft_INT] = {eft_INT, (void*)dpnp_identity_default_c<int32_t>};
13661338
fmap[DPNPFuncName::DPNP_FN_IDENTITY][eft_LNG][eft_LNG] = {eft_LNG, (void*)dpnp_identity_default_c<int64_t>};
13671339
fmap[DPNPFuncName::DPNP_FN_IDENTITY][eft_FLT][eft_FLT] = {eft_FLT, (void*)dpnp_identity_default_c<float>};

dpnp/dpnp_algo/dpnp_algo.pxd

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,7 @@ cdef extern from "dpnp_iface_fptr.hpp" namespace "DPNPFuncName": # need this na
154154
DPNP_FN_FMOD
155155
DPNP_FN_FMOD_EXT
156156
DPNP_FN_FULL
157-
DPNP_FN_FULL_EXT
158157
DPNP_FN_FULL_LIKE
159-
DPNP_FN_FULL_LIKE_EXT
160158
DPNP_FN_HYPOT
161159
DPNP_FN_HYPOT_EXT
162160
DPNP_FN_IDENTITY
@@ -518,7 +516,6 @@ cpdef dpnp_descriptor dpnp_matmul(dpnp_descriptor in_array1, dpnp_descriptor in_
518516
Array creation routines
519517
"""
520518
cpdef dpnp_descriptor dpnp_init_val(shape, dtype, value)
521-
cpdef dpnp_descriptor dpnp_full(result_shape, value_in, result_dtype) # same as dpnp_init_val
522519
cpdef dpnp_descriptor dpnp_copy(dpnp_descriptor x1)
523520

524521
"""

dpnp/dpnp_algo/dpnp_algo_arraycreation.pyx

Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# cython: language_level=3
22
# -*- coding: utf-8 -*-
33
# *****************************************************************************
4-
# Copyright (c) 2016-2020, Intel Corporation
4+
# Copyright (c) 2016-2022, Intel Corporation
55
# All rights reserved.
66
#
77
# Redistribution and use in source and binary forms, with or without
@@ -38,8 +38,6 @@ __all__ += [
3838
"dpnp_copy",
3939
"dpnp_diag",
4040
"dpnp_eye",
41-
"dpnp_full",
42-
"dpnp_full_like",
4341
"dpnp_geomspace",
4442
"dpnp_identity",
4543
"dpnp_linspace",
@@ -183,79 +181,6 @@ cpdef utils.dpnp_descriptor dpnp_eye(N, M=None, k=0, dtype=None):
183181
return result
184182

185183

186-
cpdef utils.dpnp_descriptor dpnp_full(result_shape, value_in, result_dtype):
187-
# Convert string type names (array.dtype) to C enum DPNPFuncType
188-
cdef DPNPFuncType dtype_in = dpnp_dtype_to_DPNPFuncType(result_dtype)
189-
190-
# get the FPTR data structure
191-
cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_FULL_EXT, dtype_in, DPNP_FT_NONE)
192-
193-
# ceate result array with type given by FPTR data
194-
cdef shape_type_c result_shape_c = utils._object_to_tuple(result_shape)
195-
cdef utils.dpnp_descriptor result = utils.create_output_descriptor(result_shape_c, kernel_data.return_type, None)
196-
197-
result_obj = result.get_array()
198-
199-
# Create single-element input fill array with type given by FPTR data
200-
cdef shape_type_c shape_in = (1,)
201-
cdef utils.dpnp_descriptor array_fill = utils.create_output_descriptor(shape_in,
202-
kernel_data.return_type,
203-
None,
204-
device=result_obj.sycl_device,
205-
usm_type=result_obj.usm_type,
206-
sycl_queue=result_obj.sycl_queue)
207-
array_fill.get_pyobj()[0] = value_in
208-
209-
cdef c_dpctl.SyclQueue q = <c_dpctl.SyclQueue> result_obj.sycl_queue
210-
cdef c_dpctl.DPCTLSyclQueueRef q_ref = q.get_queue_ref()
211-
212-
cdef fptr_1in_1out_t func = <fptr_1in_1out_t > kernel_data.ptr
213-
# Call FPTR function
214-
215-
cdef c_dpctl.DPCTLSyclEventRef event_ref = func(q_ref, array_fill.get_data(), result.get_data(), result.size, NULL)
216-
217-
with nogil: c_dpctl.DPCTLEvent_WaitAndThrow(event_ref)
218-
c_dpctl.DPCTLEvent_Delete(event_ref)
219-
220-
return result
221-
222-
223-
cpdef utils.dpnp_descriptor dpnp_full_like(result_shape, value_in, result_dtype):
224-
# Convert string type names (array.dtype) to C enum DPNPFuncType
225-
cdef DPNPFuncType dtype_in = dpnp_dtype_to_DPNPFuncType(result_dtype)
226-
227-
# get the FPTR data structure
228-
cdef DPNPFuncData kernel_data = get_dpnp_function_ptr(DPNP_FN_FULL_LIKE_EXT, dtype_in, DPNP_FT_NONE)
229-
230-
# ceate result array with type given by FPTR data
231-
cdef shape_type_c result_shape_c = utils._object_to_tuple(result_shape)
232-
cdef utils.dpnp_descriptor result = utils.create_output_descriptor(result_shape_c, kernel_data.return_type, None)
233-
234-
result_obj = result.get_array()
235-
236-
# Create single-element input fill array with type given by FPTR data
237-
cdef shape_type_c shape_in = (1,)
238-
cdef utils.dpnp_descriptor array_fill = utils.create_output_descriptor(shape_in,
239-
kernel_data.return_type,
240-
None,
241-
device=result_obj.sycl_device,
242-
usm_type=result_obj.usm_type,
243-
sycl_queue=result_obj.sycl_queue)
244-
array_fill.get_pyobj()[0] = value_in
245-
246-
cdef c_dpctl.SyclQueue q = <c_dpctl.SyclQueue> result_obj.sycl_queue
247-
cdef c_dpctl.DPCTLSyclQueueRef q_ref = q.get_queue_ref()
248-
249-
cdef fptr_1in_1out_t func = <fptr_1in_1out_t > kernel_data.ptr
250-
# Call FPTR function
251-
cdef c_dpctl.DPCTLSyclEventRef event_ref = func(q_ref, array_fill.get_data(), result.get_data(), result.size, NULL)
252-
253-
with nogil: c_dpctl.DPCTLEvent_WaitAndThrow(event_ref)
254-
c_dpctl.DPCTLEvent_Delete(event_ref)
255-
256-
return result
257-
258-
259184
cpdef utils.dpnp_descriptor dpnp_geomspace(start, stop, num, endpoint, dtype, axis):
260185
cdef shape_type_c obj_shape = utils._object_to_tuple(num)
261186
cdef utils.dpnp_descriptor result = utils_py.create_output_descriptor_py(obj_shape, dtype, None)

dpnp/dpnp_container.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"arange",
4646
"asarray",
4747
"empty",
48+
"full",
4849
]
4950

5051

@@ -111,3 +112,28 @@ def empty(shape,
111112
usm_type=usm_type,
112113
sycl_queue=sycl_queue_normalized)
113114
return dpnp_array(array_obj.shape, buffer=array_obj, order=order)
115+
116+
117+
def full(shape,
118+
fill_value,
119+
*,
120+
dtype=None,
121+
order="C",
122+
device=None,
123+
usm_type=None,
124+
sycl_queue=None):
125+
"""Validate input parameters before passing them into `dpctl.tensor` module"""
126+
dpu.validate_usm_type(usm_type, allow_none=True)
127+
sycl_queue_normalized = dpnp.get_normalized_queue_device(fill_value, sycl_queue=sycl_queue, device=device)
128+
129+
if isinstance(fill_value, dpnp_array):
130+
fill_value = fill_value.get_array()
131+
132+
"""Creates `dpnp_array` having a specified shape, filled with fill_value."""
133+
array_obj = dpt.full(shape,
134+
fill_value,
135+
dtype=dtype,
136+
order=order,
137+
usm_type=usm_type,
138+
sycl_queue=sycl_queue_normalized)
139+
return dpnp_array(array_obj.shape, buffer=array_obj, order=order)

dpnp/dpnp_iface_arraycreation.py

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -660,15 +660,25 @@ def fromstring(string, **kwargs):
660660
return call_origin(numpy.fromstring, string, **kwargs)
661661

662662

663-
def full(shape, fill_value, dtype=None, order='C'):
663+
def full(shape,
664+
fill_value,
665+
*,
666+
dtype=None,
667+
order="C",
668+
like=None,
669+
device=None,
670+
usm_type=None,
671+
sycl_queue=None):
664672
"""
665673
Return a new array of given shape and type, filled with `fill_value`.
666674
667675
For full documentation refer to :obj:`numpy.full`.
668676
669677
Limitations
670678
-----------
671-
Parameter ``order`` is supported only with default value ``"C"``.
679+
Parameter ``order`` is supported only with values ``"C"`` and ``"F"``.
680+
Parameter ``like`` is supported only with default value ``None``.
681+
Otherwise the function will be executed sequentially on CPU.
672682
673683
See Also
674684
--------
@@ -685,29 +695,44 @@ def full(shape, fill_value, dtype=None, order='C'):
685695
[10, 10, 10, 10]
686696
687697
"""
688-
if not use_origin_backend():
689-
if order not in ('C', 'c', None):
690-
pass
691-
else:
692-
if dtype is None:
693-
dtype = numpy.array(fill_value).dtype.type # TODO simplify
694-
695-
return dpnp_full(shape, fill_value, dtype).get_pyobj()
696-
697-
return call_origin(numpy.full, shape, fill_value, dtype, order)
698-
699-
700-
# numpy.full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)
701-
def full_like(x1, fill_value, dtype=None, order='C', subok=False, shape=None):
698+
if like is not None:
699+
pass
700+
elif not isinstance(order, str) or len(order) != 1 or order not in "CcFf":
701+
pass
702+
else:
703+
return dpnp_container.full(shape,
704+
fill_value,
705+
dtype=dtype,
706+
order=order,
707+
device=device,
708+
usm_type=usm_type,
709+
sycl_queue=sycl_queue)
710+
711+
return call_origin(numpy.full, shape, fill_value, dtype, order, like=like)
712+
713+
714+
def full_like(x1,
715+
/,
716+
fill_value,
717+
*,
718+
dtype=None,
719+
order='C',
720+
subok=False,
721+
shape=None,
722+
device=None,
723+
usm_type=None,
724+
sycl_queue=None):
702725
"""
703726
Return a full array with the same shape and type as a given array.
704727
705728
For full documentation refer to :obj:`numpy.full_like`.
706729
707730
Limitations
708731
-----------
709-
Parameter ``order`` is supported only with default value ``"C"``.
732+
Parameters ``x1`` is supported only as :class:`dpnp.dpnp_array`.
733+
Parameter ``order`` is supported only with values ``"C"`` and ``"F"``.
710734
Parameter ``subok`` is supported only with default value ``False``.
735+
Otherwise the function will be executed sequentially on CPU.
711736
712737
See Also
713738
--------
@@ -725,18 +750,24 @@ def full_like(x1, fill_value, dtype=None, order='C', subok=False, shape=None):
725750
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
726751
727752
"""
728-
729-
if not use_origin_backend():
730-
if order not in ('C', 'c', None):
731-
pass
732-
elif subok is not False:
733-
pass
734-
else:
735-
_shape = shape if shape is not None else x1.shape
736-
_dtype = dtype if dtype is not None else x1.dtype
737-
738-
return dpnp_full_like(_shape, fill_value, _dtype).get_pyobj()
739-
753+
if not isinstance(x1, dpnp.ndarray):
754+
pass
755+
elif not isinstance(order, str) or len(order) != 1 or order not in "CcFf":
756+
pass
757+
elif subok is not False:
758+
pass
759+
else:
760+
_shape = shape if shape is not None else x1.shape
761+
_dtype = dtype if dtype is not None else x1.dtype
762+
_usm_type = usm_type if usm_type is not None else x1.usm_type
763+
_sycl_queue = dpnp.get_normalized_queue_device(x1, sycl_queue=sycl_queue, device=device)
764+
765+
return dpnp_container.full(_shape,
766+
fill_value,
767+
dtype=_dtype,
768+
order=order,
769+
usm_type=_usm_type,
770+
sycl_queue=_sycl_queue)
740771
return numpy.full_like(x1, fill_value, dtype, order, subok, shape)
741772

742773

0 commit comments

Comments
 (0)