Coverage for cuda / bindings / _lib / utils.pxi: 57%

375 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-10 01:19 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE 

3  

4from cpython.buffer cimport PyObject_CheckBuffer, PyObject_GetBuffer, PyBuffer_Release, PyBUF_SIMPLE, PyBUF_ANY_CONTIGUOUS 

5from libc.stdlib cimport calloc, free 

6from libc.stdint cimport int32_t, uint32_t, int64_t, uint64_t 

7from libc.stddef cimport wchar_t 

8from libc.string cimport memcpy 

9from enum import Enum as _Enum 

10import ctypes as _ctypes 

11cimport cuda.bindings.cydriver as cydriver 

12cimport cuda.bindings._lib.param_packer as param_packer 

13  

14cdef void* _callocWrapper(length, size): 

15 cdef void* out = calloc(length, size) 

16 if out is NULL: 

17 raise MemoryError('Failed to allocated length x size memory: {}x{}'.format(length, size)) 

18 return out 

19  

20cdef class _HelperKernelParams: 

21 supported_types = { # excluding void_p and None, which are handled specially 

22 _ctypes.c_bool, 

23 _ctypes.c_char, 

24 _ctypes.c_wchar, 

25 _ctypes.c_byte, 

26 _ctypes.c_ubyte, 

27 _ctypes.c_short, 

28 _ctypes.c_ushort, 

29 _ctypes.c_int, 

30 _ctypes.c_uint, 

31 _ctypes.c_long, 

32 _ctypes.c_ulong, 

33 _ctypes.c_longlong, 

34 _ctypes.c_ulonglong, 

35 _ctypes.c_size_t, 

36 _ctypes.c_float, 

37 _ctypes.c_double 

38 } 

39  

40 max_param_size = max(_ctypes.sizeof(max(_HelperKernelParams.supported_types, key=lambda t:_ctypes.sizeof(t))), sizeof(void_ptr)) 

41  

42 def __cinit__(self, kernelParams): 

43 self._pyobj_acquired = False 

44 self._malloc_list_created = False 

45 if kernelParams is None: 

46 self._ckernelParams = NULL 

47 elif isinstance(kernelParams, (int)): 

48 # Easy run, user gave us an already configured void** address 

49 self._ckernelParams = <void**><void_ptr>kernelParams 

50 elif PyObject_CheckBuffer(kernelParams): 

51 # Easy run, get address from Python Buffer Protocol 

52 err_buffer = PyObject_GetBuffer(kernelParams, &self._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS) 

53 if err_buffer == -1: 

54 raise RuntimeError("Argument 'kernelParams' failed to retrieve buffer through Buffer Protocol") 

55 self._pyobj_acquired = True 

56 self._ckernelParams = <void**><void_ptr>self._pybuffer.buf 

57 elif isinstance(kernelParams, (tuple)) and len(kernelParams) == 2 and isinstance(kernelParams[0], (tuple)) and isinstance(kernelParams[1], (tuple)): 

58 # Hard run, construct and fill out contigues memory using provided kernel values and types based 

59 if len(kernelParams[0]) != len(kernelParams[1]): 

60 raise TypeError("Argument 'kernelParams' has tuples with different length") 

61 if len(kernelParams[0]) != 0: 

62 self._length = len(kernelParams[0]) 

63 self._ckernelParams = <void**>_callocWrapper(len(kernelParams[0]), sizeof(void*)) 

64 self._ckernelParamsData = <char*>_callocWrapper(len(kernelParams[0]), _HelperKernelParams.max_param_size) 

65 self._malloc_list_created = True 

66  

67 idx = 0 

68 data_idx = 0 

69 for value, ctype in zip(kernelParams[0], kernelParams[1]): 

70 if ctype is None: 

71 # special cases for None 

72 if callable(getattr(value, 'getPtr', None)): 

73 self._ckernelParams[idx] = <void*><void_ptr>value.getPtr() 

74 elif isinstance(value, (_ctypes.Structure)): 

75 self._ckernelParams[idx] = <void*><void_ptr>_ctypes.addressof(value) 

76 elif isinstance(value, (_Enum)): 

77 self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) 

78 (<int*>self._ckernelParams[idx])[0] = value.value 

79 data_idx += sizeof(int) 

80 else: 

81 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))) 

82 elif ctype in _HelperKernelParams.supported_types: 

