Coverage for cuda/core/graph/_subclasses.pyx: 88.89%

729 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-03 02:41 +0000

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

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5"""GraphNode subclasses — EmptyNode through SwitchNode.""" 

6  

7from __future__ import annotations 

8  

9from libc.stddef cimport size_t 

10from libc.stdint cimport uintptr_t 

11from libc.string cimport memset as c_memset 

12  

13from cuda.bindings cimport cydriver 

14  

15from cuda.core._event cimport Event, Event_check_open 

16from cuda.core._kernel_arg_handler cimport ParamHolder 

17from cuda.core._launch_config cimport LaunchConfig 

18from cuda.core._memory._buffer cimport Buffer 

19from cuda.core._module cimport Kernel 

20from cuda.core.graph._graph_definition cimport ( 

21 GraphCondition, 

22 GraphDefinition, 

23 GD_check_valid, 

24) 

25from cuda.core.graph._graph_node cimport ( 

26 GraphNode, 

27 GN_check_valid, 

28 _get_memcpy_memory_type, 

29 _init_memcpy_params, 

30 _resolve_memcpy_operand, 

31) 

32from cuda.core._resource_handles cimport ( 

33 EventHandle, 

34 GraphExecHandle, 

35 GraphHandle, 

36 GraphNodeHandle, 

37 KernelHandle, 

38 OpaqueHandle, 

39 PreparedAttachment, 

40 PreparedChildGraphUpdate, 

41 PreparedExecAttachment, 

42 as_cu, 

43 as_intptr, 

44 create_child_graph_handle, 

45 create_event_handle_ref, 

46 create_kernel_handle_ref, 

47 graph_commit_attachment, 

48 graph_commit_child_graph_update, 

49 graph_commit_exec_attachment, 

50 graph_get_attachment, 

51 graph_node_get_graph, 

52 graph_prepare_attachment, 

53 graph_prepare_child_graph_update, 

54 graph_prepare_exec_attachment, 

55 make_opaque_py, 

56) 

57from cuda.core._utils.cuda_utils cimport HANDLE_RETURN, _parse_fill_value 

58from cuda.core._utils.version cimport cy_binding_version, cy_driver_version 

59  

60from cuda.core.graph._host_callback cimport ( 

61 _is_py_host_trampoline, 

62 _resolve_host_callback, 

63) 

64  

65from cuda.core._utils.cuda_utils import driver, handle_return 

66from cuda.core.typing import GraphConditionalType 

67  

68__all__ = [ 

69 'AllocNode', 

70 'ChildGraphNode', 

71 'ConditionalNode', 

72 'EmptyNode', 

73 'EventRecordNode', 

74 'EventWaitNode', 

75 'ExecutableChildGraphNode', 

76 'ExecutableEventRecordNode', 

77 'ExecutableEventWaitNode', 

78 'ExecutableGraphNode', 

79 'ExecutableHostCallbackNode', 

80 'ExecutableKernelNode', 

81 'ExecutableMemcpyNode', 

82 'ExecutableMemsetNode', 

83 'FreeNode', 

84 'HostCallbackNode', 

85 'IfElseNode', 

86 'IfNode', 

87 'KernelNode', 

88 'MemcpyNode', 

89 'MemsetNode', 

90 'SwitchNode', 

91 'WhileNode', 

92] 

93  

94  

95cdef bint _has_cuGraphNodeGetParams = False 

96cdef bint _version_checked = False 

97  

98  

99cdef void _require_graph_node_update_support() except *: 

100 cdef tuple version = cy_driver_version() 1BDKpVXN78lkibfchgOWPQAICLMuvwEFGxyR9)*JqdezSHa

101 if version < (12, 2, 0): 1BDKpVXN78lkibfchgOWPQAICLMuvwEFGxyR9)*JqdezSHa

102 raise RuntimeError( 

103 "Graph node mutation requires CUDA driver 12.2 or newer; " 

104 f"using driver version {'.'.join(map(str, version))}" 

105 ) 

106 version = cy_binding_version() 1BDKpVXN78lkibfchgOWPQAICLMuvwEFGxyR9)*JqdezSHa

107 if version < (12, 2, 0): 1BDKpVXN78lkibfchgOWPQAICLMuvwEFGxyR9)*JqdezSHa

108 raise RuntimeError( 

109 "Graph node mutation requires cuda.bindings 12.2 or newer; " 

110 f"using cuda.bindings version {'.'.join(map(str, version))}" 

111 ) 

112  

113  

114cdef void _set_definition_node_params( 

115 const GraphNodeHandle& h_node, 

116 cydriver.CUgraphNodeParams* params, 

117 OpaqueHandle owner0, 

118 OpaqueHandle owner1=OpaqueHandle(), 

119 cydriver.CUcontext update_ctx=NULL) except *: 

120 cdef GraphHandle h_graph = graph_node_get_graph(h_node) 1XN78lkibfchgdea

121 cdef cydriver.CUgraphNode node = as_cu(h_node) 1XN78lkibfchgdea

122 if as_cu(h_graph) == NULL: 1XN78lkibfchgdea

123 raise RuntimeError("GraphDefinition is no longer valid") 

124 if node == NULL: 1XN78lkibfchgdea

125 raise RuntimeError("GraphNode has been destroyed") 

126 _require_graph_node_update_support() 1XN78lkibfchgdea

127 cdef cydriver.CUcontext previous_ctx = NULL 1XN78lkibfchgdea

128 cdef bint restore_ctx = False 1XN78lkibfchgdea

129 cdef PreparedAttachment prepared 

130  

131 HANDLE_RETURN(graph_prepare_attachment( 1XN78lkibfchgdea

132 h_graph, owner0, owner1, &prepared)) 

133 if update_ctx != NULL: 1jXN78lkibfchgdea

134 with nogil: 1bfchgdea

135 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&previous_ctx)) 1bfchgdea

136 if previous_ctx != update_ctx: 1bfchgdea

137 HANDLE_RETURN(cydriver.cuCtxSetCurrent(update_ctx)) 1a

138 restore_ctx = True 1a

139 try: 1XN78lkibfchgdea

140 with nogil: 1XN78lkibfchgdea

141 HANDLE_RETURN(cydriver.cuGraphNodeSetParams(node, params)) 1XN78lkibfchgdea

142 finally: 

143 if restore_ctx: 1XN78lkibfchgdea

144 with nogil: 1a

145 HANDLE_RETURN(cydriver.cuCtxSetCurrent(previous_ctx)) 1a

146 HANDLE_RETURN(graph_commit_attachment(prepared, node)) 1XN78lkibfchgdea

147  

148  

149cdef void _set_executable_node_params( 

150 const GraphExecHandle& h_exec, 

151 const GraphNodeHandle& h_node, 

152 cydriver.CUgraphNodeParams* params, 

153 OpaqueHandle owner0=OpaqueHandle(), 

154 OpaqueHandle owner1=OpaqueHandle()) except *: 

155 _require_graph_node_update_support() 1KpOAICLMuvwEFGxyRJqzSH

156  

157 cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) 1KpOAICLMuvwEFGxyRJqzSH

158 cdef cydriver.CUgraphNode node = as_cu(h_node) 1KpOAICLMuvwEFGxyRJqzSH

159 if graph_exec == NULL: 1KpOAICLMuvwEFGxyRJqzSH

160 raise RuntimeError("Graph has been closed") 

161 if node == NULL: 1KpOAICLMuvwEFGxyRJqzSH

162 raise RuntimeError("GraphNode has been destroyed") 

163  

164 cdef PreparedExecAttachment prepared 

165 HANDLE_RETURN(graph_prepare_exec_attachment( 1KpOAICLMuvwEFGxyRJqzSH

166 h_exec, owner0, owner1, &prepared)) 

167  

168 cdef cydriver.CUresult status 

169 with nogil: 1KpOAICLMuvwEFGxyRJqzSH

170 status = cydriver.cuGraphExecNodeSetParams( 1KpOAICLMuvwEFGxyRJqzSH

171 graph_exec, node, params) 

172 if status == cydriver.CUDA_SUCCESS: 1KpOAICLMuvwEFGxyRJqzSH

173 graph_commit_exec_attachment(prepared) 1KpOAICLMuvwEFGxyRJqSH

174 HANDLE_RETURN(status) 1KpOAICLMuvwEFGxyRJqzSH

175  

176  

177cdef bint _get_executable_node_enabled( 

178 const GraphExecHandle& h_exec, 

179 const GraphNodeHandle& h_node) except *: 

180 _require_graph_node_update_support() 1WPQ

181  

182 cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) 1WPQ

183 cdef cydriver.CUgraphNode node = as_cu(h_node) 1WPQ

184 cdef unsigned int enabled 

185 if graph_exec == NULL: 1WPQ

186 raise RuntimeError("Graph has been closed") 

187 if node == NULL: 1WPQ

188 raise RuntimeError("GraphNode has been destroyed") 

189 with nogil: 1WPQ

190 HANDLE_RETURN(cydriver.cuGraphNodeGetEnabled( 1WPQ

191 graph_exec, node, &enabled)) 

192 return enabled != 0 1WPQ

193  

194  

195cdef void _set_executable_node_enabled( 

196 const GraphExecHandle& h_exec, 

197 const GraphNodeHandle& h_node, 

198 bint enabled) except *: 

199 _require_graph_node_update_support() 1WPQ

200  

201 cdef cydriver.CUgraphExec graph_exec = as_cu(h_exec) 1WPQ

202 cdef cydriver.CUgraphNode node = as_cu(h_node) 1WPQ

203 if graph_exec == NULL: 1WPQ

204 raise RuntimeError("Graph has been closed") 

205 if node == NULL: 1WPQ

206 raise RuntimeError("GraphNode has been destroyed") 

207 with nogil: 1WPQ

208 HANDLE_RETURN(cydriver.cuGraphNodeSetEnabled( 1WPQ

209 graph_exec, node, <unsigned int>enabled)) 

210  

211  

212cdef bint _check_node_get_params(): 

213 global _has_cuGraphNodeGetParams, _version_checked 

214 if not _version_checked: 10Y123Z45-bfchgrst!#mnoTUde6a

215 from cuda.core._utils.version import binding_version, driver_version 1ga

216 _has_cuGraphNodeGetParams = ( 

217 driver_version() >= (13, 2, 0) and binding_version() >= (13, 2, 0) 1ga

218 ) 

219 _version_checked = True 1ga

220 return _has_cuGraphNodeGetParams 10Y123Z45-bfchgrst!#mnoTUde6a

221  

222  

223cdef void _reject_unsupported_kernel_node( 

224 cydriver.CUgraphNode node) except *: 

225 cdef cydriver.CUkernelNodeAttrValue cluster 

226 cdef cydriver.CUkernelNodeAttrValue cooperative 

227  

228 c_memset(&cluster, 0, sizeof(cluster)) 1lki)*

229 c_memset(&cooperative, 0, sizeof(cooperative)) 1lki)*

230 with nogil: 1lki)*

231 HANDLE_RETURN(cydriver.cuGraphKernelNodeGetAttribute( 1lki)*

232 node, <cydriver.CUkernelNodeAttrID>( 

233 cydriver.CU_KERNEL_NODE_ATTRIBUTE_CLUSTER_DIMENSION), 

234 &cluster)) 

235 HANDLE_RETURN(cydriver.cuGraphKernelNodeGetAttribute( 1lki)*

236 node, <cydriver.CUkernelNodeAttrID>( 

237 cydriver.CU_KERNEL_NODE_ATTRIBUTE_COOPERATIVE), 

238 &cooperative)) 

239 if (cluster.clusterDim.x != 0 or cluster.clusterDim.y != 0 or 1lki)*

