Coverage for cuda/core/graph/_graph_node.pyx: 83.98%
462 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 01:23 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-16 01:23 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5"""GraphNode base class — factory, properties, and builder methods."""
7from __future__ import annotations
9from collections.abc import Iterable
10from typing import TYPE_CHECKING
12from libc.stddef cimport size_t
13from libc.stdint cimport uintptr_t
14from libc.string cimport memset as c_memset
16from libcpp.vector cimport vector
18from cuda.bindings cimport cydriver
20from cuda.core._event cimport Event, Event_check_open
21from cuda.core._kernel_arg_handler cimport ParamHolder
22from cuda.core._launch_config cimport LaunchConfig
23from cuda.core._memory._buffer cimport Buffer, Buffer_check_open
24from cuda.core._memory._location cimport cumemlocation_from_id
25from cuda.core._module cimport Kernel
26from cuda.core.graph._graph_definition cimport (
27 GraphCondition,
28 GraphDefinition,
29 GD_check_valid,
30)
31from cuda.core.graph._subclasses cimport (
32 AllocNode,
33 ChildGraphNode,
34 ConditionalNode,
35 EmptyNode,
36 EventRecordNode,
37 EventWaitNode,
38 FreeNode,
39 HostCallbackNode,
40 IfElseNode,
41 IfNode,
42 KernelNode,
43 MemcpyNode,
44 MemsetNode,
45 SwitchNode,
46 WhileNode,
47)
48from cuda.core._rt cimport attach_rollback_failure
49from cuda.core._rt cimport (
50 GraphHandle,
51 GraphNodeHandle,
52 OpaqueHandle,
53 PreparedAttachment,
54 as_cu,
55 as_intptr,
56 as_py,
57 create_child_graph_handle,
58 create_graph_node_handle,
59 graph_clone_attachments,
60 graph_commit_attachment,
61 graph_node_get_graph,
62 graph_prepare_attachment,
63 invalidate_child_graph_state,
64 invalidate_graph_node,
65 make_opaque_py,
66)
67from cuda.core._utils.cuda_utils cimport HANDLE_RETURN, _parse_fill_value
69from cuda.core.graph._host_callback cimport (
70 _resolve_host_callback,
71)
73import ctypes as ct
74import weakref
76from cuda.core.graph._adjacency_set_proxy import AdjacencySetProxy
77from cuda.core._utils.validators import check_str_enum
78from cuda.core._utils.cuda_utils import driver
79from cuda.core.typing import GraphMemoryType
81if TYPE_CHECKING:
82 from cuda.core._device import Device
84__all__ = ['GraphNode']
86# See _cpp/REGISTRY_DESIGN.md (Level 2: Resource Handle -> Python Object)
87_node_registry: weakref.WeakValueDictionary[int, GraphNode] = weakref.WeakValueDictionary()
90cdef inline GraphNode _registered(GraphNode n):
91 return _node_registry.setdefault(<uintptr_t>n._h_node.get(), n) 26g{btd=g|b?g7gmfnfRcac+e,e-eVe4b.ebcWe/eWc+f,f-f.f/f:fccof0c1c2c3cIbkd;f=fvewexeyezeb c d e G H I J :e;e=ewbxbybxfyfzfgdAeXe~c@gJbdcecfc4c?f@fudvd4 g # $ % ' wdxdJfYeKfadKbgcLfhcMficNf5c[f]fydzdOf5 Ffh Pf( Qf) Rf* Sf+ AdBdZe5b?ejc0e@e1e6b[ekc2e]e3ebdLblcmcnc6c^f_fCdDd6 i , - . / EdFdTf4eUfcdMbVfocWfpcXfqcYf7c`f{fGdHdZf7 Gfj 0f: 1f; 2f= 3f? IdJd4f5e5fddNb6frc7fsc8ftc9f8c|f}fKdLd!f8 #fk $f@ %f[ 'f] (f^ MdNd6eedObucvcwc9c~fagOdPd9 l _ ` { | QdRd7e7b^exc8e_e9e8b`eyc!e{etf#e9b|ezc$e}eCfAb8g9gfdBe~eScbgSdTdUdVdC D E F vfpfqfcgdg! qbzb%e} QcL M N O Q R S T egAcfgldmdBcggnb1 TcUcV f z W X WdXdCeubDeEe'b(b)b*bDb}b~b:c;c}crb2 rftbhgVcsbPbigmbU P K ~ 3gAfwf'ey 4gEbabndBf3 5ghdQb*fCcodFbjgkgYdZd0d+b,b-b=c?cidpdqdlgmg1d2d3d!b#b$b.c/cRbobpbFeGe.b/b:bY Z 0 BbCbngXcYcZcHeIe@cJe;b[c4dDcrdGbogpg5d6d7d=b?b@b]c^cvbqgEcsdHbrgsg8d9d!d[b]b^b_c`c(eSb#d$d_b`b{c|cDfEf!g%bA B %dtgug)e*ejdvgx afTbFcwgxg!cyg'd(dKem bb)d*dlfbfUbGczgAg#cBg+d,dLen cb-d.dcfVbHcCgDg$cEg/d:dMeo db;d=da dfWbIcFgGg%cHg?d@dNep eb[d]defXbJcIgJg'cKg^d_dOeq fb`d{dffYbKcLgMg(cNg|d}dPer gb~daegfZbLcOgPg)cQgbeceQes hbdeeehf0bMcRgSg*cTgfegeRet ibheieif1bNcUgVg+cWgjekeSeu jblemejf2bOcXgYg,cZgneoeTev kbpeqekf3bPc0g1g-c2greseUew lbteue
94cdef class GraphNode:
95 """A node in a graph definition.
97 Nodes are created by calling builder methods on GraphDefinition (for
98 entry-point nodes with no dependencies) or on other Nodes (for
99 nodes that depend on a predecessor).
100 """
102 @staticmethod
103 cdef GraphNode _create(GraphHandle h_graph, cydriver.CUgraphNode node):
104 """Factory: dispatch to the right subclass based on node type."""
105 return GN_create(h_graph, node) 2{b=g|b?gacghhhihjhccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z ubrb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 Ccobpb@cDcEc{c|cDfEf!g
107 def __repr__(self) -> str:
108 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 2)h
109 if node == NULL: 2)h
110 if self._is_entry and self.is_valid: 2)h
111 return "<GraphNode entry>" 2)h
112 return "<GraphNode destroyed>"
113 return f"<GraphNode handle=0x{<uintptr_t>node:x}>"
115 def __eq__(self, other: object) -> bool:
116 if not isinstance(other, GraphNode): 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
117 return NotImplemented 2whxhyhzhAhBhChDhEhFhGhHhIhJhKh*h
118 cdef GraphNode o = <GraphNode>other 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
119 cdef GraphHandle self_graph = graph_node_get_graph(self._h_node) 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
120 cdef GraphHandle other_graph = graph_node_get_graph(o._h_node) 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
121 return (as_intptr(self._h_node) == as_intptr(o._h_node) 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
122 and as_intptr(self_graph) == as_intptr(other_graph)) 2acJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fwhxhyhzhAhBhChDhEhFhGhHhIhJhKh*h,h-h.h/h:h;h=h?h@h[h]h^h_h`h{hLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
124 def __hash__(self) -> int:
125 cdef GraphHandle g = graph_node_get_graph(self._h_node) 2{b=g|b?gacghhhwiihjhxiccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:gqhrhshthuhvh^g_gsi`g{gti|g}gui~gahviCfAbC D E F vf! qb} L M N O Q R S T rb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 CcRbobpbFeGe.b/b:bY Z 0 BbCb@cDcEc{c|cDfEf!gyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_iLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
126 return hash((as_intptr(self._h_node), as_intptr(g))) 2{b=g|b?gacghhhwiihjhxiccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:gqhrhshthuhvh^g_gsi`g{gti|g}gui~gahviCfAbC D E F vf! qb} L M N O Q R S T rb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 CcRbobpbFeGe.b/b:bY Z 0 BbCb@cDcEc{c|cDfEf!gyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_iLhMhNhOhPhQhRhShThUhVhWhXhYhZh0h1h2h3h4h5h6h7h8h9h!h#h$h%h'h
128 @property
129 def type(self) -> driver.CUgraphNodeType | None:
130 """Return the CUDA graph node type.
132 Returns
133 -------
134 CUgraphNodeType or None
135 The node type enum value, or None for the entry node.
136 """
137 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 2}h~haibicidieifigihiiijikiliminioipiqiriab
138 if node == NULL: 2}h~haibicidieifigihiiijikiliminioipiqiriab
139 return None 2}hab
140 cdef cydriver.CUgraphNodeType node_type
141 with nogil: 2~haibicidieifigihiiijikiliminioipiqiri
142 HANDLE_RETURN(cydriver.cuGraphNodeGetType(node, &node_type)) 2~haibicidieifigihiiijikiliminioipiqiri
143 return driver.CUgraphNodeType(<int>node_type) 2~haibicidieifigihiiijikiliminioipiqiri
145 @property
146 def graph(self) -> GraphDefinition:
147 """Return the GraphDefinition this node belongs to."""
148 return GraphDefinition._from_handle(graph_node_get_graph(self._h_node)) 2`i{i|i}i~iaj
150 @property
151 def handle(self) -> driver.CUgraphNode:
152 """Return the underlying driver CUgraphNode handle.
154 Returns None for the entry node.
155 """
156 return as_py(self._h_node) 2ab*f4d#dDfEf!g%bx whxhyhzhAhBhChDhEhFhGhHhIhJhKh
158 @property
159 def is_valid(self) -> bool:
160 """Whether this node and its graph definition remain valid.
162 Returns ``False`` after :meth:`destroy` has been called.
163 """
164 return ( 2} L M N O PbEbab3 RbobpbFeGe.b/b:bY Z 0 BbCblf)h
165 as_intptr(graph_node_get_graph(self._h_node)) != 0 2} L M N O PbEbab3 RbobpbFeGe.b/b:bY Z 0 BbCblf)h
166 and (self._is_entry or as_intptr(self._h_node) != 0) 2} PbEbab3 RbobpbFeGe.b/b:bY Z 0 BbCblf)h
167 )
169 def destroy(self) -> None:
170 """Destroy this node and remove all its edges from the parent graph.
172 After this call, :attr:`is_valid` returns ``False`` and the node
173 cannot be re-added to any graph. Safe to call on an
174 already-destroyed node (no-op).
175 """
176 cdef cydriver.CUgraphNode node = as_cu(self._h_node) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
177 cdef PreparedAttachment prepared
178 if self._is_entry or node == NULL: 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
179 return 2ab
181 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
182 # Allocate the cleanup transaction before asking CUDA to destroy the
183 # node. A failed CUDA call leaves metadata and wrappers unchanged.
184 HANDLE_RETURN(graph_prepare_attachment( 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
185 h_graph, OpaqueHandle(), OpaqueHandle(), &prepared))
186 with nogil: 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
187 HANDLE_RETURN(cydriver.cuGraphDestroyNode(node)) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K Ebabnd3 RbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
189 # Publish attachment removal before invalidating graph and node aliases.
190 cdef cydriver.CUresult cleanup_status = graph_commit_attachment(prepared, node) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K EbabndRbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
191 invalidate_child_graph_state(h_graph, node) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K EbabndRbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
192 _node_registry.pop(<uintptr_t>self._h_node.get(), None) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K EbabndRbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
193 invalidate_graph_node(self._h_node) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K EbabndRbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
194 HANDLE_RETURN(cleanup_status) 2tfvfpfqfqbzb%e} QcL M N O Q R S T rbrftbsbU P K EbabndRbobpbFeGe.b/b:bY Z 0 BbCbXcYcZcvbx lf
196 @property
197 def pred(self) -> AdjacencySetProxy:
198 """A mutable set-like view of this node's predecessors."""
199 return AdjacencySetProxy(self, False) 2RcWc}hofwbxbybxfgd4f5fbj6f7f8f9fcjdjejfj!f#f$f%f'f(fgjhj^g_gsi`g{gtiAbnb1 TcUcV f z ubwf'ey Ebab
201 @pred.setter
202 def pred(self, value: Iterable[GraphNode]) -> None:
203 p = AdjacencySetProxy(self, False) 2K 'e
204 p.clear() 2K 'e
205 p.update(value) 2K 'e
207 @property
208 def succ(self) -> AdjacencySetProxy:
209 """A mutable set-like view of this node's successors."""
210 return AdjacencySetProxy(self, True) 2}hofyfzf4f5f6f7f8f9f!f#f$f%f'f(f|g}gui~gahviP ~ 3gAfwf'ey 4gEbabndBf5g
212 @succ.setter
213 def succ(self, value: Iterable[GraphNode]) -> None:
214 s = AdjacencySetProxy(self, True) 2of'e
215 s.clear() 2of'e
216 s.update(value) 2of'e
218 def launch(self, LaunchConfig config not None: LaunchConfig, Kernel kernel not None: Kernel, *args) -> KernelNode:
219 """Add a kernel launch node depending on this node.
221 Clustered and cooperative launch configurations are not currently
222 supported for graph kernel nodes.
224 .. warning::
226 Use caution when a retained kernel argument directly or indirectly
227 owns a graph. Any reference cycle involving the argument and a
228 graph that retains it cannot be broken by Python's cyclic garbage
229 collector. Use a weak reference to break such cycles.
231 Parameters
232 ----------
233 config : LaunchConfig
234 Launch configuration (grid, block, shared memory, etc.)
235 kernel : Kernel
236 The kernel to launch.
237 *args
238 Kernel arguments.
240 Returns
241 -------
242 KernelNode
243 A new KernelNode representing the kernel launch.
244 """
245 GN_check_valid(self) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
246 return GN_launch(self, config, kernel, ParamHolder(args)) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
248 def join(self, *nodes: GraphNode) -> EmptyNode:
249 """Create an empty node that depends on this node and all given nodes.
251 This is used to synchronize multiple branches of execution.
253 Parameters
254 ----------
255 *nodes : GraphNode
256 Additional nodes to depend on.
258 Returns
259 -------
260 EmptyNode
261 A new EmptyNode that depends on all input nodes.
262 """
263 return GN_join(self, nodes) 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
265 def allocate(self, size_t size, *, device: Device | int | None = None,
266 memory_type: GraphMemoryType = GraphMemoryType.DEVICE,
267 peer_access: list[Device | int] | None = None) -> AllocNode:
268 """Add a memory allocation node depending on this node.
270 Parameters
271 ----------
272 size : int
273 Number of bytes to allocate.
274 device : int or Device, optional
275 The device on which to allocate memory. If None (default),
276 uses the current CUDA context's device.
277 memory_type : GraphMemoryType or str, optional
278 Type of memory to allocate. One of:
280 - ``GraphMemoryType.DEVICE`` (default): Pinned device memory,
281 optimal for GPU kernels.
282 - ``GraphMemoryType.HOST``: Pinned host memory, accessible from
283 both host and device. Useful for graphs containing host
284 callback nodes. Note: may not be supported on all
285 systems/drivers.
286 - ``GraphMemoryType.MANAGED``: Managed/unified memory that
287 automatically migrates between host and device. Useful for
288 mixed host/device access patterns.
290 peer_access : list of int or Device, optional
291 List of devices that should have read-write access to the
292 allocated memory. If None (default), only the allocating
293 device has access.
295 Returns
296 -------
297 AllocNode
298 A new AllocNode representing the allocation. Access the allocated
299 device pointer via the dptr property.
301 Notes
302 -----
303 IPC (inter-process communication) is not supported for graph
304 memory allocation nodes per CUDA documentation.
305 """
306 return GN_alloc(self, size, device, memory_type, peer_access) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
308 def deallocate(self, dptr: int) -> FreeNode:
309 """Add a memory free node depending on this node.
311 Parameters
312 ----------
313 dptr : int
314 Device pointer to free (typically from AllocNode.dptr).
316 Returns
317 -------
318 FreeNode
319 A new FreeNode representing the free operation.
320 """
321 return GN_free(self, <cydriver.CUdeviceptr>dptr) 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
323 def memset(
324 self,
325 dst: Buffer | int,
326 value,
327 size_t width,
328 size_t height=1,
329 size_t pitch=0,
330 *,
331 dst_owner=None,
332 ) -> MemsetNode:
333 """Add a memset node depending on this node.
335 .. warning::
337 Use caution when a retained operand owner directly or indirectly
338 owns a graph. Any reference cycle involving the owner and a graph
339 that retains it cannot be broken by Python's cyclic garbage
340 collector. Use a weak reference to break such cycles.
342 Parameters
343 ----------
344 dst : Buffer or int
345 Destination. When ``dst`` is a :class:`Buffer`, the underlying
346 allocation is retained for the graph's lifetime. A raw pointer
347 (``int``) is used as-is; the caller must keep the underlying memory
348 alive, or supply ``dst_owner`` to have the graph retain it.
349 value : int or buffer-protocol object
350 Fill value. int for 1-byte fill (range [0, 256)),
351 or buffer-protocol object of 1, 2, or 4 bytes.
352 width : int
353 Width of the row in elements.
354 height : int, optional
355 Number of rows (default 1).
356 pitch : int, optional
357 Pitch of destination in bytes (default 0, unused if height is 1).
358 dst_owner : object, optional
359 Object retained for the graph's lifetime when ``dst`` is a raw
360 pointer. A :class:`Buffer` owner retains its underlying allocation,
361 not the wrapper. Must not be passed when ``dst`` is a :class:`Buffer`.
363 Returns
364 -------
365 MemsetNode
366 A new MemsetNode representing the memset operation.
368 Raises
369 ------
370 ValueError
371 If ``dst_owner`` is given together with a :class:`Buffer` ``dst``.
372 """
373 GN_check_valid(self) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | fd:c;c(h+h}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
374 cdef cydriver.CUdeviceptr c_dst
375 cdef unsigned int val
376 cdef unsigned int elem_size
377 cdef OpaqueHandle dst_attachment_owner = _resolve_memcpy_operand( 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | fd:c;c(h+h}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
378 dst, dst_owner, "dst", &c_dst)
379 val, elem_size = _parse_fill_value(value) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | fd:c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
380 return GN_memset( 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
381 self, c_dst, dst_attachment_owner,
382 val, elem_size, width, height, pitch) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
384 def memcpy(
385 self,
386 dst: Buffer | int,
387 src: Buffer | int,
388 size_t size,
389 *,
390 dst_owner=None,
391 src_owner=None,
392 ) -> MemcpyNode:
393 """Add a memcpy node depending on this node.
395 Copies ``size`` bytes from ``src`` to ``dst``. Memory types are
396 auto-detected via the driver, so both device and pinned host
397 pointers are supported.
399 .. warning::
401 Use caution when a retained operand owner directly or indirectly
402 owns a graph. Any reference cycle involving the owner and a graph
403 that retains it cannot be broken by Python's cyclic garbage
404 collector. Use a weak reference to break such cycles.
406 Parameters
407 ----------
408 dst : Buffer or int
409 Destination (device or pinned host). When a :class:`Buffer` is given,
410 the underlying allocation is retained for the graph's lifetime. A raw
411 pointer (``int``) is used as-is; the caller must keep the underlying
412 memory alive, or supply ``dst_owner`` to have the graph retain it.
413 src : Buffer or int
414 Source (device or pinned host). Same retention rules as ``dst``;
415 use ``src_owner`` for a raw pointer.
416 size : int
417 Number of bytes to copy.
418 dst_owner : object, optional
419 Object retained for the graph's lifetime when ``dst`` is a raw
420 pointer. A :class:`Buffer` owner retains its underlying allocation.
421 Must not be passed when ``dst`` is a :class:`Buffer`.
422 src_owner : object, optional
423 Object retained for the graph's lifetime when ``src`` is a raw
424 pointer. A :class:`Buffer` owner retains its underlying allocation.
425 Must not be passed when ``src`` is a :class:`Buffer`.
427 Returns
428 -------
429 MemcpyNode
430 A new MemcpyNode representing the copy operation.
432 Raises
433 ------
434 ValueError
435 If ``dst_owner`` or ``src_owner`` is given together with a
436 :class:`Buffer` ``dst`` or ``src`` respectively.
437 """
438 GN_check_valid(self) 2b c d e g h i j k l Sczbf z W X 'b|h;g(b)b*b]gDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
439 cdef cydriver.CUdeviceptr c_dst
440 cdef cydriver.CUdeviceptr c_src
441 cdef OpaqueHandle dst_attachment_owner = _resolve_memcpy_operand( 2b c d e g h i j k l Sczbf z W X 'b|h;g(b)b*b]gDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
442 dst, dst_owner, "dst", &c_dst)
443 cdef OpaqueHandle src_attachment_owner = _resolve_memcpy_operand( 2b c d e g h i j k l Sczbf z W X 'b;g(b)b*b]gDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
444 src, src_owner, "src", &c_src)
445 return GN_memcpy( 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
446 self, c_dst, dst_attachment_owner,
447 c_src, src_attachment_owner, size) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
449 def embed(self, GraphDefinition child not None: GraphDefinition) -> ChildGraphNode:
450 """Add a child graph node depending on this node.
452 Embeds a clone of the given graph definition as a sub-graph node.
453 The child graph must not contain allocation, free, or conditional
454 nodes.
456 Parameters
457 ----------
458 child : GraphDefinition
459 The graph definition to embed (will be cloned).
461 Returns
462 -------
463 ChildGraphNode
464 A new ChildGraphNode representing the embedded sub-graph.
465 """
466 return GN_embed(self, child) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
468 def record(self, Event event not None: Event) -> EventRecordNode:
469 """Add an event record node depending on this node.
471 Parameters
472 ----------
473 event : Event
474 The event to record.
476 Returns
477 -------
478 EventRecordNode
479 A new EventRecordNode representing the event record operation.
480 """
481 return GN_record_event(self, event) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
483 def wait(self, Event event not None: Event) -> EventWaitNode:
484 """Add an event wait node depending on this node.
486 Parameters
487 ----------
488 event : Event
489 The event to wait for.
491 Returns
492 -------
493 EventWaitNode
494 A new EventWaitNode representing the event wait operation.
495 """
496 return GN_wait_event(self, event) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
498 def callback(self, fn, *, user_data=None) -> object:
499 """Add a host callback node depending on this node.
501 The callback runs on the host CPU when the graph reaches this node.
502 Two modes are supported:
504 - **Python callable**: Pass any callable. The GIL is acquired
505 automatically. The callable must take no arguments; use closures
506 or ``functools.partial`` to bind state.
507 - **ctypes function pointer**: The function receives a single
508 ``void*`` argument (the ``user_data``), and the caller must keep
509 the ctypes wrapper alive for the lifetime of the graph. Its
510 declared prototype must match the driver's ``CUhostFn``
511 (``void (*)(void*)``): ``ctypes.CFUNCTYPE(None, ctypes.c_void_p)``,
512 or ``ctypes.WINFUNCTYPE(None, ctypes.c_void_p)`` on Windows.
514 .. warning::
516 Callbacks must not call CUDA API functions. Doing so may
517 deadlock or corrupt driver state.
519 Use caution when a Python callback retains an object that owns a
520 graph. Any reference cycle involving the callback and a graph that
521 retains it cannot be broken by Python's cyclic garbage collector.
522 Use a weak reference to break such cycles.
524 Parameters
525 ----------
526 fn : callable or ctypes function pointer
527 The callback function.
528 user_data : int or bytes-like, optional
529 Only for ctypes function pointers. If ``int``, passed as a raw
530 pointer (caller manages lifetime). If bytes-like, the data is
531 copied and its lifetime is tied to the graph.
533 Returns
534 -------
535 HostCallbackNode
536 A new HostCallbackNode representing the callback.
538 Raises
539 ------
540 TypeError
541 If ``fn`` is a ctypes function pointer whose declared prototype
542 does not match ``CUhostFn``.
543 ValueError
544 If ``user_data`` is given for a Python callable.
545 """
546 return GN_callback(self, fn, user_data) 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
548 def if_then(self, GraphCondition condition not None: GraphCondition) -> IfNode:
549 """Add an if-conditional node depending on this node.
551 The body graph executes only when the condition evaluates to
552 a non-zero value at runtime.
554 Parameters
555 ----------
556 condition : GraphCondition
557 GraphCondition from :meth:`GraphDefinition.create_condition`.
559 Returns
560 -------
561 IfNode
562 A new IfNode with one branch accessible via ``.then``.
563 """
564 return _make_conditional_node( 2acvdzdDdHdLdPdHfSdC L Q (d,d:da @d_d}dcegekeoese
565 self, condition,
566 cydriver.CU_GRAPH_COND_TYPE_IF, 1, IfNode) 2acvdzdDdHdLdPdHfSdC L Q (d,d:da @d_d}dcegekeoese
568 def if_else(self, GraphCondition condition not None: GraphCondition) -> IfElseNode:
569 """Add an if-else conditional node depending on this node.
571 Two body graphs: the first executes when the condition is
572 non-zero, the second when it is zero.
574 Parameters
575 ----------
576 condition : GraphCondition
577 GraphCondition from :meth:`GraphDefinition.create_condition`.
579 Returns
580 -------
581 IfElseNode
582 A new IfElseNode with branches accessible via
583 ``.then`` and ``.else_``.
584 """
585 return _make_conditional_node( 2udydCdGdKdOdTdD M R 'd+d/da ?d^d|dbefejenere
586 self, condition,
587 cydriver.CU_GRAPH_COND_TYPE_IF, 2, IfElseNode) 2udydCdGdKdOdTdD M R 'd+d/da ?d^d|dbefejenere
589 def while_loop(self, GraphCondition condition not None: GraphCondition) -> WhileNode:
590 """Add a while-loop conditional node depending on this node.
592 The body graph executes repeatedly while the condition
593 evaluates to a non-zero value.
595 Parameters
596 ----------
597 condition : GraphCondition
598 GraphCondition from :meth:`GraphDefinition.create_condition`.
600 Returns
601 -------
602 WhileNode
603 A new WhileNode with body accessible via ``.body``.
604 """
605 return _make_conditional_node( 2xdBdFdJdNdRdVdF O T Vc*d.d=da ]d{daeeeiemeqeue
606 self, condition,
607 cydriver.CU_GRAPH_COND_TYPE_WHILE, 1, WhileNode) 2xdBdFdJdNdRdVdF O T Vc*d.d=da ]d{daeeeiemeqeue
609 def switch(self, GraphCondition condition not None: GraphCondition, unsigned int count) -> SwitchNode:
610 """Add a switch conditional node depending on this node.
612 The condition value selects which branch to execute. If the
613 value is out of range, no branch executes.
615 Parameters
616 ----------
617 condition : GraphCondition
618 GraphCondition from :meth:`GraphDefinition.create_condition`.
619 count : int
620 Number of switch cases (branches).
622 Returns
623 -------
624 SwitchNode
625 A new SwitchNode with branches accessible via ``.branches``.
626 """
627 return _make_conditional_node( 2wdAdEdIdMdQdIfUdE N S )d-d;da [d`d~ddehelepete
628 self, condition,
629 cydriver.CU_GRAPH_COND_TYPE_SWITCH, count, SwitchNode) 2wdAdEdIdMdQdIfUdE N S )d-d;da [d`d~ddehelepete
632cdef inline ConditionalNode _make_conditional_node(
633 GraphNode pred,
634 GraphCondition condition,
635 cydriver.CUgraphConditionalNodeType cond_type,
636 unsigned int size,
637 type node_cls):
638 GN_check_valid(pred) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
639 if not isinstance(condition, GraphCondition): 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
640 raise TypeError(
641 f"condition must be a GraphCondition object (from "
642 f"GraphDefinition.create_condition()), got {type(condition).__name__}")
643 cdef cydriver.CUgraphNodeParams params
644 cdef cydriver.CUgraphNode new_node = NULL 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
646 c_memset(¶ms, 0, sizeof(params)) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
647 params.type = cydriver.CU_GRAPH_NODE_TYPE_CONDITIONAL 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
648 params.conditional.handle = condition._c_handle 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
649 params.conditional.type = cond_type 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
650 params.conditional.size = size 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
652 cdef cydriver.CUcontext ctx = NULL 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
653 cdef GraphHandle h_graph = graph_node_get_graph(pred._h_node) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
654 cdef cydriver.CUgraphNode pred_node = as_cu(pred._h_node) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
655 cdef cydriver.CUgraphNode* deps = NULL 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
656 cdef size_t num_deps = 0 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
658 if pred_node != NULL: 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
659 deps = &pred_node
660 num_deps = 1
662 with nogil: 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
663 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
664 params.conditional.ctx = ctx 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
666 with nogil: 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
667 IF CUDA_CORE_BUILD_MAJOR >= 13:
668 HANDLE_RETURN(cydriver.cuGraphAddNode( 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdHfIfSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
669 &new_node, as_cu(h_graph), deps, NULL, num_deps, ¶ms))
670 ELSE:
671 HANDLE_RETURN(cydriver.cuGraphAddNode(
672 &new_node, as_cu(h_graph), deps, num_deps, ¶ms))
674 cdef list branch_list = [] 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
675 cdef unsigned int i
676 cdef cydriver.CUgraph bg
677 cdef GraphHandle h_branch
678 for i in range(size): 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
679 bg = params.conditional.phGraph_out[i] 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
680 h_branch = create_child_graph_handle(bg, h_graph, new_node) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
681 branch_list.append(GraphDefinition._from_handle(h_branch)) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
682 cdef tuple branches = tuple(branch_list) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
684 cdef ConditionalNode n = node_cls.__new__(node_cls) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
685 n._h_node = create_graph_node_handle(new_node, h_graph) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
686 n._condition = condition 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
687 n._cond_type = cond_type 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
688 n._branches = branches 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
690 return _registered(n) 2acudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdC D E F L M N O Q R S T Vc'd(d)d*d+d,d-d.d/d:d;d=da ?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteue
692cdef inline GraphNode GN_create(GraphHandle h_graph, cydriver.CUgraphNode node):
693 cdef GraphNodeHandle h_node = create_graph_node_handle(node, h_graph) 2{b=g|b?gacghhhihjhccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z ubrb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 Ccobpb@cDcEc{c|cDfEf!g
695 # Sentinel: virtual node to represent the graph entry point.
696 if node == NULL: 2{b=g|b?gacghhhihjhccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z ubrb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 Ccobpb@cDcEc{c|cDfEf!g
697 n = GraphNode.__new__(GraphNode)
698 (<GraphNode>n)._h_node = h_node
699 (<GraphNode>n)._is_entry = True
700 return n
702 # Return a registered object or create and register a new one.
703 registered = _node_registry.get(<uintptr_t>h_node.get()) 2{b=g|b?gacghhhihjhccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z ubrb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 Ccobpb@cDcEc{c|cDfEf!g
704 if registered is not None: 2{b=g|b?gacghhhihjhccofwbxbybxfyfzf@gJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z ubrb2 tbVcsbPbmbU P K ~ Afwf'ey abndBf3 Ccobpb@cDcEc{c|cDfEf!g
705 return <GraphNode>registered 2{b|bacghhhihjhofwbxbybxfyfzfJfKf#gLfMfNf$g%g'gOfFfPfQfRfSf(g)gkhlhmhnhohphTfUf*gVfWfXfYf+g,g-g.gZfGf0f1f2f3f/g:g4f5f6f7f8f9f!f#f$f%f'f(fqhrhshthuhvh^g_g`g{g|g}g~gahCfAbubmbU P K ~ Afwf'ey abndBf3
706 else:
707 return _registered(GN_create_impl(h_node)) 2{b=g|b?gcc@gJfKfLfMfNfOfFfPfQfRfSfTfUfVfWfXfYfZfGf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(fC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z rb2 tbVcsbPby Ccobpb@cDcEc{c|cDfEf!g
710cdef inline GraphNode GN_create_impl(GraphNodeHandle h_node):
711 cdef cydriver.CUgraphNodeType node_type
712 with nogil: 2{b=g|b?gcc@gJfKfLfMfNfOfFfPfQfRfSfTfUfVfWfXfYfZfGf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(fC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z rb2 tbVcsbPby Ccobpb@cDcEc{c|cDfEf!g
713 HANDLE_RETURN(cydriver.cuGraphNodeGetType(as_cu(h_node), &node_type)) 2{b=g|b?gcc@gJfKfLfMfNfOfFfPfQfRfSfTfUfVfWfXfYfZfGf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(fC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z rb2 tbVcsbPby Ccobpb@cDcEc{c|cDfEf!g
715 if node_type == cydriver.CU_GRAPH_NODE_TYPE_EMPTY: 2{b=g|b?gcc@gJfKfLfMfNfOfFfPfQfRfSfTfUfVfWfXfYfZfGf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(fC D E F vf! qb} L M N O Q R S T nb1 TcUcV f z rb2 tbVcsbPby Ccobpb@cDcEc{c|cDfEf!g
716 return EmptyNode._create_impl(h_node) 2FfGf#f
717 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_KERNEL:
718 return KernelNode._create_from_driver(h_node) 2{b=g|b?g@gC D E F ! 2 y
719 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_MEM_ALLOC:
720 return AllocNode._create_from_driver(h_node) 2JfKfLfMfNfOfFfPfQfRfSfTfUfVfWfXfYfZfGf0f1f2f3f4f5f6f7f8f9f!f$f%f'f(fnb1
721 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_MEM_FREE:
722 return FreeNode._create_from_driver(h_node) 1V
723 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_MEMSET:
724 return MemsetNode._create_from_driver(h_node) 1y
725 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_MEMCPY:
726 return MemcpyNode._create_from_driver(h_node) 2f z @c{c|cDfEf!g
727 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_GRAPH:
728 return ChildGraphNode._create_from_driver(h_node) 2vfqb} rb2 sbPb
729 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_EVENT_RECORD:
730 return EventRecordNode._create_from_driver(h_node) 2Tc
731 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_WAIT_EVENT:
732 return EventWaitNode._create_from_driver(h_node) 2Uc
733 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_HOST:
734 return HostCallbackNode._create_from_driver(h_node) 2ccvfqb} rbtbsbPbCcobpbDcEc
735 elif node_type == cydriver.CU_GRAPH_NODE_TYPE_CONDITIONAL:
736 return ConditionalNode._create_from_driver(h_node) 2L M N O Q R S T Vc
737 else:
738 n = GraphNode.__new__(GraphNode)
739 (<GraphNode>n)._h_node = h_node
740 return n
742cdef inline KernelNode GN_launch(GraphNode self, LaunchConfig conf, Kernel ker, ParamHolder ker_args):
743 cdef cydriver.CUgraphNode new_node = NULL 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
744 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
745 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
746 cdef cydriver.CUgraphNode* deps = NULL 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
747 cdef size_t num_deps = 0 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
748 cdef OpaqueHandle args_owner
749 cdef PreparedAttachment prepared
751 GN_check_valid(self) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
752 if conf.cluster is not None or conf.is_cooperative: 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
753 raise NotImplementedError( 2$d
754 "clustered or cooperative graph kernel nodes are not supported")
756 if pred_node != NULL: 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
757 deps = &pred_node 2{b|bgd4 5 6 7 8 9 mbU P K ~ y QbSbjd
758 num_deps = 1 2{b|bgd4 5 6 7 8 9 mbU P K ~ y QbSbjd
760 cdef cydriver.CUDA_KERNEL_NODE_PARAMS node_params = cydriver.CUDA_KERNEL_NODE_PARAMS(
761 kern=as_cu(ker._h_kernel), 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
762 func=<cydriver.CUfunction>NULL, 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
763 gridDimX=conf.grid[0], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
764 gridDimY=conf.grid[1], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
765 gridDimZ=conf.grid[2], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
766 blockDimX=conf.block[0], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
767 blockDimY=conf.block[1], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
768 blockDimZ=conf.block[2], 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
769 sharedMemBytes=conf.shmem_size, 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
770 kernelParams=<void**><uintptr_t>(ker_args.ptr), 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
771 extra=NULL, 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
772 ctx=<cydriver.CUcontext>NULL, 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
773 )
775 # Keep the kernel and argument objects alive because CUDA copies argument
776 # values but does not retain the resources they reference.
777 cdef OpaqueHandle kernel_owner = ker._h_kernel 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
778 kernel_args = ker_args.kernel_args 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
779 if kernel_args is not None: 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
780 args_owner = make_opaque_py(kernel_args) 2{btd|bWdXdmbU P K ~ y QbYdZd0d1d2d3d.b/b:b5d6d7d8d9d!dSb%djd
781 HANDLE_RETURN(graph_prepare_attachment( 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
782 h_graph, kernel_owner, args_owner, &prepared))
784 with nogil: 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
785 HANDLE_RETURN(cydriver.cuGraphAddKernelNode( 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
786 &new_node, as_cu(h_graph), deps, num_deps, &node_params))
788 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
790 return _registered(KernelNode._create_with_params( 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
791 create_graph_node_handle(new_node, h_graph), 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
792 conf.grid, conf.block, conf.shmem_size, 2{btd|bIbvewexeyezegdAeJb4 Kb5 Lb6 Mb7 Nb8 Ob9 BeC D E F ! WdXdCeubDeEe2 mbU P K ~ y QbYdZd0d1d2d3d.b/b:bXcYcZcHeIeJe4d5d6d7dvb8d9d!dSb#d$d%djdTbKeUbLeVbMea WbNeXbOeYbPeZbQe0bRe1bSe2bTe3bUe
793 ker._h_kernel))
796cdef inline EmptyNode GN_join(GraphNode self, tuple nodes):
797 cdef vector[cydriver.CUgraphNode] deps
798 cdef cydriver.CUgraphNode new_node = NULL 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
799 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
800 cdef GraphNode other
801 cdef cydriver.CUgraphNode* deps_ptr = NULL 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
802 cdef size_t num_deps = 0 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
803 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
805 GN_check_valid(self) 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
806 if pred_node != NULL: 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
807 deps.push_back(pred_node) 24b5b6b7b8b9bAbEb
808 for other in nodes: 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
809 GN_check_valid(other) 24bbcb c d e wbxbybdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byc9bzcf mbU P K ~ EbFcm Gcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
810 if as_cu((<GraphNode>other)._h_node) != NULL: 24bbcb c d e wbxbybdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byc9bzcf mbU P K ~ Fcm Gcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
811 deps.push_back(as_cu((<GraphNode>other)._h_node)) 24bbcb c d e wbxbybdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byc9bzcf mbU P K ~ Fcm Gcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
813 num_deps = deps.size() 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
814 if num_deps > 0: 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
815 deps_ptr = deps.data() 24bbcb c d e wbxbybdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byc9bzcAbf mbU P K ~ Fcm Gcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
817 with nogil: 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
818 HANDLE_RETURN(cydriver.cuGraphAddEmptyNode( 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
819 &new_node, as_cu(h_graph), deps_ptr, num_deps))
821 return _registered(EmptyNode._create_impl(create_graph_node_handle(new_node, h_graph))) 26g7g4bbcofb c d e wbxbybxfyfzfdcg gch 5bjc6bkclci ocj rck ucl 7bxc8byctf9bzcCfAb8g9gf mbU P K ~ 3gAfwf'e4gEbndBf5gvb(e)e*eFcm lfGcn Hco a Icp Jcq Kcr Lcs Mct Ncu Ocv Pcw
824cdef inline AllocNode GN_alloc(GraphNode self, size_t size, object device,
825 object memory_type, object peer_access):
826 cdef int device_id
827 cdef cydriver.CUdevice dev
829 GN_check_valid(self) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
830 if device is None: 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
831 with nogil: 2Rcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnbV f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
832 HANDLE_RETURN(cydriver.cuCtxGetDevice(&dev)) 2Rcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnbV f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
833 device_id = <int>dev 2Rcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnbV f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
834 else:
835 device_id = getattr(device, 'device_id', device) 2mfnf1
837 cdef cydriver.CUDA_MEM_ALLOC_NODE_PARAMS alloc_params
838 cdef cydriver.CUgraphNode new_node = NULL 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
839 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
840 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
841 cdef cydriver.CUgraphNode* deps = NULL 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
842 cdef size_t num_deps = 0 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
844 if pred_node != NULL: 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
845 deps = &pred_node 2RcVe4bWeXe~cYeadZe5b0e1e6b2e3ebd4ecd5edd6eed7e7b8e9e8b!e#e9b$e
846 num_deps = 1 2RcVe4bWeXe~cYeadZe5b0e1e6b2e3ebd4ecd5edd6eed7e7b8e9e8b!e#e9b$e
848 cdef vector[cydriver.CUmemAccessDesc] access_descs
849 cdef cydriver.CUmemAccessDesc access_desc
850 cdef int peer_id
851 cdef list peer_ids = [] 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
853 if peer_access is not None: 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
854 for peer_dev in peer_access: 11
855 peer_id = getattr(peer_dev, 'device_id', peer_dev) 11
856 peer_ids.append(peer_id) 11
857 access_desc.location = cumemlocation_from_id( 11
858 cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE, peer_id)
859 access_desc.flags = cydriver.CUmemAccess_flags.CU_MEM_ACCESS_FLAGS_PROT_READWRITE 11
860 access_descs.push_back(access_desc) 11
862 cdef str memory_type_str = "device" if memory_type is None else str(memory_type) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
864 c_memset(&alloc_params, 0, sizeof(alloc_params)) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
865 alloc_params.poolProps.handleTypes = cydriver.CUmemAllocationHandleType.CU_MEM_HANDLE_TYPE_NONE 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
866 alloc_params.bytesize = size 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
868 check_str_enum(memory_type_str, GraphMemoryType) 2mfnfRcsf)fuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
869 if memory_type_str == "device": 2mfnfRcsfuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
870 alloc_params.poolProps.allocType = cydriver.CUmemAllocationType.CU_MEM_ALLOCATION_TYPE_PINNED 2mfnfRcuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBc1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
871 alloc_params.poolProps.location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE 2mfnfRcuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBc1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
872 alloc_params.poolProps.location.id = device_id 2mfnfRcuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBc1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
873 elif memory_type_str == "host": 2sf~cadbdcdddednb
874 alloc_params.poolProps.allocType = cydriver.CUmemAllocationType.CU_MEM_ALLOCATION_TYPE_PINNED 2sf
875 alloc_params.poolProps.location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_HOST 2sf
876 alloc_params.poolProps.location.id = 0 2sf
877 elif memory_type_str == "managed": 2~cadbdcdddednb
878 IF CUDA_CORE_BUILD_MAJOR >= 13:
879 alloc_params.poolProps.allocType = cydriver.CUmemAllocationType.CU_MEM_ALLOCATION_TYPE_MANAGED 2~cadbdcdddednb
880 alloc_params.poolProps.location.type = cydriver.CUmemLocationType.CU_MEM_LOCATION_TYPE_DEVICE 2~cadbdcdddednb
881 alloc_params.poolProps.location.id = device_id 2~cadbdcdddednb
882 ELSE:
883 raise ValueError("memory_type='managed' requires CUDA 13.0 or later")
885 if access_descs.size() > 0: 2mfnfRcsfuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
886 alloc_params.accessDescs = access_descs.data() 11
887 alloc_params.accessDescCount = access_descs.size() 11
889 with nogil: 2mfnfRcsfuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
890 HANDLE_RETURN(cydriver.cuGraphAddMemAllocNode( 2mfnfRcsfuf+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
891 &new_node, as_cu(h_graph), deps, num_deps, &alloc_params))
893 return _registered(AllocNode._create_with_params( 2mfnfRc+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
894 create_graph_node_handle(new_node, h_graph), alloc_params.dptr, size, 2mfnfRc+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
895 device_id, memory_type_str, tuple(peer_ids))) 2mfnfRc+e,e-eVe4b.ebcWe/eWc0c1c2c3cb c d e G H I J :e;e=ewbxbybXe~cdcecfc4c4 g # $ % ' Yeadgchcic5c5 h ( ) * + Ze5b?ejc0e@e1e6b[ekc2e]e3ebdlcmcnc6c6 i , - . / 4ecdocpcqc7c7 j : ; = ? 5eddrcsctc8c8 k @ [ ] ^ 6eeducvcwc9c9 l _ ` { | 7e7b^exc8e_e9e8b`eyc!e{e#e9b|ezc$e}eAbfd~eAcBcnb1 V f 3 afFc!cm bbbfGc#cn cbcfHc$co dba dfIc%cp ebefJc'cq fbffKc(cr gbgfLc)cs hbhfMc*ct ibifNc+cu jbjfOc,cv kbkfPc-cw lb
898cdef inline FreeNode GN_free(GraphNode self, cydriver.CUdeviceptr c_dptr):
899 cdef cydriver.CUgraphNode new_node = NULL 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
900 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
901 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
902 cdef cydriver.CUgraphNode* deps = NULL 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
903 cdef size_t num_deps = 0 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
905 GN_check_valid(self) 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
906 if pred_node != NULL: 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
907 deps = &pred_node 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9cV !c#c$ca %c'c(c)c*c+c,c-c
908 num_deps = 1 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9cV !c#c$ca %c'c(c)c*c+c,c-c
910 with nogil: 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
911 HANDLE_RETURN(cydriver.cuGraphAddMemFreeNode( 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9c[gV !c#c$ca %c'c(c)c*c+c,c-c
912 &new_node, as_cu(h_graph), deps, num_deps, c_dptr))
914 return _registered(FreeNode._create_with_params(create_graph_node_handle(new_node, h_graph), c_dptr)) 2RcWc0c1c2c3cb c d e G H I J 4c5c6c7c8c9cV !c#c$ca %c'c(c)c*c+c,c-c
917cdef inline OpaqueHandle _buffer_attachment_owner(Buffer buf, str label):
918 """Copy a Buffer's device-pointer handle into an attachment owner."""
919 Buffer_check_open(buf) 2z W X 'b;g(b)b*b]gDb}b~b:c;c(h+h}c+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
920 # The local is required: Cython permits the DevicePtrHandle -> OpaqueHandle
921 # conversion on assignment, but not directly in a return statement.
922 cdef OpaqueHandle attachment_owner = buf._h_ptr 2z W X 'b;g(b)b*bDb}b~b:c;c}c+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
923 return attachment_owner 2z W X 'b;g(b)b*bDb}b~b:c;c}c+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
926cdef inline OpaqueHandle _resolve_memcpy_operand(
927 object operand, object owner, str side,
928 cydriver.CUdeviceptr* out_ptr) except *:
929 """Resolve an operand to a pointer and optional attachment owner.
931 ``operand`` is a :class:`Buffer` or a raw integer address; its device
932 pointer is written to ``out_ptr``. For a :class:`Buffer` operand, returns an
933 owner that retains the underlying allocation (not the wrapper). For a raw
934 pointer, returns an owner built from ``owner`` (or an empty handle when
935 ``owner`` is ``None``).
937 Raises
938 ------
939 ValueError
940 If ``operand`` is a :class:`Buffer` and ``owner`` is not ``None``.
941 If a :class:`Buffer` operand or ``*_owner`` has no active allocation.
942 """
943 cdef Buffer buf
944 cdef OpaqueHandle attachment_owner
946 if isinstance(operand, Buffer): 2b c d e G H I J g # $ % ' h ( ) * + i , - . / j : ; = ? k @ [ ] ^ l _ ` { | fdSczbf z W X 'b|h;g(b)b*b]gDb}b~b:c;c(h+h}cy ab+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x m bbn cbo dba p ebq fbr gbs hbt ibu jbv kbw lb
947 if owner is not None: 2z 'b|h;g(b)b*bDb:c;c+h+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
948 raise ValueError( 2|h;g
949 f"{side}_owner cannot be used when {side} is a Buffer" 2|h;g
950 )
951 buf = operand 2z 'b;g(b)b*bDb:c;c+h+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
952 attachment_owner = _buffer_attachment_owner(buf, side) 2z 'b;g(b)b*bDb:c;c+h+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
953 out_ptr[0] = as_cu(buf._h_ptr) 2z 'b;g(b)b*bDb:c;c+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
954 return attachment_owner 2z 'b;g(b)b*bDb:c;c+b,b-b=c?c!b#b$b.c/cY Z 0 BbCb@c;b[c=b?b@b]c^c[b]b^b_c`c_b`b{c|cDfEf%bA B x
955 out_ptr[0] = <cydriver.CUdeviceptr><uintptr_t>operand 2b c d e G H I J g # $ % ' h ( ) * + i , - . / j : ; = ? k @ [ ] ^ l _ ` { | fdSczbf W X ]gDb}b~b(h}cy ab!b#b$b.c/cm bbn cbo dba p ebq fbr gbs hbt ibu jbv kbw lb
956 if owner is None: 2b c d e G H I J g # $ % ' h ( ) * + i , - . / j : ; = ? k @ [ ] ^ l _ ` { | fdSczbf W X ]gDb}b~b(h}cy abm bbn cbo dba p ebq fbr gbs hbt ibu jbv kbw lb
957 return OpaqueHandle() 2b c d e G H I J g # $ % ' h ( ) * + i , - . / j : ; = ? k @ [ ] ^ l _ ` { | fdf ]gy abm bbn cbo dba p ebq fbr gbs hbt ibu jbv kbw lb
958 if isinstance(owner, Buffer): 2SczbW X ]gDb}b~b(h}c
959 return _buffer_attachment_owner(owner, f"{side}_owner") 2W X ]gDb}b~b(h}c
960 return make_opaque_py(owner) 2Sczb
963cdef inline MemsetNode GN_memset(
964 GraphNode self, cydriver.CUdeviceptr c_dst, OpaqueHandle dst_owner,
965 unsigned int val, unsigned int elem_size,
966 size_t width, size_t height, size_t pitch):
967 cdef cydriver.CUgraphNode new_node = NULL 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
968 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
969 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
970 cdef cydriver.CUgraphNode* deps = NULL 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
971 cdef size_t num_deps = 0 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
972 cdef PreparedAttachment prepared
974 GN_check_valid(self) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
975 if pred_node != NULL: 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
976 deps = &pred_node 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | y abbbcbdba ebfbgbhbibjbkblb
977 num_deps = 1 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | y abbbcbdba ebfbgbhbibjbkblb
979 cdef cydriver.CUcontext ctx = NULL 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
980 with nogil: 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
981 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
983 cdef cydriver.CUDA_MEMSET_NODE_PARAMS memset_params = cydriver.CUDA_MEMSET_NODE_PARAMS(
984 dst=c_dst, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
985 pitch=pitch, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
986 value=val, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
987 elementSize=elem_size, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
988 width=width, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
989 height=height, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
990 )
992 if dst_owner: 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
993 HANDLE_RETURN(graph_prepare_attachment( 2:c;c}c=c?c.c/cBbCb[c]c^c_c`cA B x
994 h_graph, dst_owner, OpaqueHandle(), &prepared))
996 with nogil: 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
997 HANDLE_RETURN(cydriver.cuGraphAddMemsetNode( 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
998 &new_node, as_cu(h_graph), deps, num_deps,
999 &memset_params, ctx))
1001 if dst_owner: 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
1002 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2:c;c}c=c?c.c/cBbCb[c]c^c_c`cA B x
1004 return _registered(MemsetNode._create_with_params( 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
1005 create_graph_node_handle(new_node, h_graph), c_dst, 2b c d e G H I J # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | :c;c}cy ab=c?c.c/cBbCb[c]c^c_c`cA B x bbcbdba ebfbgbhbibjbkblb
1006 val, elem_size, width, height, pitch))
1009cdef cydriver.CUmemorytype _get_memcpy_memory_type(
1010 cydriver.CUdeviceptr ptr) except *:
1011 cdef unsigned int memory_type = cydriver.CU_MEMORYTYPE_DEVICE 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1012 cdef cydriver.CUresult ret
1013 with nogil: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1014 ret = cydriver.cuPointerGetAttribute( 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1015 &memory_type,
1016 cydriver.CU_POINTER_ATTRIBUTE_MEMORY_TYPE,
1017 ptr)
1018 if ret != cydriver.CUDA_SUCCESS and ret != cydriver.CUDA_ERROR_INVALID_VALUE: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1019 HANDLE_RETURN(ret)
1020 return <cydriver.CUmemorytype>memory_type 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1023cdef void _init_memcpy_params(
1024 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t size,
1025 cydriver.CUDA_MEMCPY3D* params, cydriver.CUmemorytype* dst_type,
1026 cydriver.CUmemorytype* src_type) except *:
1027 dst_type[0] = _get_memcpy_memory_type(dst) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1028 src_type[0] = _get_memcpy_memory_type(src) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1030 c_memset(params, 0, sizeof(params[0])) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1031 params.srcMemoryType = src_type[0] 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1032 params.dstMemoryType = dst_type[0] 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1033 if src_type[0] == cydriver.CU_MEMORYTYPE_HOST: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1034 params.srcHost = <void*><uintptr_t>src 2z +b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b{c|c%bA B x
1035 else:
1036 params.srcDevice = src 2b c d e g h i j k l Sczbf W X 'b(b)b*bDb}b~b@cm n o a p q r s t u v w
1037 if dst_type[0] == cydriver.CU_MEMORYTYPE_HOST: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1038 params.dstHost = <void*><uintptr_t>dst 2z +b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x
1039 else:
1040 params.dstDevice = dst 2b c d e g h i j k l Sczbf W X 'b(b)b*bDb}b~b@c{c|cm n o a p q r s t u v w
1041 params.WidthInBytes = size 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1042 params.Height = 1 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1043 params.Depth = 1 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 @c;b=b?b@b[b]b^b_b`b{c|c%bA B x m n o a p q r s t u v w
1046cdef inline MemcpyNode GN_memcpy(
1047 GraphNode self, cydriver.CUdeviceptr c_dst, OpaqueHandle dst_owner,
1048 cydriver.CUdeviceptr c_src, OpaqueHandle src_owner, size_t size):
1049 cdef cydriver.CUDA_MEMCPY3D params
1050 cdef cydriver.CUmemorytype c_dst_type
1051 cdef cydriver.CUmemorytype c_src_type
1052 _init_memcpy_params( 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1053 c_dst, c_src, size, ¶ms, &c_dst_type, &c_src_type)
1055 cdef cydriver.CUgraphNode new_node = NULL 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1056 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1057 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1058 cdef cydriver.CUgraphNode* deps = NULL 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1059 cdef size_t num_deps = 0 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1060 cdef PreparedAttachment prepared
1062 GN_check_valid(self) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1063 if pred_node != NULL: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1064 deps = &pred_node 1bcdeghijklfmnoapqrstuvw
1065 num_deps = 1 1bcdeghijklfmnoapqrstuvw
1067 cdef cydriver.CUcontext ctx = NULL 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1068 if dst_owner or src_owner: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1069 HANDLE_RETURN(graph_prepare_attachment( 2Sczbz W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x
1070 h_graph, dst_owner, src_owner, &prepared))
1072 with nogil: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1073 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1074 HANDLE_RETURN(cydriver.cuGraphAddMemcpyNode( 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1075 &new_node, as_cu(h_graph), deps, num_deps, ¶ms, ctx))
1077 if dst_owner or src_owner: 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1078 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2Sczbz W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x
1080 return _registered(MemcpyNode._create_with_params( 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1081 create_graph_node_handle(new_node, h_graph), c_dst, c_src, size, 2b c d e g h i j k l Sczbf z W X 'b(b)b*bDb}b~b+b,b-b!b#b$bY Z 0 ;b=b?b@b[b]b^b_b`b%bA B x m n o a p q r s t u v w
1082 c_dst_type, c_src_type))
1085cdef inline ChildGraphNode GN_embed(GraphNode self, GraphDefinition child_def):
1086 cdef cydriver.CUgraphNode new_node = NULL 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1087 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1088 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1089 cdef cydriver.CUgraphNode* deps = NULL 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1090 cdef size_t num_deps = 0 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1091 cdef cydriver.CUresult rollback_status
1093 GN_check_valid(self) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1094 GD_check_valid(child_def) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1095 if pred_node != NULL: 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1096 deps = &pred_node 2Eb
1097 num_deps = 1 2Eb
1099 with nogil: 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1100 HANDLE_RETURN(cydriver.cuGraphAddChildGraphNode( 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1101 &new_node, as_cu(h_graph), deps, num_deps, as_cu(child_def._h_graph)))
1103 cdef cydriver.CUgraph embedded_graph = NULL 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1104 cdef GraphHandle h_embedded
1105 try: 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1106 with nogil: 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1107 HANDLE_RETURN(cydriver.cuGraphChildGraphNodeGetGraph( 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1108 new_node, &embedded_graph))
1109 h_embedded = create_child_graph_handle( 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1110 embedded_graph, h_graph, new_node)
1111 HANDLE_RETURN(graph_clone_attachments( 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1112 h_embedded, child_def._h_graph))
1113 except:
1114 with nogil:
1115 rollback_status = cydriver.cuGraphDestroyNode(new_node)
1116 if rollback_status == cydriver.CUDA_SUCCESS:
1117 invalidate_child_graph_state(h_graph, new_node)
1118 else:
1119 # The original exception propagates with the failed rollback
1120 # attached as a note (error handling policy).
1121 attach_rollback_failure(
1122 b"cuGraphDestroyNode", rollback_status,
1123 b"failed while rolling back a child graph node; the node remains in the graph")
1124 raise
1126 return _registered(ChildGraphNode._create_with_params( 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1127 create_graph_node_handle(new_node, h_graph), h_embedded)) 2ccIbJbKbLbMbNbOb! qb%e} Qcrb2 tbsbPbEbhdCcidRbDcEcTbUbVba WbXbYbZb0b1b2b3b
1130cdef inline EventRecordNode GN_record_event(GraphNode self, Event ev):
1131 GN_check_valid(self) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1132 Event_check_open(ev) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1133 cdef cydriver.CUgraphNode new_node = NULL 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1134 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1135 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1136 cdef cydriver.CUgraphNode* deps = NULL 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1137 cdef size_t num_deps = 0 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1138 cdef PreparedAttachment prepared
1140 if pred_node != NULL: 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1141 deps = &pred_node 2echcmcpcscvcAcnb1 UcV f z ubodFbpdobrdGbsdHb
1142 num_deps = 1 2echcmcpcscvcAcnb1 UcV f z ubodFbpdobrdGbsdHb
1144 cdef OpaqueHandle owner = ev._h_event 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1145 HANDLE_RETURN(graph_prepare_attachment( 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1146 h_graph, owner, OpaqueHandle(), &prepared))
1148 with nogil: 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1149 HANDLE_RETURN(cydriver.cuGraphAddEventRecordNode( 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1150 &new_node, as_cu(h_graph), deps, num_deps, as_cu(ev._h_event)))
1152 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1154 return _registered(EventRecordNode._create_with_params( 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1155 create_graph_node_handle(new_node, h_graph), ev._h_event)) 2kdechcmcpcscvcegAcfgldmdnb1 TcUcV f z ubodFbpdobrdGbsdHbwgzgCga FgIgLgOgRgUgXg0g
1158cdef inline EventWaitNode GN_wait_event(GraphNode self, Event ev):
1159 GN_check_valid(self) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1160 Event_check_open(ev) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1161 cdef cydriver.CUgraphNode new_node = NULL 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1162 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1163 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1164 cdef cydriver.CUgraphNode* deps = NULL 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1165 cdef size_t num_deps = 0 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1166 cdef PreparedAttachment prepared
1168 if pred_node != NULL: 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1169 deps = &pred_node 2kdfcicncqctcwcldmdBcTc
1170 num_deps = 1 2kdfcicncqctcwcldmdBcTc
1172 cdef OpaqueHandle owner = ev._h_event 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1173 HANDLE_RETURN(graph_prepare_attachment( 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1174 h_graph, owner, OpaqueHandle(), &prepared))
1176 with nogil: 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1177 HANDLE_RETURN(cydriver.cuGraphAddEventWaitNode( 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1178 &new_node, as_cu(h_graph), deps, num_deps, as_cu(ev._h_event)))
1180 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1182 return _registered(EventWaitNode._create_with_params( 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1183 create_graph_node_handle(new_node, h_graph), ev._h_event)) 2kdfcicncqctcwcldmdBcggTcUcFbqdpbGbHbxgAgDga GgJgMgPgSgVgYg1g
1186cdef inline HostCallbackNode GN_callback(GraphNode self, object fn, object user_data):
1187 cdef cydriver.CUDA_HOST_NODE_PARAMS node_params
1188 cdef cydriver.CUgraphNode new_node = NULL 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1189 cdef GraphHandle h_graph = graph_node_get_graph(self._h_node) 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1190 cdef cydriver.CUgraphNode pred_node = as_cu(self._h_node) 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1191 cdef cydriver.CUgraphNode* deps = NULL 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1192 cdef size_t num_deps = 0 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1193 cdef OpaqueHandle fn_owner, data_owner
1194 cdef PreparedAttachment prepared
1196 GN_check_valid(self) 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1197 if pred_node != NULL: 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1198 deps = &pred_node 2W X 3 FbqdpbGbHb
1199 num_deps = 1 2W X 3 FbqdpbGbHb
1201 _resolve_host_callback( 2+f,f-f.f/fbhchdheh:fccfh;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1202 fn, user_data, &node_params.fn, &node_params.userData,
1203 &fn_owner, &data_owner)
1204 HANDLE_RETURN(graph_prepare_attachment( 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1205 h_graph, fn_owner, data_owner, &prepared))
1207 with nogil: 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1208 HANDLE_RETURN(cydriver.cuGraphAddHostNode( 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1209 &new_node, as_cu(h_graph), deps, num_deps, &node_params))
1211 HANDLE_RETURN(graph_commit_attachment(prepared, new_node)) 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1213 cdef object callable_obj = fn if not isinstance(fn, ct._CFuncPtr) else None 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1214 return _registered(HostCallbackNode._create_with_params( 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1215 create_graph_node_handle(new_node, h_graph), callable_obj, 2+f,f-f.f/f:fcc;f=f?f@f[f]f^f_f`f{f|f}f~fagbgpfqfcgdgqb} QcL M N O Q R S T W X rbrftbhgsbPbig3 hdQb*fCcodFbjgkgidpdqdlgmgRbobpbFeGengDcrdGbogpgqgEcsdHbrgsg(eSbtgug)e*evgygBgEga HgKgNgQgTgWgZg2g
1216 node_params.fn, node_params.userData))