83 self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) 

84  

85 # handle case where a float is passed as a double 

86 if ctype == _ctypes.c_double and isinstance(value, _ctypes.c_float): 

87 value = ctype(value.value) 

88 if not isinstance(value, ctype): # make it a ctype 

89 size = param_packer.feed(self._ckernelParams[idx], value, ctype) 

90 if size == 0: # feed failed 

91 value = ctype(value) 

92 size = _ctypes.sizeof(ctype) 

93 addr = <void*>(<void_ptr>_ctypes.addressof(value)) 

94 memcpy(self._ckernelParams[idx], addr, size) 

95 else: 

96 size = _ctypes.sizeof(ctype) 

97 addr = <void*>(<void_ptr>_ctypes.addressof(value)) 

98 memcpy(self._ckernelParams[idx], addr, size) 

99 data_idx += size 

100 elif ctype == _ctypes.c_void_p: 

101 # special cases for void_p 

102 if isinstance(value, (int, _ctypes.c_void_p)): 

103 self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) 

104 (<void_ptr*>self._ckernelParams[idx])[0] = value.value if isinstance(value, (_ctypes.c_void_p)) else value 

105 data_idx += sizeof(void_ptr) 

106 elif callable(getattr(value, 'getPtr', None)): 

107 self._ckernelParams[idx] = &(self._ckernelParamsData[data_idx]) 

108 (<void_ptr*>self._ckernelParams[idx])[0] = value.getPtr() 

109 data_idx += sizeof(void_ptr) 

110 else: 

111 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))) 

112 else: 

113 raise TypeError("Unsupported type: " + str(type(ctype))) 

114 idx += 1 

115 else: 

116 raise TypeError("Argument 'kernelParams' is not a valid type: tuple[tuple[Any, ...], tuple[Any, ...]] or PyObject implimenting Buffer Protocol or Int") 

117  

118 def __dealloc__(self): 

119 if self._pyobj_acquired is True: 

120 PyBuffer_Release(&self._pybuffer) 

121 if self._malloc_list_created is True: 

122 free(self._ckernelParams) 

123 free(self._ckernelParamsData) 

124  

125 @property 

126 def ckernelParams(self): 

127 return <void_ptr>self._ckernelParams 

128  

129cdef class _HelperInputVoidPtr: 

130 def __cinit__(self, ptr): 

131 self._pyobj_acquired = False 

132 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) 

139 elif PyObject_CheckBuffer(ptr): 

140 # Easy run, get address from Python Buffer Protocol 

141 err_buffer = PyObject_GetBuffer(ptr, &self._pybuffer, PyBUF_SIMPLE | PyBUF_ANY_CONTIGUOUS) 

142 if err_buffer == -1: 

143 raise RuntimeError("Failed to retrieve buffer through Buffer Protocol") 

144 self._pyobj_acquired = True 

145 self._cptr = <void*><void_ptr>self._pybuffer.buf 

146 else: 

147 raise TypeError("Provided argument is of type {} but expected Type {}, {} or object with Buffer Protocol".format(type(ptr), type(None), type(int))) 

148  

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 

156  

157cdef class _HelperCUmemPool_attribute: 

158 def __cinit__(self, attr, init_value, is_getter=False): 

159 self._is_getter = is_getter 

160 self._attr = attr.value 

161 if self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, 

162 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, 

163 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES,): 

164 self._int_val = init_value 

165 self._cptr = <void*>&self._int_val 

166 elif self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, 

167 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, 

168 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, 

169 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, 

170 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_HIGH,): 

171 if self._is_getter: 

172 self._cuuint64_t_val = _driver["cuuint64_t"]() 

173 self._cptr = <void*><void_ptr>self._cuuint64_t_val.getPtr() 

174 else: 

175 self._cptr = <void*><void_ptr>init_value.getPtr() 

176 else: 

177 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

178  

179 def __dealloc__(self): 

180 pass 

181  

182 @property 

183 def cptr(self): 

184 return <void_ptr>self._cptr 

185  

186 def pyObj(self): 

187 assert(self._is_getter == True) 

188 if self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES, 

189 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC, 

190 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES,): 

191 return self._int_val 