240 cluster.clusterDim.z != 0 or cooperative.cooperative != 0): 1lki)*

241 raise NotImplementedError( 

242 "updating clustered or cooperative kernel nodes is not supported") 

243  

244  

245cdef bint _is_supported_memcpy_descriptor( 

246 cydriver.CUDA_MEMCPY3D* params) noexcept nogil: 

247 return ( 

248 (params.srcMemoryType == cydriver.CU_MEMORYTYPE_HOST or 1bfcrstmnode6a

249 params.srcMemoryType == cydriver.CU_MEMORYTYPE_DEVICE) 1bfcrstmnode6a

250 and (params.dstMemoryType == cydriver.CU_MEMORYTYPE_HOST or 1bfcrstmnode6a

251 params.dstMemoryType == cydriver.CU_MEMORYTYPE_DEVICE) 1bfcrstmnode6a

252 and params.srcXInBytes == 0 1bfcrstmnode6a

253 and params.srcY == 0 1bfcrstmnodea

254 and params.srcZ == 0 1bfcrstmnodea

255 and params.srcLOD == 0 1bfcrstmnodea

256 and params.srcPitch == 0 1bfcrstmnodea

257 and params.srcHeight == 0 1bfcrstmnodea

258 and params.dstXInBytes == 0 1bfcrstmnodea

259 and params.dstY == 0 1bfcrstmnodea

260 and params.dstZ == 0 1bfcrstmnodea

261 and params.dstLOD == 0 1bfcrstmnodea

262 and params.dstPitch == 0 1bfcrstmnodea

263 and params.dstHeight == 0 1bfcrstmnodea

264 and params.Height == 1 1bfcrstmnodea

265 and params.Depth == 1 1bfcrstmnodea

266 and params.reserved0 == NULL 1bfcrstmnodea

267 and params.reserved1 == NULL 1bfcrstmnodea

268 ) 

269  

270  

271cdef class EmptyNode(GraphNode): 

272 """An empty (synchronization) node.""" 

273  

274 @staticmethod 

275 cdef EmptyNode _create_impl(GraphNodeHandle h_node): 

