130 PyTypeObject *Py_SyclDeviceType_;
131 PyTypeObject *PySyclDeviceType_;
132 PyTypeObject *Py_SyclContextType_;
133 PyTypeObject *PySyclContextType_;
134 PyTypeObject *Py_SyclEventType_;
135 PyTypeObject *PySyclEventType_;
136 PyTypeObject *Py_SyclQueueType_;
137 PyTypeObject *PySyclQueueType_;
138 PyTypeObject *Py_MemoryType_;
139 PyTypeObject *PyMemoryUSMDeviceType_;
140 PyTypeObject *PyMemoryUSMSharedType_;
141 PyTypeObject *PyMemoryUSMHostType_;
142 PyTypeObject *PyUSMArrayType_;
143 PyTypeObject *PySyclProgramType_;
144 PyTypeObject *PySyclKernelType_;
146 DPCTLSyclDeviceRef (*SyclDevice_GetDeviceRef_)(PySyclDeviceObject *);
147 PySyclDeviceObject *(*SyclDevice_Make_)(DPCTLSyclDeviceRef);
149 DPCTLSyclContextRef (*SyclContext_GetContextRef_)(PySyclContextObject *);
150 PySyclContextObject *(*SyclContext_Make_)(DPCTLSyclContextRef);
152 DPCTLSyclEventRef (*SyclEvent_GetEventRef_)(PySyclEventObject *);
153 PySyclEventObject *(*SyclEvent_Make_)(DPCTLSyclEventRef);
155 DPCTLSyclQueueRef (*SyclQueue_GetQueueRef_)(PySyclQueueObject *);
156 PySyclQueueObject *(*SyclQueue_Make_)(DPCTLSyclQueueRef);
159 DPCTLSyclUSMRef (*Memory_GetUsmPointer_)(Py_MemoryObject *);
160 void *(*Memory_GetOpaquePointer_)(Py_MemoryObject *);
161 DPCTLSyclContextRef (*Memory_GetContextRef_)(Py_MemoryObject *);
162 DPCTLSyclQueueRef (*Memory_GetQueueRef_)(Py_MemoryObject *);
163 size_t (*Memory_GetNumBytes_)(Py_MemoryObject *);
164 PyObject *(*Memory_Make_)(DPCTLSyclUSMRef,
170 DPCTLSyclKernelRef (*SyclKernel_GetKernelRef_)(PySyclKernelObject *);
171 PySyclKernelObject *(*SyclKernel_Make_)(DPCTLSyclKernelRef,
const char *);
173 DPCTLSyclKernelBundleRef (*SyclProgram_GetKernelBundleRef_)(
174 PySyclProgramObject *);
175 PySyclProgramObject *(*SyclProgram_Make_)(DPCTLSyclKernelBundleRef);
178 char *(*UsmNDArray_GetData_)(PyUSMArrayObject *);
179 int (*UsmNDArray_GetNDim_)(PyUSMArrayObject *);
180 py::ssize_t *(*UsmNDArray_GetShape_)(PyUSMArrayObject *);
181 py::ssize_t *(*UsmNDArray_GetStrides_)(PyUSMArrayObject *);
182 int (*UsmNDArray_GetTypenum_)(PyUSMArrayObject *);
183 int (*UsmNDArray_GetElementSize_)(PyUSMArrayObject *);
184 int (*UsmNDArray_GetFlags_)(PyUSMArrayObject *);
185 DPCTLSyclQueueRef (*UsmNDArray_GetQueueRef_)(PyUSMArrayObject *);
186 py::ssize_t (*UsmNDArray_GetOffset_)(PyUSMArrayObject *);
187 PyObject *(*UsmNDArray_GetUSMData_)(PyUSMArrayObject *);
188 void (*UsmNDArray_SetWritableFlag_)(PyUSMArrayObject *, int);
189 PyObject *(*UsmNDArray_MakeSimpleFromMemory_)(int,
195 PyObject *(*UsmNDArray_MakeSimpleFromPtr_)(size_t,
200 PyObject *(*UsmNDArray_MakeFromPtr_)(int,
209 int USM_ARRAY_C_CONTIGUOUS_;
210 int USM_ARRAY_F_CONTIGUOUS_;
211 int USM_ARRAY_WRITABLE_;
212 int UAR_BOOL_, UAR_BYTE_, UAR_UBYTE_, UAR_SHORT_, UAR_USHORT_, UAR_INT_,
213 UAR_UINT_, UAR_LONG_, UAR_ULONG_, UAR_LONGLONG_, UAR_ULONGLONG_,
214 UAR_FLOAT_, UAR_DOUBLE_, UAR_CFLOAT_, UAR_CDOUBLE_, UAR_TYPE_SENTINEL_,
216 int UAR_INT8_, UAR_UINT8_, UAR_INT16_, UAR_UINT16_, UAR_INT32_, UAR_UINT32_,
217 UAR_INT64_, UAR_UINT64_;
219 bool PySyclDevice_Check_(PyObject *obj)
const
221 return PyObject_TypeCheck(obj, PySyclDeviceType_) != 0;
223 bool PySyclContext_Check_(PyObject *obj)
const
225 return PyObject_TypeCheck(obj, PySyclContextType_) != 0;
227 bool PySyclEvent_Check_(PyObject *obj)
const
229 return PyObject_TypeCheck(obj, PySyclEventType_) != 0;
231 bool PySyclQueue_Check_(PyObject *obj)
const
233 return PyObject_TypeCheck(obj, PySyclQueueType_) != 0;
235 bool PySyclKernel_Check_(PyObject *obj)
const
237 return PyObject_TypeCheck(obj, PySyclKernelType_) != 0;
239 bool PySyclProgram_Check_(PyObject *obj)
const
241 return PyObject_TypeCheck(obj, PySyclProgramType_) != 0;
246 as_usm_memory_.reset();
247 default_usm_ndarray_.reset();
248 default_usm_memory_.reset();
249 default_sycl_queue_.reset();
258 py::object default_sycl_queue_pyobj()
260 return *default_sycl_queue_;
262 py::object default_usm_memory_pyobj()
264 return *default_usm_memory_;
266 py::object default_usm_ndarray_pyobj()
268 return *default_usm_ndarray_;
270 py::object as_usm_memory_pyobj()
272 return *as_usm_memory_;
278 void operator()(py::object *p)
const
280 const bool initialized = Py_IsInitialized();
281#if PY_VERSION_HEX < 0x30d0000
282 const bool finalizing = _Py_IsFinalizing();
284 const bool finalizing = Py_IsFinalizing();
286 const bool guard = initialized && !finalizing;
294 std::shared_ptr<py::object> default_sycl_queue_;
295 std::shared_ptr<py::object> default_usm_memory_;
296 std::shared_ptr<py::object> default_usm_ndarray_;
297 std::shared_ptr<py::object> as_usm_memory_;
300 : Py_SyclDeviceType_(
nullptr), PySyclDeviceType_(
nullptr),
301 Py_SyclContextType_(
nullptr), PySyclContextType_(
nullptr),
302 Py_SyclEventType_(
nullptr), PySyclEventType_(
nullptr),
303 Py_SyclQueueType_(
nullptr), PySyclQueueType_(
nullptr),
304 Py_MemoryType_(
nullptr), PyMemoryUSMDeviceType_(
nullptr),
305 PyMemoryUSMSharedType_(
nullptr), PyMemoryUSMHostType_(
nullptr),
306 PyUSMArrayType_(
nullptr), PySyclProgramType_(
nullptr),
307 PySyclKernelType_(
nullptr), SyclDevice_GetDeviceRef_(
nullptr),
308 SyclDevice_Make_(
nullptr), SyclContext_GetContextRef_(
nullptr),
309 SyclContext_Make_(
nullptr), SyclEvent_GetEventRef_(
nullptr),
310 SyclEvent_Make_(
nullptr), SyclQueue_GetQueueRef_(
nullptr),
311 SyclQueue_Make_(
nullptr), Memory_GetUsmPointer_(
nullptr),
312 Memory_GetOpaquePointer_(
nullptr), Memory_GetContextRef_(
nullptr),
313 Memory_GetQueueRef_(
nullptr), Memory_GetNumBytes_(
nullptr),
314 Memory_Make_(
nullptr), SyclKernel_GetKernelRef_(
nullptr),
315 SyclKernel_Make_(
nullptr), SyclProgram_GetKernelBundleRef_(
nullptr),
316 SyclProgram_Make_(
nullptr), UsmNDArray_GetData_(
nullptr),
317 UsmNDArray_GetNDim_(
nullptr), UsmNDArray_GetShape_(
nullptr),
318 UsmNDArray_GetStrides_(
nullptr), UsmNDArray_GetTypenum_(
nullptr),
319 UsmNDArray_GetElementSize_(
nullptr), UsmNDArray_GetFlags_(
nullptr),
320 UsmNDArray_GetQueueRef_(
nullptr), UsmNDArray_GetOffset_(
nullptr),
321 UsmNDArray_GetUSMData_(
nullptr), UsmNDArray_SetWritableFlag_(
nullptr),
322 UsmNDArray_MakeSimpleFromMemory_(
nullptr),
323 UsmNDArray_MakeSimpleFromPtr_(
nullptr),
324 UsmNDArray_MakeFromPtr_(
nullptr), USM_ARRAY_C_CONTIGUOUS_(0),
325 USM_ARRAY_F_CONTIGUOUS_(0), USM_ARRAY_WRITABLE_(0), UAR_BOOL_(-1),
326 UAR_BYTE_(-1), UAR_UBYTE_(-1), UAR_SHORT_(-1), UAR_USHORT_(-1),
327 UAR_INT_(-1), UAR_UINT_(-1), UAR_LONG_(-1), UAR_ULONG_(-1),
328 UAR_LONGLONG_(-1), UAR_ULONGLONG_(-1), UAR_FLOAT_(-1),
329 UAR_DOUBLE_(-1), UAR_CFLOAT_(-1), UAR_CDOUBLE_(-1),
330 UAR_TYPE_SENTINEL_(-1), UAR_HALF_(-1), UAR_INT8_(-1), UAR_UINT8_(-1),
331 UAR_INT16_(-1), UAR_UINT16_(-1), UAR_INT32_(-1), UAR_UINT32_(-1),
332 UAR_INT64_(-1), UAR_UINT64_(-1), default_sycl_queue_{},
333 default_usm_memory_{}, default_usm_ndarray_{}, as_usm_memory_{}
345 this->Py_SyclDeviceType_ = &Py_SyclDeviceType;
346 this->PySyclDeviceType_ = &PySyclDeviceType;
347 this->Py_SyclContextType_ = &Py_SyclContextType;
348 this->PySyclContextType_ = &PySyclContextType;
349 this->Py_SyclEventType_ = &Py_SyclEventType;
350 this->PySyclEventType_ = &PySyclEventType;
351 this->Py_SyclQueueType_ = &Py_SyclQueueType;
352 this->PySyclQueueType_ = &PySyclQueueType;
353 this->Py_MemoryType_ = &Py_MemoryType;
354 this->PyMemoryUSMDeviceType_ = &PyMemoryUSMDeviceType;
355 this->PyMemoryUSMSharedType_ = &PyMemoryUSMSharedType;
356 this->PyMemoryUSMHostType_ = &PyMemoryUSMHostType;
357 this->PyUSMArrayType_ = &PyUSMArrayType;
358 this->PySyclProgramType_ = &PySyclProgramType;
359 this->PySyclKernelType_ = &PySyclKernelType;
362 this->SyclDevice_GetDeviceRef_ = SyclDevice_GetDeviceRef;
363 this->SyclDevice_Make_ = SyclDevice_Make;
366 this->SyclContext_GetContextRef_ = SyclContext_GetContextRef;
367 this->SyclContext_Make_ = SyclContext_Make;
370 this->SyclEvent_GetEventRef_ = SyclEvent_GetEventRef;
371 this->SyclEvent_Make_ = SyclEvent_Make;
374 this->SyclQueue_GetQueueRef_ = SyclQueue_GetQueueRef;
375 this->SyclQueue_Make_ = SyclQueue_Make;
378 this->Memory_GetUsmPointer_ = Memory_GetUsmPointer;
379 this->Memory_GetOpaquePointer_ = Memory_GetOpaquePointer;
380 this->Memory_GetContextRef_ = Memory_GetContextRef;
381 this->Memory_GetQueueRef_ = Memory_GetQueueRef;
382 this->Memory_GetNumBytes_ = Memory_GetNumBytes;
383 this->Memory_Make_ = Memory_Make;
386 this->SyclKernel_GetKernelRef_ = SyclKernel_GetKernelRef;
387 this->SyclKernel_Make_ = SyclKernel_Make;
388 this->SyclProgram_GetKernelBundleRef_ = SyclProgram_GetKernelBundleRef;
389 this->SyclProgram_Make_ = SyclProgram_Make;
392 this->UsmNDArray_GetData_ = UsmNDArray_GetData;
393 this->UsmNDArray_GetNDim_ = UsmNDArray_GetNDim;
394 this->UsmNDArray_GetShape_ = UsmNDArray_GetShape;
395 this->UsmNDArray_GetStrides_ = UsmNDArray_GetStrides;
396 this->UsmNDArray_GetTypenum_ = UsmNDArray_GetTypenum;
397 this->UsmNDArray_GetElementSize_ = UsmNDArray_GetElementSize;
398 this->UsmNDArray_GetFlags_ = UsmNDArray_GetFlags;
399 this->UsmNDArray_GetQueueRef_ = UsmNDArray_GetQueueRef;
400 this->UsmNDArray_GetOffset_ = UsmNDArray_GetOffset;
401 this->UsmNDArray_GetUSMData_ = UsmNDArray_GetUSMData;
402 this->UsmNDArray_SetWritableFlag_ = UsmNDArray_SetWritableFlag;
403 this->UsmNDArray_MakeSimpleFromMemory_ =
404 UsmNDArray_MakeSimpleFromMemory;
405 this->UsmNDArray_MakeSimpleFromPtr_ = UsmNDArray_MakeSimpleFromPtr;
406 this->UsmNDArray_MakeFromPtr_ = UsmNDArray_MakeFromPtr;
409 this->USM_ARRAY_C_CONTIGUOUS_ = USM_ARRAY_C_CONTIGUOUS;
410 this->USM_ARRAY_F_CONTIGUOUS_ = USM_ARRAY_F_CONTIGUOUS;
411 this->USM_ARRAY_WRITABLE_ = USM_ARRAY_WRITABLE;
412 this->UAR_BOOL_ = UAR_BOOL;
413 this->UAR_BYTE_ = UAR_BYTE;
414 this->UAR_UBYTE_ = UAR_UBYTE;
415 this->UAR_SHORT_ = UAR_SHORT;
416 this->UAR_USHORT_ = UAR_USHORT;
417 this->UAR_INT_ = UAR_INT;
418 this->UAR_UINT_ = UAR_UINT;
419 this->UAR_LONG_ = UAR_LONG;
420 this->UAR_ULONG_ = UAR_ULONG;
421 this->UAR_LONGLONG_ = UAR_LONGLONG;
422 this->UAR_ULONGLONG_ = UAR_ULONGLONG;
423 this->UAR_FLOAT_ = UAR_FLOAT;
424 this->UAR_DOUBLE_ = UAR_DOUBLE;
425 this->UAR_CFLOAT_ = UAR_CFLOAT;
426 this->UAR_CDOUBLE_ = UAR_CDOUBLE;
427 this->UAR_TYPE_SENTINEL_ = UAR_TYPE_SENTINEL;
428 this->UAR_HALF_ = UAR_HALF;
431 this->UAR_INT8_ = UAR_BYTE;
432 this->UAR_UINT8_ = UAR_UBYTE;
433 this->UAR_INT16_ = UAR_SHORT;
434 this->UAR_UINT16_ = UAR_USHORT;
436 platform_typeid_lookup<std::int32_t, long, int, short>(
437 UAR_LONG, UAR_INT, UAR_SHORT);
439 platform_typeid_lookup<std::uint32_t,
unsigned long,
unsigned int,
440 unsigned short>(UAR_ULONG, UAR_UINT,
443 platform_typeid_lookup<std::int64_t, long, long long, int>(
444 UAR_LONG, UAR_LONGLONG, UAR_INT);
446 platform_typeid_lookup<std::uint64_t,
unsigned long,
447 unsigned long long,
unsigned int>(
448 UAR_ULONG, UAR_ULONGLONG, UAR_UINT);
453 PySyclQueueObject *py_q_tmp =
454 SyclQueue_Make(
reinterpret_cast<DPCTLSyclQueueRef
>(&q_));
455 const py::object &py_sycl_queue = py::reinterpret_steal<py::object>(
456 reinterpret_cast<PyObject *
>(py_q_tmp));
458 default_sycl_queue_ = std::shared_ptr<py::object>(
459 new py::object(py_sycl_queue), Deleter{});
461 py::module_ mod_memory = py::module_::import(
"dpctl.memory");
462 const py::object &py_as_usm_memory = mod_memory.attr(
"as_usm_memory");
463 as_usm_memory_ = std::shared_ptr<py::object>(
464 new py::object{py_as_usm_memory}, Deleter{});
466 auto mem_kl = mod_memory.attr(
"MemoryUSMHost");
467 const py::object &py_default_usm_memory =
468 mem_kl(1, py::arg(
"queue") = py_sycl_queue);
469 default_usm_memory_ = std::shared_ptr<py::object>(
470 new py::object{py_default_usm_memory}, Deleter{});
474 py::module_ mod_usmarray =
475 py::module_::import(
"dpctl_ext.tensor._usmarray");
476 auto tensor_kl = mod_usmarray.attr(
"usm_ndarray");
478 const py::object &py_default_usm_ndarray =
479 tensor_kl(py::tuple(), py::arg(
"dtype") = py::str(
"u1"),
480 py::arg(
"buffer") = py_default_usm_memory);
482 default_usm_ndarray_ = std::shared_ptr<py::object>(
483 new py::object{py_default_usm_ndarray}, Deleter{});
1014 PYBIND11_OBJECT(
usm_ndarray, py::object, [](PyObject *o) ->
bool {
1015 return PyObject_TypeCheck(
1016 o, ::dpctl::detail::dpctl_capi::get().PyUSMArrayType_) != 0;
1021 ::dpctl::detail::dpctl_capi::get().default_usm_ndarray_pyobj(),
1025 throw py::error_already_set();
1028 char *get_data()
const
1030 PyUSMArrayObject *raw_ar = usm_array_ptr();
1032 auto const &api = ::dpctl::detail::dpctl_capi::get();
1033 return api.UsmNDArray_GetData_(raw_ar);
1036 template <
typename T>
1039 return reinterpret_cast<T *
>(get_data());
1042 int get_ndim()
const
1044 PyUSMArrayObject *raw_ar = usm_array_ptr();
1046 auto const &api = ::dpctl::detail::dpctl_capi::get();
1047 return api.UsmNDArray_GetNDim_(raw_ar);
1050 const py::ssize_t *get_shape_raw()
const
1052 PyUSMArrayObject *raw_ar = usm_array_ptr();
1054 auto const &api = ::dpctl::detail::dpctl_capi::get();
1055 return api.UsmNDArray_GetShape_(raw_ar);
1058 std::vector<py::ssize_t> get_shape_vector()
const
1060 auto raw_sh = get_shape_raw();
1061 auto nd = get_ndim();
1063 std::vector<py::ssize_t> shape_vector(raw_sh, raw_sh + nd);
1064 return shape_vector;
1067 py::ssize_t get_shape(
int i)
const
1069 auto shape_ptr = get_shape_raw();
1070 return shape_ptr[i];
1073 const py::ssize_t *get_strides_raw()
const
1075 PyUSMArrayObject *raw_ar = usm_array_ptr();
1077 auto const &api = ::dpctl::detail::dpctl_capi::get();
1078 return api.UsmNDArray_GetStrides_(raw_ar);
1081 std::vector<py::ssize_t> get_strides_vector()
const
1083 auto raw_st = get_strides_raw();
1084 auto nd = get_ndim();
1086 if (raw_st ==
nullptr) {
1087 auto is_c_contig = is_c_contiguous();
1088 auto is_f_contig = is_f_contiguous();
1089 auto raw_sh = get_shape_raw();
1091 const auto &contig_strides = c_contiguous_strides(nd, raw_sh);
1092 return contig_strides;
1094 else if (is_f_contig) {
1095 const auto &contig_strides = f_contiguous_strides(nd, raw_sh);
1096 return contig_strides;
1099 throw std::runtime_error(
"Invalid array encountered when "
1100 "building strides");
1104 std::vector<py::ssize_t> st_vec(raw_st, raw_st + nd);
1109 py::ssize_t get_size()
const
1111 PyUSMArrayObject *raw_ar = usm_array_ptr();
1113 auto const &api = ::dpctl::detail::dpctl_capi::get();
1114 int ndim = api.UsmNDArray_GetNDim_(raw_ar);
1115 const py::ssize_t *shape = api.UsmNDArray_GetShape_(raw_ar);
1117 py::ssize_t nelems = 1;
1118 for (
int i = 0; i < ndim; ++i) {
1122 assert(nelems >= 0);
1126 std::pair<py::ssize_t, py::ssize_t> get_minmax_offsets()
const
1128 PyUSMArrayObject *raw_ar = usm_array_ptr();
1130 auto const &api = ::dpctl::detail::dpctl_capi::get();
1131 int nd = api.UsmNDArray_GetNDim_(raw_ar);
1132 const py::ssize_t *shape = api.UsmNDArray_GetShape_(raw_ar);
1133 const py::ssize_t *strides = api.UsmNDArray_GetStrides_(raw_ar);
1135 py::ssize_t offset_min = 0;
1136 py::ssize_t offset_max = 0;
1137 if (strides ==
nullptr) {
1138 py::ssize_t stride(1);
1139 for (
int i = 0; i < nd; ++i) {
1140 offset_max += stride * (shape[i] - 1);
1145 for (
int i = 0; i < nd; ++i) {
1146 py::ssize_t delta = strides[i] * (shape[i] - 1);
1147 if (strides[i] > 0) {
1148 offset_max += delta;
1151 offset_min += delta;
1155 return std::make_pair(offset_min, offset_max);
1158 sycl::queue get_queue()
const
1160 PyUSMArrayObject *raw_ar = usm_array_ptr();
1162 auto const &api = ::dpctl::detail::dpctl_capi::get();
1163 DPCTLSyclQueueRef QRef = api.UsmNDArray_GetQueueRef_(raw_ar);
1164 return *(
reinterpret_cast<sycl::queue *
>(QRef));
1167 sycl::device get_device()
const
1169 PyUSMArrayObject *raw_ar = usm_array_ptr();
1171 auto const &api = ::dpctl::detail::dpctl_capi::get();
1172 DPCTLSyclQueueRef QRef = api.UsmNDArray_GetQueueRef_(raw_ar);
1173 return reinterpret_cast<sycl::queue *
>(QRef)->get_device();
1176 int get_typenum()
const
1178 PyUSMArrayObject *raw_ar = usm_array_ptr();
1180 auto const &api = ::dpctl::detail::dpctl_capi::get();
1181 return api.UsmNDArray_GetTypenum_(raw_ar);
1184 int get_flags()
const
1186 PyUSMArrayObject *raw_ar = usm_array_ptr();
1188 auto const &api = ::dpctl::detail::dpctl_capi::get();
1189 return api.UsmNDArray_GetFlags_(raw_ar);
1192 int get_elemsize()
const
1194 PyUSMArrayObject *raw_ar = usm_array_ptr();
1196 auto const &api = ::dpctl::detail::dpctl_capi::get();
1197 return api.UsmNDArray_GetElementSize_(raw_ar);
1200 bool is_c_contiguous()
const
1202 int flags = get_flags();
1203 auto const &api = ::dpctl::detail::dpctl_capi::get();
1204 return static_cast<bool>(flags & api.USM_ARRAY_C_CONTIGUOUS_);
1207 bool is_f_contiguous()
const
1209 int flags = get_flags();
1210 auto const &api = ::dpctl::detail::dpctl_capi::get();
1211 return static_cast<bool>(flags & api.USM_ARRAY_F_CONTIGUOUS_);
1214 bool is_writable()
const
1216 int flags = get_flags();
1217 auto const &api = ::dpctl::detail::dpctl_capi::get();
1218 return static_cast<bool>(flags & api.USM_ARRAY_WRITABLE_);
1224 PyUSMArrayObject *raw_ar = usm_array_ptr();
1226 auto const &api = ::dpctl::detail::dpctl_capi::get();
1228 PyObject *usm_data = api.UsmNDArray_GetUSMData_(raw_ar);
1231 return py::reinterpret_steal<py::object>(usm_data);
1234 bool is_managed_by_smart_ptr()
const
1236 PyUSMArrayObject *raw_ar = usm_array_ptr();
1238 auto const &api = ::dpctl::detail::dpctl_capi::get();
1239 PyObject *usm_data = api.UsmNDArray_GetUSMData_(raw_ar);
1241 if (!PyObject_TypeCheck(usm_data, api.Py_MemoryType_)) {
1242 Py_DECREF(usm_data);
1246 Py_MemoryObject *mem_obj =
1247 reinterpret_cast<Py_MemoryObject *
>(usm_data);
1248 const void *opaque_ptr = api.Memory_GetOpaquePointer_(mem_obj);
1250 Py_DECREF(usm_data);
1251 return bool(opaque_ptr);
1254 const std::shared_ptr<void> &get_smart_ptr_owner()
const
1256 PyUSMArrayObject *raw_ar = usm_array_ptr();
1258 auto const &api = ::dpctl::detail::dpctl_capi::get();
1260 PyObject *usm_data = api.UsmNDArray_GetUSMData_(raw_ar);
1262 if (!PyObject_TypeCheck(usm_data, api.Py_MemoryType_)) {
1263 Py_DECREF(usm_data);
1264 throw std::runtime_error(
1265 "usm_ndarray object does not have Memory object "
1266 "managing lifetime of USM allocation");
1269 Py_MemoryObject *mem_obj =
1270 reinterpret_cast<Py_MemoryObject *
>(usm_data);
1271 void *opaque_ptr = api.Memory_GetOpaquePointer_(mem_obj);
1272 Py_DECREF(usm_data);
1276 reinterpret_cast<std::shared_ptr<void> *
>(opaque_ptr);
1280 throw std::runtime_error(
1281 "Memory object underlying usm_ndarray does not have "
1282 "smart pointer managing lifetime of USM allocation");
1287 PyUSMArrayObject *usm_array_ptr()
const
1289 return reinterpret_cast<PyUSMArrayObject *
>(m_ptr);