192 elif self._attr in (cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RELEASE_THRESHOLD, 

193 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT, 

194 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH, 

195 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_CURRENT, 

196 cydriver.CUmemPool_attribute_enum.CU_MEMPOOL_ATTR_USED_MEM_HIGH,): 

197 return self._cuuint64_t_val 

198 else: 

199 raise TypeError('Unsupported attribute value: {}'.format(self._attr)) 

200  

201cdef class _HelperCUmem_range_attribute: 

202 def __cinit__(self, attr, data_size): 

203 self._data_size = data_size 

204 self._attr = attr.value 

205 if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, 

206 cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION, 

207 cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION,): 

208 self._cptr = <void*>&self._int_val 

209 elif self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): 

210 self._cptr = _callocWrapper(1, self._data_size) 

211 self._int_val_list = <int*>self._cptr 

212 else: 

213 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

214  

215 def __dealloc__(self): 

216 if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): 

217 free(self._cptr) 

218  

219 @property 

220 def cptr(self): 

221 return <void_ptr>self._cptr 

222  

223 def pyObj(self): 

224 if self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY, 

225 cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION, 

226 cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION,): 

227 return self._int_val 

228 elif self._attr in (cydriver.CUmem_range_attribute_enum.CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY,): 

229 return [self._int_val_list[idx] for idx in range(int(self._data_size/4))] 

230 else: 

231 raise TypeError('Unsupported attribute value: {}'.format(self._attr)) 

232  

233cdef class _HelperCUpointer_attribute: 

234 def __cinit__(self, attr, init_value, is_getter=False): 

235 self._is_getter = is_getter 

236 self._attr = attr.value 

237 if self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_CONTEXT,): 

238 if self._is_getter: 

239 self._ctx = _driver["CUcontext"]() 

240 self._cptr = <void*><void_ptr>self._ctx.getPtr() 

241 else: 

242 self._cptr = <void*><void_ptr>init_value.getPtr() 

243 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, 

244 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, 

245 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES, 

246 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE, 

247 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ACCESS_FLAGS,): 

248 self._uint = init_value 

249 self._cptr = <void*>&self._uint 

250 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_POINTER, 

251 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_START_ADDR,): 

252 if self._is_getter: 

253 self._devptr = _driver["CUdeviceptr"]() 

254 self._cptr = <void*><void_ptr>self._devptr.getPtr() 

255 else: 

256 self._cptr = <void*><void_ptr>init_value.getPtr() 

257 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_HOST_POINTER,): 

258 self._void = <void**><void_ptr>init_value 

259 self._cptr = <void*>&self._void 

260 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_P2P_TOKENS,): 

261 if self._is_getter: 

262 self._token = _driver["CUDA_POINTER_ATTRIBUTE_P2P_TOKENS"]() 

263 self._cptr = <void*><void_ptr>self._token.getPtr() 

264 else: 

265 self._cptr = <void*><void_ptr>init_value.getPtr() 

266 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS, 

267 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_MANAGED, 

268 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE, 

269 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MAPPED,): 

270 self._bool = init_value 

271 self._cptr = <void*>&self._bool 

272 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_BUFFER_ID,): 

273 self._ull = init_value 

274 self._cptr = <void*>&self._ull 

275 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_SIZE,): 

276 self._size = init_value 

277 self._cptr = <void*>&self._size 

278 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE,): 

279 if self._is_getter: 

280 self._mempool = _driver["CUmemoryPool"]() 

281 self._cptr = <void*><void_ptr>self._mempool.getPtr() 

282 else: 

283 self._cptr = <void*><void_ptr>init_value.getPtr() 

284 else: 

285 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

286  

287 def __dealloc__(self): 

288 pass 

289  

290 @property 

291 def cptr(self): 

292 return <void_ptr>self._cptr 

293  

294 def pyObj(self): 

295 assert(self._is_getter == True) 

296 if self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_CONTEXT,): 

297 return self._ctx 

298 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, 

299 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, 

300 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES, 

301 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE, 

302 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_ACCESS_FLAGS,): 

303 return self._uint 

304 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_DEVICE_POINTER, 

305 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_START_ADDR,): 

306 return self._devptr 

307 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_HOST_POINTER,): 

308 return <void_ptr>self._void 

309 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_P2P_TOKENS,): 

310 return self._token 

311 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_SYNC_MEMOPS, 

312 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_MANAGED, 

313 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE, 

