Harmony18090's picture
Add source batch 2/11
76f9669 verified
raw
history blame
31.2 kB
# 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 = <void**><void_ptr>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 = <void**><void_ptr>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 = <void**>_callocWrapper(len(kernelParams[0]), sizeof(void*))
self._ckernelParamsData = <char*>_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] = <void*><void_ptr>value.getPtr()
elif isinstance(value, (_ctypes.Structure)):
self._ckernelParams[idx] = <void*><void_ptr>_ctypes.addressof(value)
elif isinstance(value, (_Enum)):
self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx])
(<int*>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 = <void*>(<void_ptr>_ctypes.addressof(value))
memcpy(self._ckernelParams[idx], addr, size)
else:
size = _ctypes.sizeof(ctype)
addr = <void*>(<void_ptr>_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])
(<void_ptr*>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])
(<void_ptr*>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 <void_ptr>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 = <void*><void_ptr>ptr
elif isinstance(ptr, (_driver.CUdeviceptr)):
self._cptr = <void*><void_ptr>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 = <void*><void_ptr>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 <void_ptr>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 = <void*>&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 = <void*><void_ptr>self._cuuint64_t_val.getPtr()
else:
self._cptr = <void*><void_ptr>init_value.getPtr()
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*>&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 = <int*>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 <void_ptr>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 = <void*><void_ptr>self._ctx.getPtr()
else:
self._cptr = <void*><void_ptr>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 = <void*>&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 = <void*><void_ptr>self._devptr.getPtr()
else:
self._cptr = <void*><void_ptr>init_value.getPtr()
elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_HOST_POINTER,):
self._void = <void**><void_ptr>init_value
self._cptr = <void*>&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 = <void*><void_ptr>self._token.getPtr()
else:
self._cptr = <void*><void_ptr>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 = <void*>&self._bool
elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_BUFFER_ID,):
self._ull = init_value
self._cptr = <void*>&self._ull
elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_SIZE,):
self._size = init_value
self._cptr = <void*>&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 = <void*><void_ptr>self._mempool.getPtr()
else:
self._cptr = <void*><void_ptr>init_value.getPtr()
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 <void_ptr>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 = <void*><void_ptr>self._cuuint64_t_val.getPtr()
else:
self._cptr = <void*><void_ptr>init_value.getPtr()
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*><void_ptr>self._uint
elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_WALL_TIME,):
self._float = init_value
self._cptr = <void*><void_ptr>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 = <void*><void_ptr>self._charstar
elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_TARGET,):
self._target = init_value.value
self._cptr = <void*><void_ptr>self._target
elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_FALLBACK_STRATEGY,):
self._fallback = init_value.value
self._cptr = <void*><void_ptr>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 = <void*><void_ptr>self._int
elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_CACHE_MODE,):
self._cacheMode = init_value.value
self._cptr = <void*><void_ptr>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 = <void*>&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 = <void*><void_ptr>self._voidstarstar.cptr
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*><void_ptr>self._uint
elif self._attr in (cyruntime.cudaJitOption.cudaJitWallTime,):
self._float = init_value
self._cptr = <void*><void_ptr>self._float
elif self._attr in (cyruntime.cudaJitOption.cudaJitInfoLogBuffer,
cyruntime.cudaJitOption.cudaJitErrorLogBuffer):
self._charstar = init_value
self._cptr = <void*><void_ptr>self._charstar
elif self._attr in (cyruntime.cudaJitOption.cudaJitFallbackStrategy,):
self._fallback = init_value.value
self._cptr = <void*><void_ptr>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 = <void*><void_ptr>self._int
elif self._attr in (cyruntime.cudaJitOption.cudaJitCacheMode,):
self._cacheMode = init_value.value
self._cptr = <void*><void_ptr>self._cacheMode
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*><void_ptr>init_value.getPtr()
elif self._attr in (cydriver.CUlibraryOption_enum.CU_LIBRARY_BINARY_IS_PRESERVED,):
self._uint = init_value
self._cptr = <void*><void_ptr>self._uint
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*><void_ptr>init_value.getPtr()
elif self._attr in (cyruntime.cudaLibraryOption.cudaLibraryBinaryIsPreserved,):
self._uint = init_value
self._cptr = <void*><void_ptr>self._uint
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 = <void*>&self._int
elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR,):
self._cptr = <void*>&self._int
elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32,):
self._cptr = <void*>&self._handle
elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32_KMT,):
self._cptr = <void*>&self._d3dkmt_handle
elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_FABRIC,):
self._mem_fabric_handle = _driver.CUmemFabricHandle()
self._cptr = <void*><void_ptr>self._mem_fabric_handle.getPtr()
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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 <void_ptr>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 = <void**>_callocWrapper(len(lst), sizeof(void*))
for idx in range(len(lst)):
self._cptr[idx] = <void*><void_ptr>lst[idx].cptr
def __dealloc__(self):
free(self._cptr)
@property
def cptr(self):
return <void_ptr>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 = <char*>_callocWrapper(1024, 1)
self._cptr = <void*><void_ptr>self._charstar
self._size = 1024
else:
self._charstar = init_value
self._cptr = <void*><void_ptr>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 = <void*>&self._bool
self._size = 1
else:
raise TypeError('Unsupported attribute: {}'.format(attr.name))
def __dealloc__(self):
pass
@property
def cptr(self):
return <void_ptr>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))