Skip to content

Commit d40517a

Browse files
authored
[PERF]: Faster void * conversion (#1616)
* [PERF]: Faster void * conversion * Restore cptr property * Fixes in runtime.pyx.in * Reduce code duplication
1 parent 164396d commit d40517a

5 files changed

Lines changed: 416 additions & 304 deletions

File tree

cuda_bindings/cuda/bindings/_lib/utils.pxd.in

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ cimport cuda.bindings.driver as driver
55
cimport cuda.bindings.cydriver as cydriver
66
cimport cuda.bindings.cyruntime as cyruntime
77
from libcpp.vector cimport vector
8+
from cpython.buffer cimport PyBuffer_Release, Py_buffer
89

910
cdef class _HelperKernelParams:
1011
cdef Py_buffer _pybuffer
@@ -14,10 +15,19 @@ cdef class _HelperKernelParams:
1415
cdef int _length
1516
cdef bint _malloc_list_created
1617

18+
cdef struct _HelperInputVoidPtrStruct:
19+
Py_buffer _pybuffer
20+
1721
cdef class _HelperInputVoidPtr:
18-
cdef Py_buffer _pybuffer
22+
cdef _HelperInputVoidPtrStruct _helper
1923
cdef void* _cptr
20-
cdef bint _pyobj_acquired
24+
25+
cdef void * _helper_input_void_ptr(ptr, _HelperInputVoidPtrStruct *buffer)
26+
27+
cdef inline void * _helper_input_void_ptr_free(_HelperInputVoidPtrStruct *helper):
28+
if helper[0]._pybuffer.buf != NULL:
29+
PyBuffer_Release(&helper[0]._pybuffer)
30+
2131
{{if 'CUmemPool_attribute_enum' in found_types}}
2232

2333
cdef class _HelperCUmemPool_attribute:

cuda_bindings/cuda/bindings/_lib/utils.pxi.in

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -128,31 +128,32 @@ cdef class _HelperKernelParams:
128128

129129
cdef class _HelperInputVoidPtr:
130130
def __cinit__(self, ptr):
131-
self._pyobj_acquired = False
131+
self._cptr = _helper_input_void_ptr(ptr, &self._helper)
132+
133+
def __dealloc__(self):
134+
_helper_input_void_ptr_free(&self._helper)
135+
136+
@property
137+
def cptr(self):
138+
return <void_ptr>self._cptr
139+
140+
141+
cdef void * _helper_input_void_ptr(ptr, _HelperInputVoidPtrStruct *helper):
142+
helper[0]._pybuffer.buf = NULL
143+
try:
144+
return <void *><void_ptr>ptr
145+
except:
132146
if ptr is None:
133-
self._cptr = NULL
134-
elif isinstance(ptr, (int)):
135-
# Easy run, user gave us an already configured void** address
136-
self._cptr = <void*><void_ptr>ptr
137-
elif isinstance(ptr, (_driver["CUdeviceptr"])):
138-
self._cptr = <void*><void_ptr>int(ptr)
147+
return NULL
139148
elif PyObject_CheckBuffer(ptr):
140149
# Easy run, get address from Python Buffer Protocol
141-
err_buffer = PyObject_GetBuffer(ptr, &self._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS)
150+
err_buffer = PyObject_GetBuffer(ptr, &helper[0]._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS)
142151
if err_buffer == -1:
143152
raise RuntimeError("Failed to retrieve buffer through Buffer Protocol")
144-
self._pyobj_acquired = True
145-
self._cptr = <void*><void_ptr>self._pybuffer.buf
153+
return <void*><void_ptr>(helper[0]._pybuffer.buf)
146154
else:
147155
raise TypeError("Provided argument is of type {} but expected Type {}, {} or object with Buffer Protocol".format(type(ptr), type(None), type(int)))
148156

149-
def __dealloc__(self):
150-
if self._pyobj_acquired is True:
151-
PyBuffer_Release(&self._pybuffer)
152-
153-
@property
154-
def cptr(self):
155-
return <void_ptr>self._cptr
156157

157158
{{if 'CUmemPool_attribute_enum' in found_types}}
158159

0 commit comments

Comments
 (0)