314 cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MAPPED,): 

315 return self._bool 

316 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_BUFFER_ID,): 

317 return self._ull 

318 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_RANGE_SIZE,): 

319 return self._size 

320 elif self._attr in (cydriver.CUpointer_attribute_enum.CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE,): 

321 return self._mempool 

322 else: 

323 raise TypeError('Unsupported attribute value: {}'.format(self._attr)) 

324  

325cdef class _HelperCUgraphMem_attribute: 

326 def __cinit__(self, attr, init_value, is_getter=False): 

327 self._is_getter = is_getter 

328 self._attr = attr.value 

329 if self._attr in (cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT, 

330 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_HIGH, 

331 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT, 

332 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH,): 

333 if self._is_getter: 

334 self._cuuint64_t_val = _driver["cuuint64_t"]() 

335 self._cptr = <void*><void_ptr>self._cuuint64_t_val.getPtr() 

336 else: 

337 self._cptr = <void*><void_ptr>init_value.getPtr() 

338 else: 

339 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

340  

341 def __dealloc__(self): 

342 pass 

343  

344 @property 

345 def cptr(self): 

346 return <void_ptr>self._cptr 

347  

348 def pyObj(self): 

349 assert(self._is_getter == True) 

350 if self._attr in (cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT, 

351 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_USED_MEM_HIGH, 

352 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT, 

353 cydriver.CUgraphMem_attribute_enum.CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH,): 

354 return self._cuuint64_t_val 

355 else: 

356 raise TypeError('Unsupported attribute value: {}'.format(self._attr)) 

357  

358cdef class _HelperCUjit_option: 

359 def __cinit__(self, attr, init_value): 

360 self._attr = attr.value 

361 if self._attr in (cydriver.CUjit_option_enum.CU_JIT_MAX_REGISTERS, 

362 cydriver.CUjit_option_enum.CU_JIT_THREADS_PER_BLOCK, 

363 cydriver.CUjit_option_enum.CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES, 

364 cydriver.CUjit_option_enum.CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES, 

365 cydriver.CUjit_option_enum.CU_JIT_OPTIMIZATION_LEVEL, 

366 cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_COUNT, 

367 cydriver.CUjit_option_enum.CU_JIT_TARGET_FROM_CUCONTEXT, 

368 cydriver.CUjit_option_enum.CU_JIT_REFERENCED_KERNEL_COUNT, 

369 cydriver.CUjit_option_enum.CU_JIT_REFERENCED_VARIABLE_COUNT, 

370 cydriver.CUjit_option_enum.CU_JIT_MIN_CTA_PER_SM, 

371 cydriver.CUjit_option_enum.CU_JIT_SPLIT_COMPILE,): 

372 self._uint = init_value 

373 self._cptr = <void*><void_ptr>self._uint 

374 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_WALL_TIME,): 

375 self._float = init_value 

376 self._cptr = <void*><void_ptr>self._float 

377 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_INFO_LOG_BUFFER, 

378 cydriver.CUjit_option_enum.CU_JIT_ERROR_LOG_BUFFER): 

379 self._charstar = init_value 

380 self._cptr = <void*><void_ptr>self._charstar 

381 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_TARGET,): 

382 self._target = init_value.value 

383 self._cptr = <void*><void_ptr>self._target 

384 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_FALLBACK_STRATEGY,): 

385 self._fallback = init_value.value 

386 self._cptr = <void*><void_ptr>self._fallback 

387 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GENERATE_DEBUG_INFO, 

388 cydriver.CUjit_option_enum.CU_JIT_LOG_VERBOSE, 

389 cydriver.CUjit_option_enum.CU_JIT_GENERATE_LINE_INFO, 

390 cydriver.CUjit_option_enum.CU_JIT_LTO, 

391 cydriver.CUjit_option_enum.CU_JIT_FTZ, 

392 cydriver.CUjit_option_enum.CU_JIT_PREC_DIV, 

393 cydriver.CUjit_option_enum.CU_JIT_PREC_SQRT, 

394 cydriver.CUjit_option_enum.CU_JIT_FMA, 

395 cydriver.CUjit_option_enum.CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES,): 

396 self._int = init_value 

397 self._cptr = <void*><void_ptr>self._int 

398 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_CACHE_MODE,): 

399 self._cacheMode = init_value.value 

