# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE from cpython.buffer cimport PyObject_CheckBuffer, PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE, PyBUF_ANY_CONTIGUOUS from libc.stdlib cimport calloc, free from libc.stdint cimport int32_t, uint32_t, int64_t, uint64_t from libc.stddef cimport wchar_t from libc.string cimport memcpy from enum import Enum as _Enum import ctypes as _ctypes cimport cuda.bindings.cydriver as cydriver import cuda.bindings.driver as _driver cimport cuda.bindings._lib.param_packer as param_packer cdef void* _callocWrapper(length, size): cdef void* out = calloc(length, size) if out is NULL: raise MemoryError('Failed to allocated length x size memory: {}x{}'.format(length, size)) return out cdef class _HelperKernelParams: supported_types = { # excluding void_p and None, which are handled specially _ctypes.c_bool, _ctypes.c_char, _ctypes.c_wchar, _ctypes.c_byte, _ctypes.c_ubyte, _ctypes.c_short, _ctypes.c_ushort, _ctypes.c_int, _ctypes.c_uint, _ctypes.c_long, _ctypes.c_ulong, _ctypes.c_longlong, _ctypes.c_ulonglong, _ctypes.c_size_t, _ctypes.c_float, _ctypes.c_double } max_param_size = max(_ctypes.sizeof(max(_HelperKernelParams.supported_types, key=lambda t:_ctypes.sizeof(t))), sizeof(void_ptr)) def __cinit__(self, kernelParams): self._pyobj_acquired = False self._malloc_list_created = False if kernelParams is None: self._ckernelParams = NULL elif isinstance(kernelParams, (int)): # Easy run, user gave us an already configured void** address self._ckernelParams = kernelParams elif PyObject_CheckBuffer(kernelParams): # Easy run, get address from Python Buffer Protocol err_buffer = PyObject_GetBuffer(kernelParams, &self._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS) if err_buffer == -1: raise RuntimeError("Argument 'kernelParams' failed to retrieve buffer through Buffer Protocol") self._pyobj_acquired = True self._ckernelParams = self._pybuffer.buf elif isinstance(kernelParams, (tuple)) and len(kernelParams) == 2 and isinstance(kernelParams[0], (tuple)) and isinstance(kernelParams[1], (tuple)): # Hard run, construct and fill out contigues memory using provided kernel values and types based if len(kernelParams[0]) != len(kernelParams[1]): raise TypeError("Argument 'kernelParams' has tuples with different length") if len(kernelParams[0]) != 0: self._length = len(kernelParams[0]) self._ckernelParams = _callocWrapper(len(kernelParams[0]), sizeof(void*)) self._ckernelParamsData = _callocWrapper(len(kernelParams[0]), _HelperKernelParams.max_param_size) self._malloc_list_created = True idx = 0 data_idx = 0 for value, ctype in zip(kernelParams[0], kernelParams[1]): if ctype is None: # special cases for None if callable(getattr(value, 'getPtr', None)): self._ckernelParams[idx] = value.getPtr() elif isinstance(value, (_ctypes.Structure)): self._ckernelParams[idx] = _ctypes.addressof(value) elif isinstance(value, (_Enum)): self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) (self._ckernelParams[idx])[0] = value.value data_idx += sizeof(int) else: raise TypeError("Provided argument is of type {} but expected Type {}, {} or CUDA Binding structure with getPtr() attribute".format(type(value), type(_ctypes.Structure), type(_ctypes.c_void_p))) elif ctype in _HelperKernelParams.supported_types: self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) # handle case where a float is passed as a double if ctype == _ctypes.c_double and isinstance(value, _ctypes.c_float): value = ctype(value.value) if not isinstance(value, ctype): # make it a ctype size = param_packer.feed(self._ckernelParams[idx], value, ctype) if size == 0: # feed failed value = ctype(value) size = _ctypes.sizeof(ctype) addr = (_ctypes.addressof(value)) memcpy(self._ckernelParams[idx], addr, size) else: size = _ctypes.sizeof(ctype) addr = (_ctypes.addressof(value)) memcpy(self._ckernelParams[idx], addr, size) data_idx += size elif ctype == _ctypes.c_void_p: # special cases for void_p if isinstance(value, (int, _ctypes.c_void_p)): self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) (self._ckernelParams[idx])[0] = value.value if isinstance(value, (_ctypes.c_void_p)) else value data_idx += sizeof(void_ptr) elif callable(getattr(value, 'getPtr', None)): self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) (self._ckernelParams[idx])[0] = value.getPtr() data_idx += sizeof(void_ptr) else: raise TypeError("Provided argument is of type {} but expected Type {}, {} or CUDA Binding structure with getPtr() attribute".format(type(value), type(int), type(_ctypes.c_void_p))) else: raise TypeError("Unsupported type: " + str(type(ctype))) idx += 1 else: raise TypeError("Argument 'kernelParams' is not a valid type: tuple[tuple[Any, ...], tuple[Any, ...]] or PyObject implimenting Buffer Protocol or Int") def __dealloc__(self): if self._pyobj_acquired is True: PyBuffer_Release(&self._pybuffer) if self._malloc_list_created is True: free(self._ckernelParams) free(self._ckernelParamsData) @property def ckernelParams(self): return self._ckernelParams cdef class _HelperInputVoidPtr: def __cinit__(self, ptr): self._pyobj_acquired = False if ptr is None: self._cptr = NULL elif isinstance(ptr, (int)): # Easy run, user gave us an already configured void** address self._cptr = ptr elif isinstance(ptr, (_driver.CUdeviceptr)): self._cptr = int(ptr) elif PyObject_CheckBuffer(ptr): # Easy run, get address from Python Buffer Protocol err_buffer = PyObject_GetBuffer(ptr, &self._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS) if err_buffer == -1: raise RuntimeError("Failed to retrieve buffer through Buffer Protocol") self._pyobj_acquired = True self._cptr = self._pybuffer.buf else: raise TypeError("Provided argument is of type {} but expected Type {}, {} or object with Buffer Protocol".format(type(ptr), type(None), type(int))) def __dealloc__(self): if self._pyobj_acquired is True: PyBuffer_Release(&self._pybuffer) @property def cptr(self): return self._cptr cdef class _HelperCUmemPool_attribute: def __cinit__(self, attr, init_value, is_getter=False): self._is_getter = is_getter self._attr = attr.value if self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES,): self._int_val = init_value self._cptr = &self._int_val elif self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_HIGH,): if self._is_getter: self._cuuint64_t_val = _driver.cuuint64_t() self._cptr = self._cuuint64_t_val.getPtr() else: self._cptr = init_value.getPtr() else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr def pyObj(self): assert(self._is_getter == True) if self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES,): return self._int_val elif self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_HIGH,): return self._cuuint64_t_val else: raise TypeError('Unsupported attribute value: {}'.format(self._attr)) cdef class _HelperCUmem_range_attribute: def __cinit__(self, attr, data_size): self._data_size = data_size self._attr = attr.value if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION, cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION,): self._cptr = &self._int_val elif self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): self._cptr = _callocWrapper(1, self._data_size) self._int_val_list = self._cptr else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): free(self._cptr) @property def cptr(self): return self._cptr def pyObj(self): if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION, cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION,): return self._int_val elif self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): return [self._int_val_list[idx] for idx in range(int(self._data_size/4))] else: raise TypeError('Unsupported attribute value: {}'.format(self._attr)) cdef class _HelperCUpointer_attribute: def __cinit__(self, attr, init_value, is_getter=False): self._is_getter = is_getter self._attr = attr.value if self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_CONTEXT,): if self._is_getter: self._ctx = _driver.CUcontext() self._cptr = self._ctx.getPtr() else: self._cptr = init_value.getPtr() elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ACCESS_FLAGS,): self._uint = init_value self._cptr = &self._uint elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_POINTER, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_START_ADDR,): if self._is_getter: self._devptr = _driver.CUdeviceptr() self._cptr = self._devptr.getPtr() else: self._cptr = init_value.getPtr() elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_HOST_POINTER,): self._void = init_value self._cptr = &self._void elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_P2P_TOKENS,): if self._is_getter: self._token = _driver.CUDA_POINTER_ATTRIBUTE_P2P_TOKENS() self._cptr = self._token.getPtr() else: self._cptr = init_value.getPtr() elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_MANAGED, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MAPPED,): self._bool = init_value self._cptr = &self._bool elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_BUFFER_ID,): self._ull = init_value self._cptr = &self._ull elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_SIZE,): self._size = init_value self._cptr = &self._size elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE,): if self._is_getter: self._mempool = _driver.CUmemoryPool() self._cptr = self._mempool.getPtr() else: self._cptr = init_value.getPtr() else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr def pyObj(self): assert(self._is_getter == True) if self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_CONTEXT,): return self._ctx elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ACCESS_FLAGS,): return self._uint elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_POINTER, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_START_ADDR,): return self._devptr elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_HOST_POINTER,): return self._void elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_P2P_TOKENS,): return self._token elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_MANAGED, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE, cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MAPPED,): return self._bool elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_BUFFER_ID,): return self._ull elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_SIZE,): return self._size elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE,): return self._mempool else: raise TypeError('Unsupported attribute value: {}'.format(self._attr)) cdef class _HelperCUgraphMem_attribute: def __cinit__(self, attr, init_value, is_getter=False): self._is_getter = is_getter self._attr = attr.value if self._attr in (cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_HIGH, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH,): if self._is_getter: self._cuuint64_t_val = _driver.cuuint64_t() self._cptr = self._cuuint64_t_val.getPtr() else: self._cptr = init_value.getPtr() else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr def pyObj(self): assert(self._is_getter == True) if self._attr in (cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_HIGH, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT, cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH,): return self._cuuint64_t_val else: raise TypeError('Unsupported attribute value: {}'.format(self._attr)) cdef class _HelperCUjit_option: def __cinit__(self, attr, init_value): self._attr = attr.value if self._attr in (cydriver.CUjit_option_enum.CU_JIT_MAX_REGISTERS, cydriver.CUjit_option_enum.CU_JIT_THREADS_PER_BLOCK, cydriver.CUjit_option_enum.CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES, cydriver.CUjit_option_enum.CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES, cydriver.CUjit_option_enum.CU_JIT_OPTIMIZATION_LEVEL, cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_COUNT, cydriver.CUjit_option_enum.CU_JIT_TARGET_FROM_CUCONTEXT, cydriver.CUjit_option_enum.CU_JIT_REFERENCED_KERNEL_COUNT, cydriver.CUjit_option_enum.CU_JIT_REFERENCED_VARIABLE_COUNT, cydriver.CUjit_option_enum.CU_JIT_MIN_CTA_PER_SM,): self._uint = init_value self._cptr = self._uint elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_WALL_TIME,): self._float = init_value self._cptr = self._float elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_INFO_LOG_BUFFER, cydriver.CUjit_option_enum.CU_JIT_ERROR_LOG_BUFFER): self._charstar = init_value self._cptr = self._charstar elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_TARGET,): self._target = init_value.value self._cptr = self._target elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_FALLBACK_STRATEGY,): self._fallback = init_value.value self._cptr = self._fallback elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GENERATE_DEBUG_INFO, cydriver.CUjit_option_enum.CU_JIT_LOG_VERBOSE, cydriver.CUjit_option_enum.CU_JIT_GENERATE_LINE_INFO, cydriver.CUjit_option_enum.CU_JIT_LTO, cydriver.CUjit_option_enum.CU_JIT_FTZ, cydriver.CUjit_option_enum.CU_JIT_PREC_DIV, cydriver.CUjit_option_enum.CU_JIT_PREC_SQRT, cydriver.CUjit_option_enum.CU_JIT_FMA, cydriver.CUjit_option_enum.CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES,): self._int = init_value self._cptr = self._int elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_CACHE_MODE,): self._cacheMode = init_value.value self._cptr = self._cacheMode elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_NAMES, cydriver.CUjit_option_enum.CU_JIT_REFERENCED_KERNEL_NAMES, cydriver.CUjit_option_enum.CU_JIT_REFERENCED_VARIABLE_NAMES,): self._charstarstar = init_value self._cptr = &self._charstarstar[0] elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_ADDRESSES,): pylist = [_HelperInputVoidPtr(val) for val in init_value] self._voidstarstar = _InputVoidPtrPtrHelper(pylist) self._cptr = self._voidstarstar.cptr else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr cdef class _HelperCudaJitOption: def __cinit__(self, attr, init_value): self._attr = attr.value if self._attr in (cyruntime.cudaJitOption.cudaJitMaxRegisters, cyruntime.cudaJitOption.cudaJitThreadsPerBlock, cyruntime.cudaJitOption.cudaJitInfoLogBufferSizeBytes, cyruntime.cudaJitOption.cudaJitErrorLogBufferSizeBytes, cyruntime.cudaJitOption.cudaJitOptimizationLevel, cyruntime.cudaJitOption.cudaJitMinCtaPerSm,): self._uint = init_value self._cptr = self._uint elif self._attr in (cyruntime.cudaJitOption.cudaJitWallTime,): self._float = init_value self._cptr = self._float elif self._attr in (cyruntime.cudaJitOption.cudaJitInfoLogBuffer, cyruntime.cudaJitOption.cudaJitErrorLogBuffer): self._charstar = init_value self._cptr = self._charstar elif self._attr in (cyruntime.cudaJitOption.cudaJitFallbackStrategy,): self._fallback = init_value.value self._cptr = self._fallback elif self._attr in (cyruntime.cudaJitOption.cudaJitGenerateDebugInfo, cyruntime.cudaJitOption.cudaJitLogVerbose, cyruntime.cudaJitOption.cudaJitGenerateLineInfo, cyruntime.cudaJitOption.cudaJitPositionIndependentCode, cyruntime.cudaJitOption.cudaJitMaxThreadsPerBlock, cyruntime.cudaJitOption.cudaJitOverrideDirectiveValues,): self._int = init_value self._cptr = self._int elif self._attr in (cyruntime.cudaJitOption.cudaJitCacheMode,): self._cacheMode = init_value.value self._cptr = self._cacheMode else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr cdef class _HelperCUlibraryOption: def __cinit__(self, attr, init_value): self._attr = attr.value if False: pass elif self._attr in (cydriver.CUlibraryOption_enum.CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE,): self._cptr = init_value.getPtr() elif self._attr in (cydriver.CUlibraryOption_enum.CU_LIBRARY_BINARY_IS_PRESERVED,): self._uint = init_value self._cptr = self._uint else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr cdef class _HelperCudaLibraryOption: def __cinit__(self, attr, init_value): self._attr = attr.value if False: pass elif self._attr in (cyruntime.cudaLibraryOption.cudaLibraryHostUniversalFunctionAndDataTable,): self._cptr = init_value.getPtr() elif self._attr in (cyruntime.cudaLibraryOption.cudaLibraryBinaryIsPreserved,): self._uint = init_value self._cptr = self._uint else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr cdef class _HelperCUmemAllocationHandleType: def __cinit__(self, attr): self._type = attr.value if False: pass elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_NONE,): self._cptr = &self._int elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR,): self._cptr = &self._int elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32,): self._cptr = &self._handle elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32_KMT,): self._cptr = &self._d3dkmt_handle elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_FABRIC,): self._mem_fabric_handle = _driver.CUmemFabricHandle() self._cptr = self._mem_fabric_handle.getPtr() else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr def pyObj(self): if False: pass elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_NONE,): return self._int elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR,): return self._int elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32,): return self._handle elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32_KMT,): return self._d3dkmt_handle elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_FABRIC,): return self._mem_fabric_handle else: raise TypeError('Unsupported attribute: {}'.format(self._type)) cdef class _InputVoidPtrPtrHelper: def __cinit__(self, lst): self._cptr = _callocWrapper(len(lst), sizeof(void*)) for idx in range(len(lst)): self._cptr[idx] = lst[idx].cptr def __dealloc__(self): free(self._cptr) @property def cptr(self): return self._cptr cdef class _HelperCUcoredumpSettings: def __cinit__(self, attr, init_value, is_getter=False): self._is_getter = is_getter self._attrib = attr.value if self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_FILE, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_PIPE,): if self._is_getter: self._charstar = _callocWrapper(1024, 1) self._cptr = self._charstar self._size = 1024 else: self._charstar = init_value self._cptr = self._charstar self._size = len(init_value) elif self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_ON_EXCEPTION, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_TRIGGER_HOST, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_LIGHTWEIGHT, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_USER_TRIGGER,): if self._is_getter == False: self._bool = init_value self._cptr = &self._bool self._size = 1 else: raise TypeError('Unsupported attribute: {}'.format(attr.name)) def __dealloc__(self): pass @property def cptr(self): return self._cptr def size(self): return self._size def pyObj(self): assert(self._is_getter == True) if self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_FILE, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_PIPE,): return self._charstar elif self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_ON_EXCEPTION, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_TRIGGER_HOST, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_LIGHTWEIGHT, cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_USER_TRIGGER,): return self._bool else: raise TypeError('Unsupported attribute value: {}'.format(self._attrib))