#include #include #include #include #include #include #include #include #include #include PyObject* THXPEventClass = nullptr; static PyObject* THXPEvent_pynew( PyTypeObject* type, PyObject* args, PyObject* kwargs) { HANDLE_TH_ERRORS unsigned char enable_timing = 0; // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) constexpr const char* kwlist[] = {"enable_timing", nullptr}; if (!PyArg_ParseTupleAndKeywords( args, kwargs, "|b", // NOLINTNEXTLINE(cppcoreguidelines-pro-type-const-cast) const_cast(kwlist), &enable_timing)) { return nullptr; } THPObjectPtr ptr(type->tp_alloc(type, 0)); if (!ptr) { return nullptr; } THXPEvent* self = (THXPEvent*)ptr.get(); new (&self->xpu_event) at::xpu::XPUEvent(enable_timing); return (PyObject*)ptr.release(); END_HANDLE_TH_ERRORS } static void THXPEvent_dealloc(THXPEvent* self) { { pybind11::gil_scoped_release no_gil{}; self->xpu_event.~XPUEvent(); } Py_TYPE(self)->tp_free((PyObject*)self); } static PyObject* THXPEvent_get_sycl_event(THXPEvent* self, void* unused) { HANDLE_TH_ERRORS return PyLong_FromVoidPtr(&self->xpu_event.event()); END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_get_device(THXPEvent* self, void* unused) { HANDLE_TH_ERRORS std::optional device = self->xpu_event.device(); if (!device) { Py_RETURN_NONE; } return THPDevice_New(device.value()); END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_record(PyObject* _self, PyObject* _stream) { HANDLE_TH_ERRORS auto* self = (THXPEvent*)_self; auto* stream = (THXPStream*)_stream; self->xpu_event.record(stream->xpu_stream); Py_RETURN_NONE; END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_wait(PyObject* _self, PyObject* _stream) { HANDLE_TH_ERRORS auto* self = (THXPEvent*)_self; auto* stream = (THXPStream*)_stream; self->xpu_event.block(stream->xpu_stream); Py_RETURN_NONE; END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_query(PyObject* _self, PyObject* noargs) { HANDLE_TH_ERRORS auto* self = (THXPEvent*)_self; return PyBool_FromLong(self->xpu_event.query()); END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_elapsed_time(PyObject* _self, PyObject* _other) { HANDLE_TH_ERRORS auto* self = (THXPEvent*)_self; auto* other = (THXPEvent*)_other; return PyFloat_FromDouble(self->xpu_event.elapsed_time(other->xpu_event)); END_HANDLE_TH_ERRORS } static PyObject* THXPEvent_synchronize(PyObject* _self, PyObject* noargs) { HANDLE_TH_ERRORS { pybind11::gil_scoped_release no_gil; auto* self = (THXPEvent*)_self; self->xpu_event.synchronize(); } Py_RETURN_NONE; END_HANDLE_TH_ERRORS } // NOLINTNEXTLINE(*c-arrays*, *global-variables) static struct PyGetSetDef THXPEvent_properties[] = { {"device", (getter)THXPEvent_get_device, nullptr, nullptr, nullptr}, {"sycl_event", (getter)THXPEvent_get_sycl_event, nullptr, nullptr, nullptr}, {nullptr}}; // NOLINTNEXTLINE(*c-arrays*, *global-variables) static PyMethodDef THXPEvent_methods[] = { {(char*)"record", THXPEvent_record, METH_O, nullptr}, {(char*)"wait", THXPEvent_wait, METH_O, nullptr}, {(char*)"query", THXPEvent_query, METH_NOARGS, nullptr}, {(char*)"elapsed_time", THXPEvent_elapsed_time, METH_O, nullptr}, {(char*)"synchronize", THXPEvent_synchronize, METH_NOARGS, nullptr}, {nullptr}}; PyTypeObject THXPEventType = { PyVarObject_HEAD_INIT(nullptr, 0) "torch._C._XpuEventBase", /* tp_name */ sizeof(THXPEvent), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)THXPEvent_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ nullptr, /* tp_getattr */ nullptr, /* tp_setattr */ nullptr, /* tp_reserved */ nullptr, /* tp_repr */ nullptr, /* tp_as_number */ nullptr, /* tp_as_sequence */ nullptr, /* tp_as_mapping */ nullptr, /* tp_hash */ nullptr, /* tp_call */ nullptr, /* tp_str */ nullptr, /* tp_getattro */ nullptr, /* tp_setattro */ nullptr, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ nullptr, /* tp_doc */ nullptr, /* tp_traverse */ nullptr, /* tp_clear */ nullptr, /* tp_richcompare */ 0, /* tp_weaklistoffset */ nullptr, /* tp_iter */ nullptr, /* tp_iternext */ THXPEvent_methods, /* tp_methods */ nullptr, /* tp_members */ THXPEvent_properties, /* tp_getset */ nullptr, /* tp_base */ nullptr, /* tp_dict */ nullptr, /* tp_descr_get */ nullptr, /* tp_descr_set */ 0, /* tp_dictoffset */ nullptr, /* tp_init */ nullptr, /* tp_alloc */ THXPEvent_pynew, /* tp_new */ }; void THXPEvent_init(PyObject* module) { THXPEventClass = (PyObject*)&THXPEventType; if (PyType_Ready(&THXPEventType) < 0) { throw python_error(); } Py_INCREF(&THXPEventType); if (PyModule_AddObject(module, "_XpuEventBase", (PyObject*)&THXPEventType) < 0) { throw python_error(); } }