400 self._cptr = <void*><void_ptr>self._cacheMode 

401 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_NAMES, 

402 cydriver.CUjit_option_enum.CU_JIT_REFERENCED_KERNEL_NAMES, 

403 cydriver.CUjit_option_enum.CU_JIT_REFERENCED_VARIABLE_NAMES,): 

404 self._charstarstar = init_value 

405 self._cptr = <void*>&self._charstarstar[0] 

406 elif self._attr in (cydriver.CUjit_option_enum.CU_JIT_GLOBAL_SYMBOL_ADDRESSES,): 

407 pylist = [_HelperInputVoidPtr(val) for val in init_value] 

408 self._voidstarstar = _InputVoidPtrPtrHelper(pylist) 

409 self._cptr = <void*><void_ptr>self._voidstarstar.cptr 

410 else: 

411 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

412  

413 def __dealloc__(self): 

414 pass 

415  

416 @property 

417 def cptr(self): 

418 return <void_ptr>self._cptr 

419  

420cdef class _HelperCudaJitOption: 

421 def __cinit__(self, attr, init_value): 

422 self._attr = attr.value 

423 if self._attr in (cyruntime.cudaJitOption.cudaJitMaxRegisters, 

424 cyruntime.cudaJitOption.cudaJitThreadsPerBlock, 

425 cyruntime.cudaJitOption.cudaJitInfoLogBufferSizeBytes, 

426 cyruntime.cudaJitOption.cudaJitErrorLogBufferSizeBytes, 

427 cyruntime.cudaJitOption.cudaJitOptimizationLevel, 

428 cyruntime.cudaJitOption.cudaJitMinCtaPerSm,): 

429 self._uint = init_value 

430 self._cptr = <void*><void_ptr>self._uint 

431 elif self._attr in (cyruntime.cudaJitOption.cudaJitWallTime,): 

432 self._float = init_value 

433 self._cptr = <void*><void_ptr>self._float 

434 elif self._attr in (cyruntime.cudaJitOption.cudaJitInfoLogBuffer, 

435 cyruntime.cudaJitOption.cudaJitErrorLogBuffer): 

436 self._charstar = init_value 

437 self._cptr = <void*><void_ptr>self._charstar 

438 elif self._attr in (cyruntime.cudaJitOption.cudaJitFallbackStrategy,): 

439 self._fallback = init_value.value 

440 self._cptr = <void*><void_ptr>self._fallback 

441 elif self._attr in (cyruntime.cudaJitOption.cudaJitGenerateDebugInfo, 

442 cyruntime.cudaJitOption.cudaJitLogVerbose, 

443 cyruntime.cudaJitOption.cudaJitGenerateLineInfo, 

444 cyruntime.cudaJitOption.cudaJitPositionIndependentCode, 

445 cyruntime.cudaJitOption.cudaJitMaxThreadsPerBlock, 

446 cyruntime.cudaJitOption.cudaJitOverrideDirectiveValues,): 

447 self._int = init_value 

448 self._cptr = <void*><void_ptr>self._int 

449 elif self._attr in (cyruntime.cudaJitOption.cudaJitCacheMode,): 

450 self._cacheMode = init_value.value 

451 self._cptr = <void*><void_ptr>self._cacheMode 

452 else: 

453 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

454  

455 def __dealloc__(self): 

456 pass 

457  

458 @property 

459 def cptr(self): 

460 return <void_ptr>self._cptr 

461  

462cdef class _HelperCUlibraryOption: 

463 def __cinit__(self, attr, init_value): 

464 self._attr = attr.value 

465 if False: 

466 pass 

467 elif self._attr in (cydriver.CUlibraryOption_enum.CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE,): 

468 self._cptr = <void*><void_ptr>init_value.getPtr() 

469 elif self._attr in (cydriver.CUlibraryOption_enum.CU_LIBRARY_BINARY_IS_PRESERVED,): 

470 self._uint = init_value 

471 self._cptr = <void*><void_ptr>self._uint 

472 else: 

473 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

474  

475 def __dealloc__(self): 

476 pass 

477  

478 @property 

479 def cptr(self): 

480 return <void_ptr>self._cptr 

481  

482cdef class _HelperCudaLibraryOption: 

483 def __cinit__(self, attr, init_value): 

484 self._attr = attr.value 

485 if False: 