276 cdef EmptyNode n = EmptyNode.__new__(EmptyNode) 2|j}jSeTe~j$ % ' ( UeVeWeakbkckXeIbYeabJbZe0e1e2e3eKb4eEbLb5edkMb6eNb7e8e9e!eek#e$efk%e?f@f[f]f^fgkajhkikjk_fkklk}bJ fggg'eObbj(ePbQb)eRb*eSb+eTb,eUb-esbAdBdwdmd.e/ekcVbFb:e;e=eWbbb?eXb@eYb[ [eZb+ cbdb^ 0b1b2b3b. ]e4b^e5b_e6b`e7b8b{e9b|e!b}e#b~e$baftbCdDdxdndbfcflc%bGbdfefff'bebgf(bhf)b] if*b, fbgb_ +b,b-b.b/ jf/bkf:blf;bmf=bnf?bof@bpf[bqf]brf^bsf_btf`b

277 n._h_node = h_node 2|j}jSeTe~j$ % ' ( UeVeWeakbkckXeIbYeabJbZe0e1e2e3eKb4eEbLb5edkMb6eNb7e8e9e!eek#e$efk%e?f@f[f]f^fgkajhkikjk_fkklk}bJ fggg'eObbj(ePbQb)eRb*eSb+eTb,eUb-esbAdBdwdmd.e/ekcVbFb:e;e=eWbbb?eXb@eYb[ [eZb+ cbdb^ 0b1b2b3b. ]e4b^e5b_e6b`e7b8b{e9b|e!b}e#b~e$baftbCdDdxdndbfcflc%bGbdfefff'bebgf(bhf)b] if*b, fbgb_ +b,b-b.b/ jf/bkf:blf;bmf=bnf?bof@bpf[bqf]brf^bsf_btf`b

278 return n 2|j}jSeTe~j$ % ' ( UeVeWeakbkckXeIbYeabJbZe0e1e2e3eKb4eEbLb5edkMb6eNb7e8e9e!eek#e$efk%e?f@f[f]f^fgkajhkikjk_fkklk}bJ fggg'eObbj(ePbQb)eRb*eSb+eTb,eUb-esbAdBdwdmd.e/ekcVbFb:e;e=eWbbb?eXb@eYb[ [eZb+ cbdb^ 0b1b2b3b. ]e4b^e5b_e6b`e7b8b{e9b|e!b}e#b~e$baftbCdDdxdndbfcflc%bGbdfefff'bebgf(bhf)b] if*b, fbgb_ +b,b-b.b/ jf/bkf:blf;bmf=bnf?bof@bpf[bqf]brf^bsf_btf`b

279  

280 def __repr__(self) -> str: 

281 return f"<EmptyNode handle=0x{as_intptr(self._h_node):x}>" 2ajbjyk

282  

283  

284cdef class KernelNode(GraphNode): 

285 """A kernel launch node. 

286  

287 Properties 

288 ---------- 

289 grid : tuple of int 

290 Grid dimensions (gridDimX, gridDimY, gridDimZ). 

291 block : tuple of int 

292 Block dimensions (blockDimX, blockDimY, blockDimZ). 

293 shmem_size : int 

294 Dynamic shared memory size in bytes. 

295 kernel : Kernel 

296 The kernel object for this launch node. 

297 config : LaunchConfig 

298 A LaunchConfig reconstructed from this node's parameters. 

299 """ 

300  

301 @staticmethod 

302 cdef KernelNode _create_with_params(GraphNodeHandle h_node, 

303 tuple grid, tuple block, unsigned int shmem_size, 

304 KernelHandle h_kernel): 

305 """Create from known params (called by launch() builder).""" 

306 cdef KernelNode n = KernelNode.__new__(KernelNode) 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

307 n._h_node = h_node 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

308 n._grid = grid 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

309 n._block = block 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

310 n._shmem_size = shmem_size 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

311 n._h_kernel = h_kernel 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

312 return n 2UdDhVdWdXdufEhFhGhHhIhJhKhEdvfFdwfGdxfHdyfIdzfJdAfKdLhLdydMdNd~bMhNhpgzeOhPh` ?f@f[f]f^f= p l k i QhRhShqgrgsgW u v w }b) `f* q zdz ThBfUhCfVhacOdDfWhPdQdodEfFfGfHfIfXhJfYhKfZhsbkcLf0hhbMf1hNf2hOfPfQf{b2d3h4h[ } 5h6hRf7h+ : Sf8hTf9hUf!hVf#hbcRdWf$hSdTdpdXfYfZf0f1f%h2f'h3f(htblc4f)hib5f*h6f+h7f8f9f|b3d,h-h] ~ .h/h!f:h, ; #f;h$f=h%f?h'f@h(f[h)f]h*f^h+f_h,f`h-f{h.f|h

313  

314 @staticmethod 

315 cdef KernelNode _create_from_driver(GraphNodeHandle h_node): 

316 """Create by fetching params from the driver (called by _create factory).""" 

317 cdef cydriver.CUgraphNode node = as_cu(h_node) 2UdVdWdXdEdLdydMdNd~b` =

318 cdef cydriver.CUDA_KERNEL_NODE_PARAMS params 

319 with nogil: 2UdVdWdXdEdLdydMdNd~b` =

320 HANDLE_RETURN(cydriver.cuGraphKernelNodeGetParams(node, &params)) 2UdVdWdXdEdLdydMdNd~b` =

321 cdef KernelHandle h_kernel = create_kernel_handle_ref(params.kern) 2UdVdWdXdEdLdydMdNd~b` =

322 return KernelNode._create_with_params( 2UdVdWdXdEdLdydMdNd~b` =

323 h_node, 

324 (params.gridDimX, params.gridDimY, params.gridDimZ), 2UdVdWdXdEdLdydMdNd~b` =

325 (params.blockDimX, params.blockDimY, params.blockDimZ), 2UdVdWdXdEdLdydMdNd~b` =

326 params.sharedMemBytes, 

327 h_kernel) 

328  

329 def __repr__(self) -> str: 

330 return (f"<KernelNode handle=0x{as_intptr(self._h_node):x}" 2p q nk

331 f" kernel=0x{as_intptr(self._h_kernel):x}>") 2p q nk

332  

333 def update( 

334 self, 

335 *, 

336 config: LaunchConfig | None = None, 

337 kernel: Kernel | None = None, 

338 args=None, 

339 ) -> None: 

340 """Replace selected kernel launch parameters. 

341  

342 Omitted parameters preserve their current values. Changing ``kernel`` 

343 requires ``args``, including ``args=()`` for a no-argument kernel. 

344 Clustered and cooperative kernel nodes are not supported. 

345  

346 .. warning:: 

347  

348 Use caution when a retained kernel argument directly or indirectly 

349 owns a graph. Any reference cycle involving the argument and a 

350 graph that retains it cannot be broken by Python's cyclic garbage 

351 collector. Use a weak reference to break such cycles. 

352 """ 

353 GN_check_valid(self) 2l k i qgrgsg) * zd

354 cdef LaunchConfig c_config 

355 cdef Kernel c_kernel 

356 cdef ParamHolder arg_holder 

357 cdef object kernel_args 

358 cdef KernelHandle h_kernel = self._h_kernel 2l k i ) * zd

359 cdef OpaqueHandle kernel_owner 

360 cdef OpaqueHandle args_owner 

361 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2l k i ) * zd

362 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 2l k i ) * zd

363 cdef cydriver.CUgraphNodeParams params 

364  

365 if config is not None: 2l k i ) * zd

366 c_config = config 2k zd

367 if (c_config.cluster is not None or 2k zd

368 c_config.is_cooperative): 2k zd

369 raise NotImplementedError( 2zd

370 "updating clustered or cooperative kernel nodes is not " 

371 "supported") 

372 _require_graph_node_update_support() 1lki)*

373 _reject_unsupported_kernel_node(node) 1lki)*

374 if kernel is not None: 1lki)*

375 if args is None: 1i*

376 raise ValueError("changing kernel requires args") 1*

377 c_kernel = kernel 1i

378 h_kernel = c_kernel._h_kernel 1i

379 if args is not None: 1lki)

380 arg_holder = ParamHolder(args) 1li)

381  

382 c_memset(&params, 0, sizeof(params)) 1lki

383 params.type = cydriver.CU_GRAPH_NODE_TYPE_KERNEL 1lki

384 with nogil: 1lki

385 HANDLE_RETURN(cydriver.cuGraphKernelNodeGetParams( 1lki

386 node, <cydriver.CUDA_KERNEL_NODE_PARAMS*>&params.kernel)) 

387 HANDLE_RETURN(graph_get_attachment( 1lki

388 h_graph, node, &kernel_owner, &args_owner)) 

389  

390 if config is not None: 1lki

391 params.kernel.gridDimX = c_config.grid[0] 1k

392 params.kernel.gridDimY = c_config.grid[1] 1k

393 params.kernel.gridDimZ = c_config.grid[2] 1k

394 params.kernel.blockDimX = c_config.block[0] 1k

395 params.kernel.blockDimY = c_config.block[1] 1k

396 params.kernel.blockDimZ = c_config.block[2] 1k

397 params.kernel.sharedMemBytes = c_config.shmem_size 1k

398 if kernel is not None: 1lki

399 params.kernel.kern = as_cu(h_kernel) 1i

400 params.kernel.func = <cydriver.CUfunction>NULL 1i

401 params.kernel.ctx = <cydriver.CUcontext>NULL 1i

402 kernel_owner = h_kernel 1i

403 if args is not None: 1lki

404 params.kernel.kernelParams = <void**><uintptr_t>arg_holder.ptr 1li

405 params.kernel.extra = NULL 1li

406 kernel_args = arg_holder.kernel_args 1li

407 if kernel_args is None: 1li

408 args_owner = OpaqueHandle() 1i

409 else: 

410 args_owner = make_opaque_py(kernel_args) 1l

411  

412 _set_definition_node_params( 1lki

413 self._h_node, &params, kernel_owner, args_owner) 

414 self._grid = ( 1lki

415 params.kernel.gridDimX, 1lki

416 params.kernel.gridDimY, 1lki

417 params.kernel.gridDimZ, 1lki

418 ) 

419 self._block = ( 1lki

420 params.kernel.blockDimX, 1lki

421 params.kernel.blockDimY, 1lki

422 params.kernel.blockDimZ, 1lki

423 ) 

424 self._shmem_size = params.kernel.sharedMemBytes 1lki

425 self._h_kernel = h_kernel 1lki

426  

427 @property 

428 def grid(self) -> tuple[int, int, int]: 

429 """Grid dimensions as a 3-tuple (gridDimX, gridDimY, gridDimZ).""" 

430 return self._grid 2cijb

431  

432 @property 

433 def block(self) -> tuple[int, int, int]: 

434 """Block dimensions as a 3-tuple (blockDimX, blockDimY, blockDimZ).""" 

435 return self._block 2cijb

436  

437 @property 

438 def shmem_size(self) -> int: 

439 """Dynamic shared memory size in bytes.""" 

440 return self._shmem_size 2cijb

441  

442 @property 

443 def kernel(self) -> Kernel: 

444 """The Kernel object for this launch node.""" 

445 return Kernel._from_handle(self._h_kernel) 2cijbpgzel k i u v w ) `f*

446  

447 @property 

448 def config(self) -> LaunchConfig: 

449 """A LaunchConfig reconstructed from this node's grid, block, and shmem_size. 

450  

451 Note: cluster dimensions and is_cooperative are not preserved 

452 by the CUDA driver's kernel node params, so they are not included. 

453 """ 

454 return LaunchConfig(grid=self._grid, block=self._block, 2cijbl k i u v w ) `f*

455 shmem_size=self._shmem_size) 2cijbl k i u v w ) `f*

456  

457  

458cdef class AllocNode(GraphNode): 

459 """A memory allocation node. 

460  

461 Properties 

462 ---------- 

463 dptr : int 

464 The device pointer for the allocation. 

465 bytesize : int 

466 The number of bytes allocated. 

467 device_id : int 

468 The device on which the allocation was made. 

469 memory_type : GraphMemoryType | str 

470 The type of memory allocated. 

471 peer_access : tuple of int 

472 Device IDs that have read-write access to this allocation. 

473 """ 

474  

475 @staticmethod 

476 cdef AllocNode _create_with_params(GraphNodeHandle h_node, 

477 cydriver.CUdeviceptr dptr, size_t bytesize, 

478 int device_id, str memory_type, tuple peer_access): 

479 """Create from known params (called by allocate() builder).""" 

480 cdef AllocNode n = AllocNode.__new__(AllocNode) 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

481 n._h_node = h_node 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

482 n._dptr = dptr 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

483 n._bytesize = bytesize 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

484 n._device_id = device_id 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

485 n._memory_type = memory_type 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

486 n._peer_access = peer_access 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

487 return n 2hgig4dtgugvgwgSexgTeygzg5d6d7d8d9d$ % ' ( ubvbwbxbAgBgCgUeVeWeDgEgXeAeBe!dFdIbmcncocpcqbFgrbGgYeccCedcDeec#djbGdabJbkbqclbrcmbscnbtcHgZeIg0eJgKgLg1eMg2eNgOgPgQg3eEeFe$dHdKbucvcwcxcycRgzcSgAc4eBcGeCcHeDc%dEcIdEbLbFcGcHcIcJcKcLcMcNcTgOcUgPc5eQcIeRcJeSc'dTcJdMbUcVcWcXcYcZc0c1cVgWg6eKeLe(dKdNb2c3c4c5cXg7eYg8eZg0g1g9e2g!e3g4g5g#e6g$e7g8g%ejg9g)d*dYd!g'e+dOb6c#g(e,dPb7cacMeNe-dZd$g%gOdQb8c'g(g)g)e.dRb9c*g*e/dSb!c+g+e:dTb#c,g,e;dUb$c-esbAdBdwdmd.e/ekcVbFb:e;e-g=e=dWb%chbqdrdfc?d@dbbyb[d]d.g?e^dXb'c/g@e_dYb(c{b[ } :g[e`dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c;g]e{d4b.c=g^e|d5b/c?g_e}d6b:c@g`e~d7b;cbcOePeae0d[g]gRd8b=c^g_g`g{ebe9b?c{g|ece!b@c|g}ede#b[c}g~eee$b]caftbCdDdxdndbfcflc%bGbdfef~gfffe'b^cibsdtdgcgeheebBbiejeahgfke(b_cbhhfle)b`c|b] ~ chifme*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~caddhjfne/bbdehkfoe:bcdfhlfpe;bddghmfqe=bedhhnfre?bfdihofse@bgdjhpfte[bhdkhqfue]bidlhrfve^bjdmhsfwe_bkdnhtfxe`bld

488  

489 @staticmethod 

490 cdef AllocNode _create_from_driver(GraphNodeHandle h_node): 

491 """Create by fetching params from the driver (called by _create factory).""" 

492 cdef cydriver.CUgraphNode node = as_cu(h_node) 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

493 cdef cydriver.CUDA_MEM_ALLOC_NODE_PARAMS params 

494 with nogil: 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

495 HANDLE_RETURN(cydriver.cuGraphMemAllocNodeGetParams(node, &params)) 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

496  

497 cdef str memory_type 

498 if params.poolProps.allocType == cydriver.CUmemAllocationType.CU_MEM_ALLOCATION_TYPE_PINNED: 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

499 if params.poolProps.location.type == cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST: 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

500 memory_type = "host" 

501 else: 

502 memory_type = "device" 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

503 else: 

504 IF CUDA_CORE_BUILD_MAJOR >= 13: 

505 if params.poolProps.allocType == cydriver.CUmemAllocationType.CU_MEM_ALLOCATION_TYPE_MANAGED: 

506 memory_type = "managed" 

507 else: 

508 memory_type = "device" 

509 ELSE: 

510 memory_type = "device" 

511  

512 cdef list peer_ids = [] 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

513 cdef size_t i 

514 for i in range(params.accessDescCount): 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

515 peer_ids.append(<int>params.accessDescs[i].location.id) 

516  

517 return AllocNode._create_with_params( 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

518 h_node, params.dptr, params.bytesize, 

519 <int>params.poolProps.location.id, memory_type, tuple(peer_ids)) 2qbrbccdcecjbabkblbmbnbyczcAcBcCcDcEcEbFcHcJcLcNcOcPcQcRcScTcUcWcYc0c

520  

521 def __repr__(self) -> str: 

522 return (f"<AllocNode handle=0x{as_intptr(self._h_node):x}" 2ok

523 f" dptr=0x{self._dptr:x} size={self._bytesize}>") 2ok

524  

525 @property 

526 def dptr(self) -> int: 

527 """The device pointer for the allocation.""" 

528 return self._dptr 2hgig4d5d6d7d8d9d$ % ' ( ubvbwbxb]i^i!dIbmcncocpcqbrb#dJbqcrcsctc$dKbucvcwcxc%dLbGcIcKcMc'dMbVcXcZc1c(dNb2c3c4c5cjg+dOb6c,dPb7c-dQb8c.dRb9c/dSb!c:dTb#c;dUb$cwdVbFb=dWb%chbqdrdfc?d@dbbyb[d]d^dXb'c_dYb(c{b[ } `dZb)c+ cbdb^ 0b1b2b3b: zbAbob*c+c. ,c-c{d4b.c|d5b/c}d6b:c~d7b;cae8b=cbe9b?cce!b@cde#b[cee$b]cxd%bGbfe'b^cibsdtdgcgeheebBbiejeke(b_cle)b`c|b] ~ me*b{c, fbgb_ +b,b-b.b; CbDbpb|c}c/ ~cadne/bbdoe:bcdpe;bddqe=bedre?bfdse@bgdte[bhdue]bidve^bjdwe_bkdxe`bld

529  

530 @property 

531 def bytesize(self) -> int: 

532 """The number of bytes allocated.""" 

533 return self._bytesize 2]i^iqbrb

534  

535 @property 

536 def device_id(self) -> int: 

537 """The device on which the allocation was made.""" 

538 return self._device_id 2]i^iqbrb

539  

540 @property 

541 def memory_type(self) -> str: 

542 """The type of memory: ``"device"``, ``"host"``, or ``"managed"``.""" 

543 return self._memory_type 2]i^iqbrb

544  

545 @property 

546 def peer_access(self) -> tuple[int, ...]: 

547 """Device IDs with read-write access to this allocation.""" 

548 return self._peer_access 2]i^iqbrb

549  

550  

551cdef class FreeNode(GraphNode): 

552 """A memory deallocation node. 

553  

554 Properties 

555 ---------- 

556 dptr : int 

557 The device pointer being freed. 

558 """ 

559  

560 @staticmethod 

561 cdef FreeNode _create_with_params(GraphNodeHandle h_node, 

562 cydriver.CUdeviceptr dptr): 

563 """Create from known params (called by deallocate() builder).""" 

564 cdef FreeNode n = FreeNode.__new__(FreeNode) 24d5d6d7d8d9d$ % ' ( ubvbwbxb!d#d$d%d'd(d+d,d-d.d/d:d;dwd=dhbqdrdfc?d@dbbyb[d]d^d_d{b`d{d|d}d~daebecedeeexdfeibsdtdgcgeheebBbiejekele|bmeneoepeqereseteuevewexe

565 n._h_node = h_node 24d5d6d7d8d9d$ % ' ( ubvbwbxb!d#d$d%d'd(d+d,d-d.d/d:d;dwd=dhbqdrdfc?d@dbbyb[d]d^d_d{b`d{d|d}d~daebecedeeexdfeibsdtdgcgeheebBbiejekele|bmeneoepeqereseteuevewexe

566 n._dptr = dptr 24d5d6d7d8d9d$ % ' ( ubvbwbxb!d#d$d%d'd(d+d,d-d.d/d:d;dwd=dhbqdrdfc?d@dbbyb[d]d^d_d{b`d{d|d}d~daebecedeeexdfeibsdtdgcgeheebBbiejekele|bmeneoepeqereseteuevewexe

567 return n 24d5d6d7d8d9d$ % ' ( ubvbwbxb!d#d$d%d'd(d+d,d-d.d/d:d;dwd=dhbqdrdfc?d@dbbyb[d]d^d_d{b`d{d|d}d~daebecedeeexdfeibsdtdgcgeheebBbiejekele|bmeneoepeqereseteuevewexe

568  

569 @staticmethod 

570 cdef FreeNode _create_from_driver(GraphNodeHandle h_node): 

571 """Create by fetching params from the driver (called by _create factory).""" 

572 cdef cydriver.CUgraphNode node = as_cu(h_node) 

573 cdef cydriver.CUdeviceptr dptr 

574 with nogil: 

575 HANDLE_RETURN(cydriver.cuGraphMemFreeNodeGetParams(node, &dptr)) 

576 return FreeNode._create_with_params(h_node, dptr) 

577  

578 def __repr__(self) -> str: 

579 return f"<FreeNode handle=0x{as_intptr(self._h_node):x} dptr=0x{self._dptr:x}>" 2zk

580  

581 @property 

582 def dptr(self) -> int: 

583 """The device pointer being freed.""" 

584 return self._dptr 2Akec

585  

586  

587cdef class MemsetNode(GraphNode): 

588 """A memset node. 

589  

590 Properties 

591 ---------- 

592 dptr : int 

593 The destination device pointer. 

594 value : int 

595 The fill value. 

596 element_size : int 

597 Element size in bytes (1, 2, or 4). 

598 width : int 

599 Width of the row in elements. 

600 height : int 

601 Number of rows. 

602 pitch : int 

603 Pitch in bytes (unused if height is 1). 

604 """ 

605  

606 @staticmethod 

607 cdef MemsetNode _create_with_params(GraphNodeHandle h_node, 

608 cydriver.CUdeviceptr dptr, unsigned int value, 

609 unsigned int element_size, size_t width, 

610 size_t height, size_t pitch): 

611 """Create from known params (called by memset() builder).""" 

612 cdef MemsetNode n = MemsetNode.__new__(MemsetNode) 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

613 n._h_node = h_node 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

614 n._dptr = dptr 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

615 n._value = value 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

616 n._element_size = element_size 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

617 n._width = width 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

618 n._height = height 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

619 n._pitch = pitch 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

620 return n 2$ % ' ( ubvbwbxbmcncocpcqcrcsctcucvcwcxcGcIcKcMcVcXcZc1c2c3c4c5ckglgmg= Qeh g ! # {f|fQ x y T U uda 6c7c8c9c!c#c$cFb%cyb'c(c} )c: zbAbob*c+c. ,c-c.c/c:c;c=c?c@c[c]cGb^cBb_c`c~ {c; CbDbpb|c}c/ ~cadbdcdddedfdgdhdidjdkdld

621  

622 @staticmethod 

623 cdef MemsetNode _create_from_driver(GraphNodeHandle h_node): 

624 """Create by fetching params from the driver (called by _create factory).""" 

625 cdef cydriver.CUgraphNode node = as_cu(h_node) 1=

626 cdef cydriver.CUDA_MEMSET_NODE_PARAMS params 

627 with nogil: 1=

628 HANDLE_RETURN(cydriver.cuGraphMemsetNodeGetParams(node, &params)) 1=

629 return MemsetNode._create_with_params( 1=

630 h_node, params.dst, params.value, 

631 params.elementSize, params.width, params.height, params.pitch) 1=

632  

633 def __repr__(self) -> str: 

634 return (f"<MemsetNode handle=0x{as_intptr(self._h_node):x}" 2pk

635 f" dptr=0x{self._dptr:x} value={self._value}>") 2pk

636  

637 def update( 

638 self, 

639 *, 

640 dst: Buffer | int | None = None, 

641 value=None, 

642 width: int | None = None, 

643 height: int | None = None, 

644 pitch: int | None = None, 

645 dst_owner=None, 

646 ) -> None: 

647 """Replace selected memset parameters. 

648  

649 Omitted parameters preserve their current values. ``dst_owner`` may 

650 only accompany a raw-address ``dst``. 

651  

652 With CUDA 12.2 through 13.1, the node's intended CUDA context must be 

653 current when this method is called. CUDA driver and ``cuda.bindings`` 

654 versions 13.2 and newer preserve the recorded context automatically. 

655  

656 .. warning:: 

657  

658 Use caution when a retained operand owner directly or indirectly 

659 owns a graph. Any reference cycle involving the owner and a graph 

660 that retains it cannot be broken by Python's cyclic garbage 

661 collector. Use a weak reference to break such cycles. 

662 """ 

663 cdef OpaqueHandle dst_attachment_owner 

664 GN_check_valid(self) 2h g ! # {f|fT U a

665 cdef GraphHandle h_graph 

666 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 1hg!#TUa

667 cdef cydriver.CUcontext ctx = NULL 1hg!#TUa

668 cdef cydriver.CUDA_MEMSET_NODE_PARAMS current 

669 cdef cydriver.CUgraphNodeParams params 

670 cdef object queried 

671  

672 if dst is None and dst_owner is not None: 1hg!#TUa

673 raise ValueError("dst_owner requires dst") 

674 if (dst is None and value is None and width is None and 1hg!#TUa

675 height is None and pitch is None): 

676 return 

677  

678 c_memset(&params, 0, sizeof(params)) 1hg!#TUa

679 params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMSET 1hg!#TUa

680 with nogil: 1hg!#TUa

681 HANDLE_RETURN(cydriver.cuGraphMemsetNodeGetParams( 1hg!#TUa

682 node, &current)) 

683 if _check_node_get_params(): 1hg!#TUa

684 queried = handle_return(driver.cuGraphNodeGetParams( 1hg!#TUa

685 <uintptr_t>node)) 1hg!#TUa

686 ctx = <cydriver.CUcontext><uintptr_t>int(queried.memset.ctx) 1hg!#TUa

687 else: 

688 with nogil: 

689 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 

690  

691 cdef cydriver.CUdeviceptr c_dst = current.dst 1hg!#TUa

692 cdef unsigned int c_value = current.value 1hg!#TUa

693 cdef unsigned int c_element_size = current.elementSize 1hg!#TUa

694 cdef size_t c_width = current.width 1hg!#TUa

695 cdef size_t c_height = current.height 1hg!#TUa

696 cdef size_t c_pitch = current.pitch 1hg!#TUa

697  

698 if dst is None: 1hg!#TUa

699 h_graph = graph_node_get_graph(self._h_node) 1gTUa

700 HANDLE_RETURN(graph_get_attachment( 1gTUa

701 h_graph, node, 

702 &dst_attachment_owner, NULL)) 

703 else: 

704 dst_attachment_owner = _resolve_memcpy_operand( 1h!#

705 dst, dst_owner, "dst", &c_dst) 1h!#

706  

707 if value is not None: 1hgTUa

708 c_value, c_element_size = _parse_fill_value(value) 1hgTUa

709 if width is not None: 1hga

710 c_width = width 

711 if height is not None: 1hga

712 c_height = height 

713 if pitch is not None: 1hga

714 c_pitch = pitch 

715  

716 params.memset.dst = c_dst 1hga

717 params.memset.value = c_value 1hga

718 params.memset.elementSize = c_element_size 1hga

719 params.memset.width = c_width 1hga

720 params.memset.height = c_height 1hga

721 params.memset.pitch = c_pitch 1hga

722 params.memset.ctx = ctx 1hga

723  

724 _set_definition_node_params( 1hga

725 self._h_node, &params, dst_attachment_owner, 

726 OpaqueHandle(), params.memset.ctx) 

727 self._dptr = c_dst 1hga

728 self._value = c_value 1hga

729 self._element_size = c_element_size 1hga

730 self._width = c_width 1hga

731 self._height = c_height 1hga

732 self._pitch = c_pitch 1hga

733  

734 @property 

735 def dptr(self) -> int: 

736 """The destination device pointer.""" 

737 return self._dptr 2dieifigikblbmbnbQeh g x y T U

738  

739 @property 

740 def value(self) -> int: 

741 """The fill value.""" 

742 return self._value 2dieifigikblbmbnbQeh g x y T U

743  

744 @property 

745 def element_size(self) -> int: 

746 """Element size in bytes (1, 2, or 4).""" 

747 return self._element_size 2dieifigikblbmbnbh g x y T U

748  

749 @property 

750 def width(self) -> int: 

751 """Width of the row in elements.""" 

752 return self._width 2dieifigikblbmbnbQeh g x y T U

753  

754 @property 

755 def height(self) -> int: 

756 """Number of rows.""" 

757 return self._height 2dieifigikblbmbnbh g x y T U

758  

759 @property 

760 def pitch(self) -> int: 

761 """Pitch in bytes (unused if height is 1).""" 

762 return self._pitch 2dieifigikblbmbnbh g x y T U

763  

764  

765cdef class MemcpyNode(GraphNode): 

766 """A memcpy node. 

767  

768 Properties 

769 ---------- 

770 dst : int 

771 The destination pointer. 

772 src : int 

773 The source pointer. 

774 size : int 

775 The number of bytes copied. 

776 """ 

777  

778 @staticmethod 

779 cdef MemcpyNode _create_with_params(GraphNodeHandle h_node, 

780 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, 

781 size_t size, cydriver.CUmemorytype dst_type, 

782 cydriver.CUmemorytype src_type): 

783 """Create from known params (called by memcpy() builder).""" 

784 cdef MemcpyNode n = MemcpyNode.__new__(MemcpyNode) 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

785 n._h_node = h_node 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

786 n._dst = dst 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

787 n._src = src 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

788 n._size = size 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

789 n._dst_type = dst_type 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

790 n._src_type = src_type 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

791 return n 2$ % ' ( IbJbKbLbMbNbohph1dqhrhshthuhvhb f c r s t /f:f;fP E F G m n o d e 6 uda ObPbQbRbSbTbUbVbWbbbXbYb[ Zb+ cbdb^ 0b1b2b3b. 4b5b6b7b8b9b!b#b$b%b'beb(b)b] *b, fbgb_ +b,b-b.b/ /b:b;b=b?b@b[b]b^b_b`b

792  

793 @staticmethod 

794 cdef MemcpyNode _create_from_driver(GraphNodeHandle h_node): 

795 """Create by fetching params from the driver (called by _create factory).""" 

796 cdef cydriver.CUgraphNode node = as_cu(h_node) 

797 cdef cydriver.CUDA_MEMCPY3D params 

798 with nogil: 

799 HANDLE_RETURN(cydriver.cuGraphMemcpyNodeGetParams(node, &params)) 

800  

801 cdef cydriver.CUdeviceptr dst 

802 cdef cydriver.CUdeviceptr src 

803 if params.dstMemoryType == cydriver.CU_MEMORYTYPE_HOST: 

804 dst = <cydriver.CUdeviceptr><uintptr_t>params.dstHost 

805 else: 

806 dst = params.dstDevice 

807 if params.srcMemoryType == cydriver.CU_MEMORYTYPE_HOST: 

808 src = <cydriver.CUdeviceptr><uintptr_t>params.srcHost 

809 else: 

810 src = params.srcDevice 

811  

812 return MemcpyNode._create_with_params( 

813 h_node, dst, src, params.WidthInBytes, 

814 params.dstMemoryType, params.srcMemoryType) 

815  

816 def __repr__(self) -> str: 

817 cdef str dt = "H" if self._dst_type == cydriver.CU_MEMORYTYPE_HOST else "D" 2cj

818 cdef str st = "H" if self._src_type == cydriver.CU_MEMORYTYPE_HOST else "D" 2cj

819 return (f"<MemcpyNode handle=0x{as_intptr(self._h_node):x}" 2cj

820 f" dst=0x{self._dst:x}({dt}) src=0x{self._src:x}({st}) size={self._size}>") 2cj

821  

822 def update( 

823 self, 

824 *, 

825 dst: Buffer | int | None = None, 

826 src: Buffer | int | None = None, 

827 size: int | None = None, 

828 dst_owner=None, 

829 src_owner=None, 

830 ) -> None: 

831 """Replace selected memcpy parameters. 

832  

833 Omitted parameters preserve their current values. ``dst_owner`` and 

834 ``src_owner`` may only accompany their corresponding raw addresses. 

835 Multidimensional, pitched, offset, and array-backed memcpy nodes are 

836 not supported. 

837  

838 With CUDA 12.2 through 13.1, the node's intended CUDA context must be 

839 current when this method is called. CUDA driver and ``cuda.bindings`` 

840 versions 13.2 and newer preserve the recorded context automatically. 

841  

842 .. warning:: 

843  

844 Use caution when a retained operand owner directly or indirectly 

845 owns a graph. Any reference cycle involving the owner and a graph 

846 that retains it cannot be broken by Python's cyclic garbage 

847 collector. Use a weak reference to break such cycles. 

848 """ 

849 cdef cydriver.CUdeviceptr c_dst = self._dst 2b f c r s t /f:f;fm n o d e 6 a

850 cdef cydriver.CUdeviceptr c_src = self._src 2b f c r s t /f:f;fm n o d e 6 a

851 cdef OpaqueHandle dst_attachment_owner 

852 cdef OpaqueHandle src_attachment_owner 

853 GN_check_valid(self) 2b f c r s t /f:f;fm n o d e 6 a

854 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 1bfcrstmnode6a

855 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 1bfcrstmnode6a

856 cdef cydriver.CUcontext ctx = NULL 1bfcrstmnode6a

857 cdef cydriver.CUgraphNodeParams params 

858 cdef cydriver.CUmemorytype c_dst_type 

859 cdef cydriver.CUmemorytype c_src_type 

860 cdef object queried 

861  

862 if dst is None and dst_owner is not None: 1bfcrstmnode6a

863 raise ValueError("dst_owner requires dst") 

864 if src is None and src_owner is not None: 1bfcrstmnode6a

865 raise ValueError("src_owner requires src") 

866 if dst is None and src is None and size is None: 1bfcrstmnode6a

867 return 

868  

869 c_memset(&params, 0, sizeof(params)) 1bfcrstmnode6a

870 params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMCPY 1bfcrstmnode6a

871 with nogil: 1bfcrstmnode6a

872 HANDLE_RETURN(cydriver.cuGraphMemcpyNodeGetParams( 1bfcrstmnode6a

873 node, &params.memcpy.copyParams)) 

874 if _check_node_get_params(): 1bfcrstmnode6a

875 queried = handle_return(driver.cuGraphNodeGetParams( 1bfcrstmnode6a

876 <uintptr_t>node)) 1bfcrstmnode6a

877 ctx = <cydriver.CUcontext><uintptr_t>int( 1bfcrstmnode6a

878 queried.memcpy.copyCtx) 1bfcrstmnode6a

879 else: 

880 with nogil: 

881 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 

882 params.memcpy.copyCtx = ctx 1bfcrstmnode6a

883  

884 if not _is_supported_memcpy_descriptor(&params.memcpy.copyParams): 1bfcrstmnode6a

885 raise NotImplementedError( 16

886 "updating multidimensional, pitched, offset, or array-backed " 

887 "memcpy nodes is not supported") 

888  

889 c_dst_type = params.memcpy.copyParams.dstMemoryType 1bfcrstmnodea

890 c_src_type = params.memcpy.copyParams.srcMemoryType 1bfcrstmnodea

891 if c_dst_type == cydriver.CU_MEMORYTYPE_HOST: 1bfcrstmnodea

892 c_dst = <cydriver.CUdeviceptr><uintptr_t>( 1bfcrstmnodea

893 params.memcpy.copyParams.dstHost) 

894 elif c_dst_type == cydriver.CU_MEMORYTYPE_DEVICE: 

895 c_dst = params.memcpy.copyParams.dstDevice 

896 else: 

897 raise NotImplementedError( 

898 f"unsupported destination memory type: {int(c_dst_type)}") 

899 if c_src_type == cydriver.CU_MEMORYTYPE_HOST: 1bfcrstmnodea

900 c_src = <cydriver.CUdeviceptr><uintptr_t>( 1bfcrstmnodea

901 params.memcpy.copyParams.srcHost) 

902 elif c_src_type == cydriver.CU_MEMORYTYPE_DEVICE: 

903 c_src = params.memcpy.copyParams.srcDevice 

904 else: 

905 raise NotImplementedError( 

906 f"unsupported source memory type: {int(c_src_type)}") 

907  

908 HANDLE_RETURN(graph_get_attachment( 1bfcrstmnodea

909 h_graph, node, 

910 &dst_attachment_owner, &src_attachment_owner)) 

911 if dst is not None: 1bfcrstmnodea

912 dst_attachment_owner = _resolve_memcpy_operand( 1be

913 dst, dst_owner, "dst", &c_dst) 

914 c_dst_type = _get_memcpy_memory_type(c_dst) 1be

915 params.memcpy.copyParams.dstMemoryType = c_dst_type 1be

916 params.memcpy.copyParams.dstHost = NULL 1be

917 params.memcpy.copyParams.dstDevice = 0 1be

918 params.memcpy.copyParams.dstArray = NULL 1be

919 params.memcpy.copyParams.reserved1 = NULL 1be

920 if c_dst_type == cydriver.CU_MEMORYTYPE_HOST: 1be

921 params.memcpy.copyParams.dstHost = <void*><uintptr_t>c_dst 1b

922 else: 

923 params.memcpy.copyParams.dstDevice = c_dst 1e

924 if src is not None: 1bfcrstmnodea

925 src_attachment_owner = _resolve_memcpy_operand( 1crstd

926 src, src_owner, "src", &c_src) 

927 c_src_type = _get_memcpy_memory_type(c_src) 1cd

928 params.memcpy.copyParams.srcMemoryType = c_src_type 1cd

929 params.memcpy.copyParams.srcHost = NULL 1cd

930 params.memcpy.copyParams.srcDevice = 0 1cd

931 params.memcpy.copyParams.srcArray = NULL 1cd

932 params.memcpy.copyParams.reserved0 = NULL 1cd

933 if c_src_type == cydriver.CU_MEMORYTYPE_HOST: 1cd

934 params.memcpy.copyParams.srcHost = <void*><uintptr_t>c_src 1c

935 else: 

936 params.memcpy.copyParams.srcDevice = c_src 1d

937 if size is not None: 1bfcmnodea

938 params.memcpy.copyParams.WidthInBytes = size 1fmnoa

939  

940 _set_definition_node_params( 1bfcdea

941 self._h_node, &params, 

942 dst_attachment_owner, src_attachment_owner, 

943 params.memcpy.copyCtx) 

944 self._dst = c_dst 1bfcdea

945 self._src = c_src 1bfcdea

946 self._size = params.memcpy.copyParams.WidthInBytes 1bfcdea

947 self._dst_type = c_dst_type 1bfcdea

948 self._src_type = c_src_type 1bfcdea

949  

950 @property 

951 def dst(self) -> int: 

952 """The destination pointer.""" 

953 return self._dst 2mkabb f c E F G m n o

954  

955 @property 

956 def src(self) -> int: 

957 """The source pointer.""" 

958 return self._src 2mkabb f c E F G m n o

959  

960 @property 

961 def size(self) -> int: 

962 """The number of bytes copied.""" 

963 return self._size 2mkabb f c E F G m n o

964  

965  

966cdef class ChildGraphNode(GraphNode): 

967 """A child graph node. 

968  

969 Properties 

970 ---------- 

971 child_graph : GraphDefinition 

972 The embedded graph definition (non-owning wrapper). 

973 """ 

974  

975 @staticmethod 

976 cdef ChildGraphNode _create_with_params(GraphNodeHandle h_node, 

977 GraphHandle h_child_graph): 

978 """Create from known params (called by embed() builder).""" 

979 cdef ChildGraphNode n = ChildGraphNode.__new__(ChildGraphNode) 2hcufvfwfxfyfzfAf? ~bB _i{ }f@ ` Hb| D _fK V =fReA 9 BfCfacDfPdQdodEfFfGfHfIfJfKfsbLfhbMfNfOfRf+ : SfTfUfVfbcWfSdTdpdXfYfZf0f1f2f3ftb4fib5f6f7f!f, ; #f$f%f'f(f)f*f+f,f-f.f

980 n._h_node = h_node 2hcufvfwfxfyfzfAf? ~bB _i{ }f@ ` Hb| D _fK V =fReA 9 BfCfacDfPdQdodEfFfGfHfIfJfKfsbLfhbMfNfOfRf+ : SfTfUfVfbcWfSdTdpdXfYfZf0f1f2f3ftb4fib5f6f7f!f, ; #f$f%f'f(f)f*f+f,f-f.f

981 n._h_child_graph = h_child_graph 2hcufvfwfxfyfzfAf? ~bB _i{ }f@ ` Hb| D _fK V =fReA 9 BfCfacDfPdQdodEfFfGfHfIfJfKfsbLfhbMfNfOfRf+ : SfTfUfVfbcWfSdTdpdXfYfZf0f1f2f3ftb4fib5f6f7f!f, ; #f$f%f'f(f)f*f+f,f-f.f

982 return n 2hcufvfwfxfyfzfAf? ~bB _i{ }f@ ` Hb| D _fK V =fReA 9 BfCfacDfPdQdodEfFfGfHfIfJfKfsbLfhbMfNfOfRf+ : SfTfUfVfbcWfSdTdpdXfYfZf0f1f2f3ftb4fib5f6f7f!f, ; #f$f%f'f(f)f*f+f,f-f.f

983  

984 @staticmethod 

985 cdef ChildGraphNode _create_from_driver(GraphNodeHandle h_node): 

986 """Create by fetching params from the driver (called by _create factory).""" 

987 cdef cydriver.CUgraphNode node = as_cu(h_node) 1?B{@`|D

988 cdef cydriver.CUgraph child_graph = NULL 1?B{@`|D

989 with nogil: 1?B{@`|D

990 HANDLE_RETURN(cydriver.cuGraphChildGraphNodeGetGraph(node, &child_graph)) 1?B{@`|D

991 cdef GraphHandle h_graph = graph_node_get_graph(h_node) 1?B{@`|D

992 cdef GraphHandle h_child = create_child_graph_handle( 1?B{@`|D

993 child_graph, h_graph, node) 

994 return ChildGraphNode._create_with_params(h_node, h_child) 1?B{@`|D

995  

996 def __repr__(self) -> str: 

997 return (f"<ChildGraphNode handle=0x{as_intptr(self._h_node):x}" 2? B @ Hb_fK qk

998 f" child=0x{as_intptr(self._h_child_graph):x}>") 2? B @ Hb_fK qk

999  

1000 def update(self, child: GraphDefinition) -> None: 

1001 """Replace the embedded graph with a clone of ``child``. 

1002  

1003 ``child`` must belong to an independent graph hierarchy. 

1004 """ 

1005 GN_check_valid(self) 2B D V Re9

1006 GD_check_valid(child) 1BDV9

1007 cdef GraphHandle h_parent = graph_node_get_graph(self._h_node) 1BDV9

1008 cdef GraphHandle h_replacement 

1009 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 1BDV9

1010 cdef cydriver.CUgraphNodeParams params 

1011 cdef cydriver.CUresult commit_status 

1012 cdef PreparedChildGraphUpdate prepared 

1013  

1014 _require_graph_node_update_support() 1BDV9

1015 c_memset(&params, 0, sizeof(params)) 1BDV9

1016 params.type = cydriver.CU_GRAPH_NODE_TYPE_GRAPH 1BDV9

1017 params.graph.graph = as_cu(child._h_graph) 1BDV9

1018  

1019 HANDLE_RETURN(graph_prepare_child_graph_update( 1BDV9

1020 h_parent, self._h_child_graph, node, 

1021 child._h_graph, &prepared)) 

1022 with nogil: 1BDV

1023 HANDLE_RETURN(cydriver.cuGraphNodeSetParams( 1BDV

1024 node, &params)) 

1025 try: 1BDV

1026 commit_status = graph_commit_child_graph_update( 1BDV

1027 prepared, &h_replacement) 

1028 finally: 

1029 if h_replacement: 1BDV

1030 self._h_child_graph = h_replacement 1BDV

1031 HANDLE_RETURN(commit_status) 1BDV

1032  

1033 @property 

1034 def child_graph(self) -> GraphDefinition: 

1035 """The embedded graph definition (non-owning wrapper).""" 

1036 return GraphDefinition._from_handle(self._h_child_graph) 2hcEdBk? ~bB _i{ @ ` Hb| D _fV =fReA 9

1037  

1038  

1039cdef class EventRecordNode(GraphNode): 

1040 """An event record node. 

1041  

1042 Properties 

1043 ---------- 

1044 event : Event 

1045 The event being recorded. 

1046 """ 

1047  

1048 @staticmethod 

1049 cdef EventRecordNode _create_with_params(GraphNodeHandle h_node, 

1050 EventHandle h_event): 

1051 """Create from known params (called by record() builder).""" 

1052 cdef EventRecordNode n = EventRecordNode.__new__(EventRecordNode) 2whAeCeEeGeIeKe`i)d{ixhyhzeX N ~ficI C yevddjejMefjPdgjhjijAdjjzhagkjljmjnjqdojpjPfqjcbzbrjsjtjujOevjSdwjxjyjCdzjAhbgAjBjCjDjsdEjFj8fGjfbCbHjIjJjKjLjMjNjOjPjQjRj

1053 n._h_node = h_node 2whAeCeEeGeIeKe`i)d{ixhyhzeX N ~ficI C yevddjejMefjPdgjhjijAdjjzhagkjljmjnjqdojpjPfqjcbzbrjsjtjujOevjSdwjxjyjCdzjAhbgAjBjCjDjsdEjFj8fGjfbCbHjIjJjKjLjMjNjOjPjQjRj

1054 n._h_event = h_event 2whAeCeEeGeIeKe`i)d{ixhyhzeX N ~ficI C yevddjejMefjPdgjhjijAdjjzhagkjljmjnjqdojpjPfqjcbzbrjsjtjujOevjSdwjxjyjCdzjAhbgAjBjCjDjsdEjFj8fGjfbCbHjIjJjKjLjMjNjOjPjQjRj

1055 return n 2whAeCeEeGeIeKe`i)d{ixhyhzeX N ~ficI C yevddjejMefjPdgjhjijAdjjzhagkjljmjnjqdojpjPfqjcbzbrjsjtjujOevjSdwjxjyjCdzjAhbgAjBjCjDjsdEjFj8fGjfbCbHjIjJjKjLjMjNjOjPjQjRj

1056  

1057 @staticmethod 

1058 cdef EventRecordNode _create_from_driver(GraphNodeHandle h_node): 

1059 """Create by fetching params from the driver (called by _create factory).""" 

1060 cdef cydriver.CUgraphNode node = as_cu(h_node) 

1061 cdef cydriver.CUevent event 

1062 with nogil: 

1063 HANDLE_RETURN(cydriver.cuGraphEventRecordNodeGetEvent(node, &event)) 

1064 cdef EventHandle h_event = create_event_handle_ref(event) 

1065 return EventRecordNode._create_with_params(h_node, h_event) 

1066  

1067 def __repr__(self) -> str: 

1068 return (f"<EventRecordNode handle=0x{as_intptr(self._h_node):x}" 2rk

1069 f" event=0x{as_intptr(self._h_event):x}>") 2rk

1070  

1071 def update(self, event: Event) -> None: 

1072 """Replace the event recorded by this node.""" 

1073 GN_check_valid(self) 2X icye

1074 Event_check_open(event) 2X ye

1075 cdef OpaqueHandle event_owner = event._h_event 1X

1076 cdef cydriver.CUgraphNodeParams params 

1077  

1078 c_memset(&params, 0, sizeof(params)) 1X

1079 params.type = cydriver.CU_GRAPH_NODE_TYPE_EVENT_RECORD 1X

1080 params.eventRecord.event = as_cu(event._h_event) 1X

1081  

1082 _set_definition_node_params( 1X

1083 self._h_node, &params, event_owner) 

1084 self._h_event = event._h_event 1X

1085  

1086 @property 

1087 def event(self) -> Event: 

1088 """The event being recorded.""" 

1089 return Event._from_handle(self._h_event) 2Ckcc`i)d{iX I ye

1090  

1091  

1092cdef class EventWaitNode(GraphNode): 

1093 """An event wait node. 

1094  

1095 Properties 

1096 ---------- 

1097 event : Event 

1098 The event being waited on. 

1099 """ 

1100  

1101 @staticmethod 

1102 cdef EventWaitNode _create_with_params(GraphNodeHandle h_node, 

1103 EventHandle h_event): 

1104 """Create from known params (called by wait() builder).""" 

1105 cdef EventWaitNode n = EventWaitNode.__new__(EventWaitNode) 2whBeDeFeHeJeLexhyh*d|iN cgjcC vdSjTjNeUjQdVjWjXjBdYjzhdgZj0j1j2jrd3j4jQf5jdbAb6j7j8j9jPe!jTd#j$j%jDd'jAheg(j)j*j+jtd,j-j9f.jgbDb/j:j;j=j?j@j[j]j^j_j`j

1106 n._h_node = h_node 2whBeDeFeHeJeLexhyh*d|iN cgjcC vdSjTjNeUjQdVjWjXjBdYjzhdgZj0j1j2jrd3j4jQf5jdbAb6j7j8j9jPe!jTd#j$j%jDd'jAheg(j)j*j+jtd,j-j9f.jgbDb/j:j;j=j?j@j[j]j^j_j`j

1107 n._h_event = h_event 2whBeDeFeHeJeLexhyh*d|iN cgjcC vdSjTjNeUjQdVjWjXjBdYjzhdgZj0j1j2jrd3j4jQf5jdbAb6j7j8j9jPe!jTd#j$j%jDd'jAheg(j)j*j+jtd,j-j9f.jgbDb/j:j;j=j?j@j[j]j^j_j`j

1108 return n 2whBeDeFeHeJeLexhyh*d|iN cgjcC vdSjTjNeUjQdVjWjXjBdYjzhdgZj0j1j2jrd3j4jQf5jdbAb6j7j8j9jPe!jTd#j$j%jDd'jAheg(j)j*j+jtd,j-j9f.jgbDb/j:j;j=j?j@j[j]j^j_j`j

1109  

1110 @staticmethod 

1111 cdef EventWaitNode _create_from_driver(GraphNodeHandle h_node): 

1112 """Create by fetching params from the driver (called by _create factory).""" 

1113 cdef cydriver.CUgraphNode node = as_cu(h_node) 

1114 cdef cydriver.CUevent event 

1115 with nogil: 

1116 HANDLE_RETURN(cydriver.cuGraphEventWaitNodeGetEvent(node, &event)) 

1117 cdef EventHandle h_event = create_event_handle_ref(event) 

1118 return EventWaitNode._create_with_params(h_node, h_event) 

1119  

1120 def __repr__(self) -> str: 

1121 return (f"<EventWaitNode handle=0x{as_intptr(self._h_node):x}" 2sk

1122 f" event=0x{as_intptr(self._h_event):x}>") 2sk

1123  

1124 def update(self, event: Event) -> None: 

1125 """Replace the event waited on by this node.""" 

1126 GN_check_valid(self) 2N jcvd

1127 Event_check_open(event) 2N vd

1128 cdef OpaqueHandle event_owner = event._h_event 1N

1129 cdef cydriver.CUgraphNodeParams params 

1130  

1131 c_memset(&params, 0, sizeof(params)) 1N

1132 params.type = cydriver.CU_GRAPH_NODE_TYPE_WAIT_EVENT 1N

1133 params.eventWait.event = as_cu(event._h_event) 1N

1134  

1135 _set_definition_node_params( 1N

1136 self._h_node, &params, event_owner) 

1137 self._h_event = event._h_event 1N

1138  

1139 @property 

1140 def event(self) -> Event: 

1141 """The event being waited on.""" 

1142 return Event._from_handle(self._h_event) 2Dkdc*d|iN C vd

1143  

1144  

1145cdef class HostCallbackNode(GraphNode): 

1146 """A host callback node. 

1147  

1148 Properties 

1149 ---------- 

1150 callback : callable or None 

1151 The Python callable (None for ctypes function pointer callbacks). 

1152 """ 

1153  

1154 @staticmethod 

1155 cdef HostCallbackNode _create_with_params(GraphNodeHandle h_node, 

1156 object callable_obj, cydriver.CUhostFn fn, 

1157 void* user_data): 

1158 """Create from known params (called by callback() builder).""" 

1159 cdef HostCallbackNode n = HostCallbackNode.__new__(HostCallbackNode) 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1160 n._h_node = h_node 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1161 n._callable = callable_obj 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1162 n._fn = fn 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1163 n._user_data = user_data 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1164 return n 2hiiijikiliBhhcminioipiqirisitiuiviwixiyiziAi? BiCiDiEiB { }f0 Y 1 2 3 Z 4 5 1d@ FiHbGi| D HiYdK p V X N 7 8 =f~fcgIiChReicjc}h~hO A I C L M R 9 yevdngogJ q S H fgggJiKiLiZdMiodNiOiPimdQiagdgfcRiSiTiUiViWi2dXi^ obYiZi0i1i0d2ipd3i4i5ind6ibgeggc7i8i9i!i#i$i3d%i_ pb'i(i)i*i+i,i-i.i/i:i;i

1165  

1166 @staticmethod 

1167 cdef HostCallbackNode _create_from_driver(GraphNodeHandle h_node): 

1168 """Create by fetching params from the driver (called by _create factory).""" 

1169 cdef cydriver.CUgraphNode node = as_cu(h_node) 2hc? B { @ Hb| D V icjcA 9

1170 cdef cydriver.CUDA_HOST_NODE_PARAMS params 

1171 with nogil: 2hc? B { @ Hb| D V icjcA 9

1172 HANDLE_RETURN(cydriver.cuGraphHostNodeGetParams(node, &params)) 2hc? B { @ Hb| D V icjcA 9

1173  

1174 cdef object callable_obj = None 2hc? B { @ Hb| D V icjcA 9

1175 if _is_py_host_trampoline(params.fn): 2hc? B { @ Hb| D V icjcA 9

1176 callable_obj = <object>params.userData 2hc? B { @ Hb| D V icjcA 9

1177  

1178 return HostCallbackNode._create_with_params( 2hc? B { @ Hb| D V icjcA 9

1179 h_node, callable_obj, params.fn, params.userData) 2hc? B { @ Hb| D V icjcA 9

1180  

1181 def __repr__(self) -> str: 

1182 if self._callable is not None: 2H {j

1183 name = getattr(self._callable, '__name__', '?') 2H {j

1184 return (f"<HostCallbackNode handle=0x{as_intptr(self._h_node):x}" 2H {j

1185 f" callback={name}>") 2H {j

1186 return (f"<HostCallbackNode handle=0x{as_intptr(self._h_node):x}" 

1187 f" cfunc=0x{<uintptr_t>self._fn:x}>") 

1188  

1189 def update(self, fn, *, user_data=None) -> None: 

1190 """Replace the callback and user-data binding for this node. 

1191  

1192 ``fn`` accepts the same forms as :meth:`~graph.GraphNode.callback`: a 

1193 Python callable, or a ctypes function pointer whose declared prototype 

1194 matches ``CUhostFn`` (``void (*)(void*)``). A mismatched ctypes 

1195 prototype raises ``TypeError``. 

1196  

1197 .. warning:: 

1198  

1199 Callbacks must not call CUDA API functions. Doing so may 

1200 deadlock or corrupt driver state. 

1201  

1202 Use caution when a Python callback retains an object that owns a 

1203 graph. Any reference cycle involving the callback and a graph that 

1204 retains it cannot be broken by Python's cyclic garbage collector. 

1205 Use a weak reference to break such cycles. 

1206 """ 

1207 GN_check_valid(self) 2Bh7 8 Ch}h~hngog

1208 cdef cydriver.CUhostFn c_fn 

1209 cdef void* c_user_data 

1210 cdef OpaqueHandle fn_owner, data_owner 

1211 cdef cydriver.CUgraphNodeParams params 

1212  

1213 _resolve_host_callback( 2Bh7 8 Chngog

1214 fn, user_data, &c_fn, &c_user_data, &fn_owner, &data_owner) 

1215 c_memset(&params, 0, sizeof(params)) 178

1216 params.type = cydriver.CU_GRAPH_NODE_TYPE_HOST 178

1217 params.host.fn = c_fn 178

1218 params.host.userData = c_user_data 178

1219  

1220 _set_definition_node_params( 178

1221 self._h_node, &params, fn_owner, data_owner) 

1222 self._callable = fn if _is_py_host_trampoline(c_fn) else None 178

1223 self._fn = c_fn 178

1224 self._user_data = c_user_data 178

1225  

1226 @property 

1227 def callback(self): 

1228 """The Python callable, or None for ctypes function pointer callbacks.""" 

1229 return self._callable 2EkFkB V 7 8 A L M 9 ngog

1230  

1231  

1232cdef class ConditionalNode(GraphNode): 

1233 """Base class for conditional nodes. 

1234  

1235 When created via builder methods (if_then, if_else, while_loop, switch), 

1236 a specific subclass (IfNode, IfElseNode, WhileNode, SwitchNode) is 

1237 returned. When reconstructed from the driver on CUDA 13.2+, the 

1238 correct subclass is determined via cuGraphNodeGetParams. On older 

1239 drivers, this base class is used as a fallback. 

1240  

1241 Properties 

1242 ---------- 

1243 condition : GraphCondition or None 

1244 The condition variable controlling execution (None pre-13.2). 

1245 cond_type : str or None 

1246 The conditional type ("if", "while", or "switch"; None pre-13.2). 

1247 branches : tuple of GraphDefinition 

1248 The body graphs for each branch (empty pre-13.2). 

1249 """ 

1250  

1251 @staticmethod 

1252 cdef ConditionalNode _create_from_driver(GraphNodeHandle h_node): 

1253 cdef ConditionalNode n 

1254 if not _check_node_get_params(): 10Y123Z45-

1255 n = ConditionalNode.__new__(ConditionalNode) 

1256 n._h_node = h_node 

1257 n._condition = None 

1258 n._cond_type = cydriver.CU_GRAPH_COND_TYPE_IF 

1259 n._branches = () 

1260 return n 

1261  

1262 cdef cydriver.CUgraphNode node = as_cu(h_node) 10Y123Z45-

1263 params = handle_return(driver.cuGraphNodeGetParams( 10Y123Z45-

1264 <uintptr_t>node)) 10Y123Z45-

1265 cond_params = params.conditional 10Y123Z45-

1266 cdef int cond_type_int = int(cond_params.type) 10Y123Z45-

1267 cdef unsigned int size = int(cond_params.size) 10Y123Z45-

1268  

1269 cdef GraphCondition condition = GraphCondition.__new__(GraphCondition) 10Y123Z45-

1270 condition._c_handle = <cydriver.CUgraphConditionalHandle>( 10Y123Z45-

1271 <unsigned long long>int(cond_params.handle)) 10Y123Z45-

1272  

1273 cdef GraphHandle h_graph = graph_node_get_graph(h_node) 10Y123Z45-

1274 cdef list branch_list = [] 10Y123Z45-

1275 cdef unsigned int i 

1276 cdef GraphHandle h_branch 

1277 if cond_params.phGraph_out is not None: 10Y123Z45-

1278 for i in range(size): 10Y123Z45-

1279 h_branch = create_child_graph_handle( 10Y123Z45-

1280 <cydriver.CUgraph><uintptr_t>int(cond_params.phGraph_out[i]), 10Y123Z45-

1281 h_graph, node) 

1282 branch_list.append(GraphDefinition._from_handle(h_branch)) 10Y123Z45-

1283 cdef tuple branches = tuple(branch_list) 10Y123Z45-

1284  

1285 cdef type cls 

1286 if cond_type_int == <int>cydriver.CU_GRAPH_COND_TYPE_IF: 10Y123Z45-

1287 if size == 1: 10Y3Z

1288 cls = IfNode 103

1289 else: 

1290 cls = IfElseNode 1YZ

1291 elif cond_type_int == <int>cydriver.CU_GRAPH_COND_TYPE_WHILE: 11245-

1292 cls = WhileNode 125-

1293 else: 

1294 cls = SwitchNode 114

1295  

1296 n = cls.__new__(cls) 10Y123Z45-

1297 n._h_node = h_node 10Y123Z45-

1298 n._condition = condition 10Y123Z45-

1299 n._cond_type = <cydriver.CUgraphConditionalNodeType>cond_type_int 10Y123Z45-

1300 n._branches = branches 10Y123Z45-

1301 return n 10Y123Z45-

1302  

1303 def __repr__(self) -> str: 

1304 return f"<ConditionalNode handle=0x{as_intptr(self._h_node):x}>" 

1305  

1306 @property 

1307 def condition(self) -> GraphCondition | None: 

1308 """The condition variable controlling execution.""" 

1309 return self._condition 2ai=i}i?ibi@i~i[i

1310  

1311 @property 

1312 def cond_type(self) -> GraphConditionalType | None: 

1313 """The conditional type: GraphConditionalType.IF, .WHILE, or .SWITCH 

1314  

1315 Returns None when reconstructed from the driver pre-CUDA 13.2, 

1316 as the conditional type cannot be determined. 

1317 """ 

1318 if self._condition is None: 2ai=i}i?ibi@i~i[i

1319 return None 

1320 if self._cond_type == cydriver.CU_GRAPH_COND_TYPE_IF: 2ai=i}i?ibi@i~i[i

1321 return GraphConditionalType("if") 2ai=ibi@i

1322 elif self._cond_type == cydriver.CU_GRAPH_COND_TYPE_WHILE: 

1323 return GraphConditionalType("while") 2?i[i

1324 else: 

1325 return GraphConditionalType("switch") 2}i~i

1326  

1327 @property 

1328 def branches(self) -> tuple[GraphDefinition, ...]: 

1329 """The body graphs for each branch as a tuple of GraphDefinition. 

1330  

1331 Returns an empty tuple when reconstructed from the driver 

1332 pre-CUDA 13.2. 

1333 """ 

1334 return self._branches 2ai=i}i?ibi@i~i[iGkMd1 4 -

1335  

1336  

1337cdef class IfNode(ConditionalNode): 

1338 """An if-conditional node.""" 

1339  

1340 def __repr__(self) -> str: 

1341 return (f"<IfNode handle=0x{as_intptr(self._h_node):x}" 2tk

1342 f" condition=0x{<unsigned long long>self._condition._c_handle:x}>") 2tk

1343  

1344 @property 

1345 def then(self) -> GraphDefinition: 

1346 """The 'then' branch graph.""" 

1347 return self._branches[0] 2=i@iHkLd0 3

1348  

1349  

1350cdef class IfElseNode(ConditionalNode): 

1351 """An if-else conditional node.""" 

1352  

1353 def __repr__(self) -> str: 

1354 return (f"<IfElseNode handle=0x{as_intptr(self._h_node):x}" 2uk

1355 f" condition=0x{<unsigned long long>self._condition._c_handle:x}>") 2uk

1356  

1357 @property 

1358 def then(self) -> GraphDefinition: 

1359 """The ``then`` branch graph (executed when condition is non-zero).""" 

1360 return self._branches[0] 2aibivkydY Z

1361  

1362 @property 

1363 def else_(self) -> GraphDefinition: 

1364 """The ``else`` branch graph (executed when condition is zero).""" 

1365 return self._branches[1] 2aibivkydY Z

1366  

1367  

1368cdef class WhileNode(ConditionalNode): 

1369 """A while-loop conditional node.""" 

1370  

1371 def __repr__(self) -> str: 

1372 return (f"<WhileNode handle=0x{as_intptr(self._h_node):x}" 2wk

1373 f" condition=0x{<unsigned long long>self._condition._c_handle:x}>") 2wk

1374  

1375 @property 

1376 def body(self) -> GraphDefinition: 

1377 """The loop body graph.""" 

1378 return self._branches[0] 2?i[iIkNd2 5

1379  

1380  

1381cdef class SwitchNode(ConditionalNode): 

1382 """A switch conditional node.""" 

1383  

1384 def __repr__(self) -> str: 

1385 return (f"<SwitchNode handle=0x{as_intptr(self._h_node):x}" 2xk

1386 f" condition=0x{<unsigned long long>self._condition._c_handle:x}>") 2xk

1387  

1388  

1389cdef class ExecutableGraphNode: 

1390 """A lightweight view pairing an executable graph with a source node. 

1391  

1392 Create executable-node views with ``graph[node]``. CUDA validates that the 

1393 node identifies a node in the executable graph when an operation is 

1394 performed. 

1395 """ 

1396  

1397 def __init__(self): 

1398 raise RuntimeError( 

1399 "directly constructing an executable graph node is not supported") 

1400  

1401 def __repr__(self) -> str: 

1402 return ( 

1403 f"<{type(self).__name__} graph=0x{as_intptr(self._h_graph_exec):x}" 

1404 f" node=0x{as_intptr(self._h_node):x}>" 

1405 ) 

1406  

1407  

1408cdef class ExecutableKernelNode(ExecutableGraphNode): 

1409 """An executable kernel-node view.""" 

1410  

1411 def update( 

1412 self, 

1413 *, 

1414 config: LaunchConfig, 

1415 kernel: Kernel, 

1416 args, 

1417 ) -> None: 

1418 """Replace all kernel launch parameters for future launches. 

1419  

1420 ``args`` must contain the complete argument sequence; use ``args=()`` 

1421 for a no-argument kernel. Clustered and cooperative launch 

1422 configurations are not supported. 

1423 """ 

1424 cdef LaunchConfig c_config = config 1puvwqz

1425 cdef Kernel c_kernel = kernel 1puvwqz

1426 cdef ParamHolder arg_holder 

1427 cdef object kernel_args 

1428 cdef OpaqueHandle kernel_owner = c_kernel._h_kernel 1puvwqz

1429 cdef OpaqueHandle args_owner 

1430 cdef cydriver.CUgraphNodeParams params 

1431  

1432 if c_config.cluster is not None or c_config.is_cooperative: 1puvwqz

1433 raise NotImplementedError( 

1434 "updating clustered or cooperative kernel nodes is not " 

1435 "supported") 

1436 arg_holder = ParamHolder(args) 1puvwqz

1437  

1438 c_memset(&params, 0, sizeof(params)) 1puvwqz

1439 params.type = cydriver.CU_GRAPH_NODE_TYPE_KERNEL 1puvwqz

1440 params.kernel.kern = as_cu(c_kernel._h_kernel) 1puvwqz

1441 params.kernel.func = <cydriver.CUfunction>NULL 1puvwqz

1442 params.kernel.gridDimX = c_config.grid[0] 1puvwqz

1443 params.kernel.gridDimY = c_config.grid[1] 1puvwqz

1444 params.kernel.gridDimZ = c_config.grid[2] 1puvwqz

1445 params.kernel.blockDimX = c_config.block[0] 1puvwqz

1446 params.kernel.blockDimY = c_config.block[1] 1puvwqz

1447 params.kernel.blockDimZ = c_config.block[2] 1puvwqz

1448 params.kernel.sharedMemBytes = c_config.shmem_size 1puvwqz

1449 params.kernel.kernelParams = <void**><uintptr_t>arg_holder.ptr 1puvwqz

1450 params.kernel.extra = NULL 1puvwqz

1451 params.kernel.ctx = <cydriver.CUcontext>NULL 1puvwqz

1452  

1453 kernel_args = arg_holder.kernel_args 1puvwqz

1454 if kernel_args is not None: 1puvwqz

1455 args_owner = make_opaque_py(kernel_args) 1puvqz

1456 _set_executable_node_params( 1puvwqz

1457 self._h_graph_exec, self._h_node, &params, 

1458 kernel_owner, args_owner) 

1459  

1460 @property 

1461 def is_enabled(self) -> bool: 

1462 """Whether this node is enabled in the executable graph.""" 

1463 return _get_executable_node_enabled( 1W

1464 self._h_graph_exec, self._h_node) 1W

1465  

1466 def enable(self) -> None: 

1467 """Enable this node in the executable graph.""" 

1468 _set_executable_node_enabled( 1W

1469 self._h_graph_exec, self._h_node, True) 

1470  

1471 def disable(self) -> None: 

1472 """Disable this node in the executable graph.""" 

1473 _set_executable_node_enabled( 1W

1474 self._h_graph_exec, self._h_node, False) 

1475  

1476  

1477cdef class ExecutableMemsetNode(ExecutableGraphNode): 

1478 """An executable memset-node view.""" 

1479  

1480 def update( 

1481 self, 

1482 *, 

1483 dst: Buffer | int, 

1484 value, 

1485 size_t width, 

1486 size_t height=1, 

1487 size_t pitch=0, 

1488 ) -> None: 

1489 """Replace all memset parameters for future launches.""" 

1490 cdef cydriver.CUdeviceptr c_dst 

1491 cdef OpaqueHandle dst_owner = _resolve_memcpy_operand( 1xy

1492 dst, None, "dst", &c_dst) 

1493 cdef unsigned int c_value 

1494 cdef unsigned int element_size 

1495 c_value, element_size = _parse_fill_value(value) 1xy

1496  

1497 cdef cydriver.CUcontext ctx = NULL 1xy

1498 cdef cydriver.CUgraphNodeParams params 

1499 with nogil: 1xy

1500 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 1xy

1501  

1502 c_memset(&params, 0, sizeof(params)) 1xy

1503 params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMSET 1xy

1504 params.memset.dst = c_dst 1xy

1505 params.memset.value = c_value 1xy

1506 params.memset.elementSize = element_size 1xy

1507 params.memset.width = width 1xy

1508 params.memset.height = height 1xy

1509 params.memset.pitch = pitch 1xy

1510 params.memset.ctx = ctx 1xy

1511 _set_executable_node_params( 1xy

1512 self._h_graph_exec, self._h_node, &params, dst_owner) 

1513  

1514 @property 

1515 def is_enabled(self) -> bool: 

1516 """Whether this node is enabled in the executable graph.""" 

1517 return _get_executable_node_enabled( 1Q

1518 self._h_graph_exec, self._h_node) 1Q

1519  

1520 def enable(self) -> None: 

1521 """Enable this node in the executable graph.""" 

1522 _set_executable_node_enabled( 1Q

1523 self._h_graph_exec, self._h_node, True) 

1524  

1525 def disable(self) -> None: 

1526 """Disable this node in the executable graph.""" 

1527 _set_executable_node_enabled( 1Q

1528 self._h_graph_exec, self._h_node, False) 

1529  

1530  

1531cdef class ExecutableMemcpyNode(ExecutableGraphNode): 

1532 """An executable memcpy-node view.""" 

1533  

1534 def update( 

1535 self, 

1536 *, 

1537 dst: Buffer | int, 

1538 src: Buffer | int, 

1539 size_t size, 

1540 ) -> None: 

1541 """Replace all one-dimensional memcpy parameters for future launches.""" 

1542 cdef cydriver.CUdeviceptr c_dst 

1543 cdef cydriver.CUdeviceptr c_src 

1544 cdef OpaqueHandle dst_owner = _resolve_memcpy_operand( 1EFG

1545 dst, None, "dst", &c_dst) 

1546 cdef OpaqueHandle src_owner = _resolve_memcpy_operand( 1EFG

1547 src, None, "src", &c_src) 

1548 cdef cydriver.CUmemorytype dst_type 

1549 cdef cydriver.CUmemorytype src_type 

1550 cdef cydriver.CUcontext ctx = NULL 1EFG

1551 cdef cydriver.CUgraphNodeParams params 

1552  

1553 c_memset(&params, 0, sizeof(params)) 1EFG

1554 params.type = cydriver.CU_GRAPH_NODE_TYPE_MEMCPY 1EFG

1555 _init_memcpy_params( 1EFG

1556 c_dst, c_src, size, &params.memcpy.copyParams, 

1557 &dst_type, &src_type) 

1558 with nogil: 1EFG

1559 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 1EFG

1560 params.memcpy.copyCtx = ctx 1EFG

1561 _set_executable_node_params( 1EFG

1562 self._h_graph_exec, self._h_node, &params, 

1563 dst_owner, src_owner) 

1564  

1565 @property 

1566 def is_enabled(self) -> bool: 

1567 """Whether this node is enabled in the executable graph.""" 

1568 return _get_executable_node_enabled( 1P

1569 self._h_graph_exec, self._h_node) 1P

1570  

1571 def enable(self) -> None: 

1572 """Enable this node in the executable graph.""" 

1573 _set_executable_node_enabled( 1P

1574 self._h_graph_exec, self._h_node, True) 

1575  

1576 def disable(self) -> None: 

1577 """Disable this node in the executable graph.""" 

1578 _set_executable_node_enabled( 1P

1579 self._h_graph_exec, self._h_node, False) 

1580  

1581  

1582cdef class ExecutableChildGraphNode(ExecutableGraphNode): 

1583 """An executable child-graph-node view.""" 

1584  

1585 def update(self, child: GraphDefinition) -> None: 

1586 """Replace the embedded graph parameters for future launches.""" 

1587 GD_check_valid(child) 1KA

1588 cdef cydriver.CUgraphNodeParams params 

1589 c_memset(&params, 0, sizeof(params)) 1KA

1590 params.type = cydriver.CU_GRAPH_NODE_TYPE_GRAPH 1KA

1591 params.graph.graph = as_cu(child._h_graph) 1KA

1592 _set_executable_node_params( 1KA

1593 self._h_graph_exec, self._h_node, &params) 

1594  

1595  

1596cdef class ExecutableEventRecordNode(ExecutableGraphNode): 

1597 """An executable event-record-node view.""" 

1598  

1599 def update(self, event: Event) -> None: 

1600 """Replace the event recorded by future launches.""" 

1601 Event_check_open(event) 1I

1602 cdef OpaqueHandle event_owner = event._h_event 1I

1603 cdef cydriver.CUgraphNodeParams params 

1604 c_memset(&params, 0, sizeof(params)) 1I

1605 params.type = cydriver.CU_GRAPH_NODE_TYPE_EVENT_RECORD 1I

1606 params.eventRecord.event = as_cu(event._h_event) 1I

1607 _set_executable_node_params( 1I

1608 self._h_graph_exec, self._h_node, &params, event_owner) 

1609  

1610  

1611cdef class ExecutableEventWaitNode(ExecutableGraphNode): 

1612 """An executable event-wait-node view.""" 

1613  

1614 def update(self, event: Event) -> None: 

1615 """Replace the event waited on by future launches.""" 

1616 Event_check_open(event) 1C

1617 cdef OpaqueHandle event_owner = event._h_event 1C

1618 cdef cydriver.CUgraphNodeParams params 

1619 c_memset(&params, 0, sizeof(params)) 1C

1620 params.type = cydriver.CU_GRAPH_NODE_TYPE_WAIT_EVENT 1C

1621 params.eventWait.event = as_cu(event._h_event) 1C

1622 _set_executable_node_params( 1C

1623 self._h_graph_exec, self._h_node, &params, event_owner) 

1624  

1625  

1626cdef class ExecutableHostCallbackNode(ExecutableGraphNode): 

1627 """An executable host-callback-node view.""" 

1628  

1629 def update(self, fn, *, user_data=None) -> None: 

1630 """Replace the callback and user-data binding for future launches. 

1631  

1632 ``fn`` may be a Python callable, or a ctypes function pointer whose 

1633 declared prototype matches ``CUhostFn`` (``void (*)(void*)``); a 

1634 mismatched prototype raises ``TypeError``. 

1635  

1636 .. warning:: 

1637  

1638 Callbacks must not call CUDA API functions. Doing so may deadlock 

1639 or corrupt driver state. 

1640 """ 

1641 cdef cydriver.CUhostFn c_fn 

1642 cdef void* c_user_data 

1643 cdef OpaqueHandle fn_owner 

1644 cdef OpaqueHandle data_owner 

1645 cdef cydriver.CUgraphNodeParams params 

1646  

1647 _resolve_host_callback( 1OLMRJSH

1648 fn, user_data, &c_fn, &c_user_data, &fn_owner, &data_owner) 

1649 c_memset(&params, 0, sizeof(params)) 1OLMRJSH

1650 params.type = cydriver.CU_GRAPH_NODE_TYPE_HOST 1OLMRJSH

1651 params.host.fn = c_fn 1OLMRJSH

1652 params.host.userData = c_user_data 1OLMRJSH

1653 _set_executable_node_params( 1OLMRJSH

1654 self._h_graph_exec, self._h_node, &params, 

1655 fn_owner, data_owner) 

1656  

1657  

1658cdef ExecutableGraphNode create_executable_node_view( 

1659 const GraphExecHandle& h_exec, 

1660 GraphNode node): 

1661 cdef type view_type 

1662 if isinstance(node, KernelNode): 2K p O W P Q A I C L M u v w E F G x y }bR J q z S H

1663 view_type = ExecutableKernelNode 1pWuvwqz

1664 elif isinstance(node, MemsetNode): 2K O P Q A I C L M E F G x y }bR J S H

1665 view_type = ExecutableMemsetNode 1Qxy

1666 elif isinstance(node, MemcpyNode): 2K O P A I C L M E F G }bR J S H

1667 view_type = ExecutableMemcpyNode 1PEFG

1668 elif isinstance(node, ChildGraphNode): 2K O A I C L M }bR J S H

1669 view_type = ExecutableChildGraphNode 1KA

1670 elif isinstance(node, EventRecordNode): 2O I C L M }bR J S H

1671 view_type = ExecutableEventRecordNode 1I

1672 elif isinstance(node, EventWaitNode): 2O C L M }bR J S H

1673 view_type = ExecutableEventWaitNode 1C

1674 elif isinstance(node, HostCallbackNode): 2O L M }bR J S H

1675 view_type = ExecutableHostCallbackNode 1OLMRJSH

1676 else: 

1677 raise TypeError( 2}b

1678 f"{type(node).__name__} does not support executable updates") 2}b

1679  

1680 if as_cu(h_exec) == NULL: 1KpOWPQAICLMuvwEFGxyRJqzSH

1681 raise ValueError("executable graph has been closed") 

1682 if as_cu(node._h_node) == NULL: 1KpOWPQAICLMuvwEFGxyRJqzSH

1683 raise ValueError("source graph node is no longer valid") 

1684  

1685 cdef ExecutableGraphNode view = view_type.__new__(view_type) 1KpOWPQAICLMuvwEFGxyRJqzSH

1686 view._h_graph_exec = h_exec 1KpOWPQAICLMuvwEFGxyRJqzSH

1687 view._h_node = node._h_node 1KpOWPQAICLMuvwEFGxyRJqzSH

1688 return view 1KpOWPQAICLMuvwEFGxyRJqzSH