486 pass 

487 elif self._attr in (cyruntime.cudaLibraryOption.cudaLibraryHostUniversalFunctionAndDataTable,): 

488 self._cptr = <void*><void_ptr>init_value.getPtr() 

489 elif self._attr in (cyruntime.cudaLibraryOption.cudaLibraryBinaryIsPreserved,): 

490 self._uint = init_value 

491 self._cptr = <void*><void_ptr>self._uint 

492 else: 

493 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

494  

495 def __dealloc__(self): 

496 pass 

497  

498 @property 

499 def cptr(self): 

500 return <void_ptr>self._cptr 

501  

502cdef class _HelperCUmemAllocationHandleType: 

503 def __cinit__(self, attr): 

504 self._type = attr.value 

505 if False: 

506 pass 

507 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_NONE,): 

508 self._cptr = <void*>&self._int 

509 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR,): 

510 self._cptr = <void*>&self._int 

511 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32,): 

512 self._cptr = <void*>&self._handle 

513 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32_KMT,): 

514 self._cptr = <void*>&self._d3dkmt_handle 

515 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_FABRIC,): 

516 self._mem_fabric_handle = _driver["CUmemFabricHandle"]() 

517 self._cptr = <void*><void_ptr>self._mem_fabric_handle.getPtr() 

518 else: 

519 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

520  

521 def __dealloc__(self): 

522 pass 

523  

524 @property 

525 def cptr(self): 

526 return <void_ptr>self._cptr 

527  

528 def pyObj(self): 

529 if False: 

530 pass 

531 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_NONE,): 

532 return self._int 

533 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR,): 

534 return self._int 

535 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32,): 

536 return <void_ptr>self._handle 

537 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_WIN32_KMT,): 

538 return self._d3dkmt_handle 

539 elif self._type in (cydriver.CUmemAllocationHandleType_enum.CU_MEM_HANDLE_TYPE_FABRIC,): 

540 return self._mem_fabric_handle 

541 else: 

542 raise TypeError('Unsupported attribute: {}'.format(self._type)) 

543  

544cdef class _InputVoidPtrPtrHelper: 

545 def __cinit__(self, lst): 

546 self._cptr = <void**>_callocWrapper(len(lst), sizeof(void*)) 

547 for idx in range(len(lst)): 

548 self._cptr[idx] = <void*><void_ptr>lst[idx].cptr 

549  

550 def __dealloc__(self): 

551 free(self._cptr) 

552  

553 @property 

554 def cptr(self): 

555 return <void_ptr>self._cptr 

556  

557cdef class _HelperCUcoredumpSettings: 

558 def __cinit__(self, attr, init_value, is_getter=False): 

559 self._is_getter = is_getter 

560 self._attrib = attr.value 

561 if self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_FILE, 

562 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_PIPE,): 

563 if self._is_getter: 

564 self._charstar = <char*>_callocWrapper(1024, 1) 

565 self._cptr = <void*><void_ptr>self._charstar 

566 self._size = 1024 

567 else: 

568 self._charstar = init_value 

569 self._cptr = <void*><void_ptr>self._charstar 

570 self._size = len(init_value) 

571 elif self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_ON_EXCEPTION, 

572 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_TRIGGER_HOST, 

573 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_LIGHTWEIGHT, 

574 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_USER_TRIGGER,): 

575 if self._is_getter == False: 

576 self._bool = init_value 

577  

578 self._cptr = <void*>&self._bool 

579 self._size = 1 

580 else: 

581 raise TypeError('Unsupported attribute: {}'.format(attr.name)) 

582  

583 def __dealloc__(self): 

584 pass 

585  

586 @property 

587 def cptr(self): 

588 return <void_ptr>self._cptr 

589  

590 def size(self): 

591 return self._size 

592  

593 def pyObj(self): 

594 assert(self._is_getter == True) 

595 if self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_FILE, 

596 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_PIPE,): 

597 return self._charstar 

598 elif self._attrib in (cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_ON_EXCEPTION, 

599 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_TRIGGER_HOST, 

600 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_LIGHTWEIGHT, 

601 cydriver.CUcoredumpSettings_enum.CU_COREDUMP_ENABLE_USER_TRIGGER,): 

602 return self._bool 

603 else: 

604 raise TypeError('Unsupported attribute value: {}'.format(self._attrib))