Coverage for cuda / core / graph / _graph_definition.pyx: 93.22%
118 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5"""GraphDefinition: explicit CUDA graph definition."""
7from __future__ import annotations
9from libc.stddef cimport size_t
11from libcpp.vector cimport vector
13from cuda.bindings cimport cydriver
15from cuda.core.graph._graph_node cimport GraphNode
16from cuda.core._resource_handles cimport (
17 GraphHandle,
18 as_cu,
19 as_intptr,
20 as_py,
21 create_graph_handle,
22 create_graph_node_handle,
23)
24from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
26from dataclasses import dataclass
28from cuda.core._utils.cuda_utils import driver
31cdef class GraphCondition:
32 """A condition variable for conditional graph nodes.
34 Created by :meth:`GraphDefinition.create_condition` and passed to
35 conditional-node builder methods (``if_cond``, ``if_else``,
36 ``while_loop``, ``switch``). The underlying value is set at
37 runtime by device code via ``cudaGraphSetConditional``.
38 """
40 def __repr__(self) -> str:
41 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2Od
43 def __eq__(self, other) -> bool:
44 if not isinstance(other, GraphCondition): 2ymzmAmBmvdEdddMbNbedfdgdhdt u idObjdndv w FdGdHdwdIdJdKdLdMdAdBd
45 return NotImplemented 2vdEdddMbNbedfdgdhdt u idObjdndv w FdGdHdwdIdJdKdLd
46 return self._c_handle == (<GraphCondition>other)._c_handle 2ymzmAmBmvdMdAdBd
48 def __hash__(self) -> int:
49 return hash(<unsigned long long>self._c_handle) 2PdQdodkdldpdqdrdsdZ 0 tdmdudxd1 2 RdSdTdNdUdVdWdXdYdZd0dAdBd
51 @property
52 def handle(self) -> driver.CUgraphConditionalHandle:
53 """The raw CUgraphConditionalHandle as an int."""
54 return <unsigned long long>self._c_handle 2vd
57@dataclass
58class GraphAllocOptions:
59 """Options for graph memory allocation nodes.
61 Attributes
62 ----------
63 device : int or Device, optional
64 The device on which to allocate memory. If None (default),
65 uses the current CUDA context's device.
66 memory_type : str, optional
67 Type of memory to allocate. One of:
69 - ``"device"`` (default): Pinned device memory, optimal for GPU kernels.
70 - ``"host"``: Pinned host memory, accessible from both host and device.
71 Useful for graphs containing host callback nodes. Note: may not be
72 supported on all systems/drivers.
73 - ``"managed"``: Managed/unified memory that automatically migrates
74 between host and device. Useful for mixed host/device access patterns.
76 peer_access : list of int or Device, optional
77 List of devices that should have read-write access to the
78 allocated memory. If None (default), only the allocating
79 device has access.
81 Notes
82 -----
83 - IPC (inter-process communication) is not supported for graph
84 memory allocation nodes per CUDA documentation.
85 - The allocation uses the device's default memory pool.
86 """
88 device: int | "Device" | None = None
89 memory_type: str = "device"
90 peer_access: list | None = None
93cdef class GraphDefinition:
94 """A graph definition.
96 A GraphDefinition is used to construct a graph explicitly by adding nodes
97 and specifying dependencies. Once construction is complete, call
98 instantiate() to obtain an executable Graph.
99 """
101 def __init__(self):
102 """Create a new empty graph definition."""
103 cdef cydriver.CUgraph graph = NULL 2QlRlSlTlUlVlWlXlYlBgCgDgZlFeEgFg0l1l2l3l4lr 5l6l7l8l6d9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gdmMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhydemfmgmhm4dim3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5evd6e5h6h7h8h9h%b'b!h7e#hek(b)b$h8ePd9e%h'h(hul)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)eQd*e/h:h;hvl=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,eRd-e]h^h_hwl`h=b?b{h.e|hhk@b[b}h/eSd:e~haibixlci]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]eTd^egihiiiylji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbeNdcedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfUdkfpiqirizlsiacbctilfuikkccdcmfnfofpfqf` { eerf| } visfVdtfwixiyiAlziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfWdAfDiEiFiBlGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfXdGfRiSiTiClUiqcrcViHfWinksctcdbXiIfYdJfYiZi0iDl1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfEdRf7i8i9ikl!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfFdUf'i(i)ill*iCcDc+iVf,iqkEcFc-iWfGdXf.i/i:iml;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3fHd4f[i]i^inl_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-dwd.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'fId(f~iajbjolcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:fJd;fgjhjijpljjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^fKd_fnjojpjqlqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fLdagBjCjDjrlEj4c5cFjbgGjwk6c7cLbHjcgOddgIjJjKjElLj8c9cMjegNjxk!c#cOjfgMdggPjQjRjslSj$c%cTjhgUjyk'c(cVjigZdjgWjXjYjFlZj)c*c0jkg1jzk+c,c2jlg0dmg3j4j5jGl6j-c.c7jng8jAk/c:c9jogAdpg!j#j$jBk%j;c=c'jqg(jCk?c@c)jrgBdsg*j+j,jDk-j[c]c.jtg/jEk^c_c:jug1dvg;j=j?jjm@j`c{c[jwg]jFk|c}c^jxg2dyg_j`j{jkm|j~cad}jzg~jGkbdcd
104 with nogil: 2QlRlSlTlUlVlWlXlYlBgCgDgZlFeEgFg0l1l2l3l4lr 5l6l7l8l6d9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gdmMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhydemfmgmhm4dim3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5evd6e5h6h7h8h9h%b'b!h7e#hek(b)b$h8ePd9e%h'h(hul)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)eQd*e/h:h;hvl=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,eRd-e]h^h_hwl`h=b?b{h.e|hhk@b[b}h/eSd:e~haibixlci]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]eTd^egihiiiylji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbeNdcedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfUdkfpiqirizlsiacbctilfuikkccdcmfnfofpfqf` { eerf| } visfVdtfwixiyiAlziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfWdAfDiEiFiBlGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfXdGfRiSiTiClUiqcrcViHfWinksctcdbXiIfYdJfYiZi0iDl1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfEdRf7i8i9ikl!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfFdUf'i(i)ill*iCcDc+iVf,iqkEcFc-iWfGdXf.i/i:iml;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3fHd4f[i]i^inl_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-dwd.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'fId(f~iajbjolcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:fJd;fgjhjijpljjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^fKd_fnjojpjqlqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fLdagBjCjDjrlEj4c5cFjbgGjwk6c7cLbHjcgOddgIjJjKjElLj8c9cMjegNjxk!c#cOjfgMdggPjQjRjslSj$c%cTjhgUjyk'c(cVjigZdjgWjXjYjFlZj)c*c0jkg1jzk+c,c2jlg0dmg3j4j5jGl6j-c.c7jng8jAk/c:c9jogAdpg!j#j$jBk%j;c=c'jqg(jCk?c@c)jrgBdsg*j+j,jDk-j[c]c.jtg/jEk^c_c:jug1dvg;j=j?jjm@j`c{c[jwg]jFk|c}c^jxg2dyg_j`j{jkm|j~cad}jzg~jGkbdcd
105 HANDLE_RETURN(cydriver.cuGraphCreate(&graph, 0)) 2QlRlSlTlUlVlWlXlYlBgCgDgZlFeEgFg0l1l2l3l4lr 5l6l7l8l6d9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gdmMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhydemfmgmhm4dim3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5evd6e5h6h7h8h9h%b'b!h7e#hek(b)b$h8ePd9e%h'h(hul)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)eQd*e/h:h;hvl=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,eRd-e]h^h_hwl`h=b?b{h.e|hhk@b[b}h/eSd:e~haibixlci]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]eTd^egihiiiylji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbeNdcedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfUdkfpiqirizlsiacbctilfuikkccdcmfnfofpfqf` { eerf| } visfVdtfwixiyiAlziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfWdAfDiEiFiBlGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfXdGfRiSiTiClUiqcrcViHfWinksctcdbXiIfYdJfYiZi0iDl1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfEdRf7i8i9ikl!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfFdUf'i(i)ill*iCcDc+iVf,iqkEcFc-iWfGdXf.i/i:iml;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3fHd4f[i]i^inl_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-dwd.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'fId(f~iajbjolcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:fJd;fgjhjijpljjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^fKd_fnjojpjqlqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fLdagBjCjDjrlEj4c5cFjbgGjwk6c7cLbHjcgOddgIjJjKjElLj8c9cMjegNjxk!c#cOjfgMdggPjQjRjslSj$c%cTjhgUjyk'c(cVjigZdjgWjXjYjFlZj)c*c0jkg1jzk+c,c2jlg0dmg3j4j5jGl6j-c.c7jng8jAk/c:c9jogAdpg!j#j$jBk%j;c=c'jqg(jCk?c@c)jrgBdsg*j+j,jDk-j[c]c.jtg/jEk^c_c:jug1dvg;j=j?jjm@j`c{c[jwg]jFk|c}c^jxg2dyg_j`j{jkm|j~cad}jzg~jGkbdcd
106 self._h_graph = create_graph_handle(graph) 2QlRlSlTlUlVlWlXlYlBgCgDgZlFeEgFg0l1l2l3l4lr 5l6l7l8l6d9l!l#l$l%l'l(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gdmMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhydemfmgmhm4dim3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5evd6e5h6h7h8h9h%b'b!h7e#hek(b)b$h8ePd9e%h'h(hul)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)eQd*e/h:h;hvl=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,eRd-e]h^h_hwl`h=b?b{h.e|hhk@b[b}h/eSd:e~haibixlci]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]eTd^egihiiiylji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbeNdcedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfUdkfpiqirizlsiacbctilfuikkccdcmfnfofpfqf` { eerf| } visfVdtfwixiyiAlziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfWdAfDiEiFiBlGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfXdGfRiSiTiClUiqcrcViHfWinksctcdbXiIfYdJfYiZi0iDl1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfEdRf7i8i9ikl!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfFdUf'i(i)ill*iCcDc+iVf,iqkEcFc-iWfGdXf.i/i:iml;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3fHd4f[i]i^inl_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-dwd.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'fId(f~iajbjolcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:fJd;fgjhjijpljjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^fKd_fnjojpjqlqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fLdagBjCjDjrlEj4c5cFjbgGjwk6c7cLbHjcgOddgIjJjKjElLj8c9cMjegNjxk!c#cOjfgMdggPjQjRjslSj$c%cTjhgUjyk'c(cVjigZdjgWjXjYjFlZj)c*c0jkg1jzk+c,c2jlg0dmg3j4j5jGl6j-c.c7jng8jAk/c:c9jogAdpg!j#j$jBk%j;c=c'jqg(jCk?c@c)jrgBdsg*j+j,jDk-j[c]c.jtg/jEk^c_c:jug1dvg;j=j?jjm@j`c{c[jwg]jFk|c}c^jxg2dyg_j`j{jkm|j~cad}jzg~jGkbdcd
108 @staticmethod
109 cdef GraphDefinition _from_handle(GraphHandle h_graph):
110 """Create a GraphDefinition from an existing GraphHandle (internal use)."""
111 cdef GraphDefinition g = GraphDefinition.__new__(GraphDefinition) 2s EePbQbRbSb8dTbUbVbWbHlIlJlKlLlMlXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bm n o p a b c d CdDde %b'b(b)b*b+b,b-b3 4 5 6 .b/b:b;bx y z A Z 0 1 2 =b?b@b[b]b^b_b`bB C D E {b|b}b~b7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ acbcccdc` { | } ecfcgchcF G H I ~ abbbcbicjckclcmcncocpcqcrcsctcdbucvcwcxcebfbgbhbyczcAcBcJ K L M t u v w CcDcEcFcGcHcIcJcN O P Q KcLcMcNcibjbkblbmbnbobpbqbrbsbtbR S T U ubvbwbxbybzbAbBbCbOcPcQcRcDbEbFbGbScTcUcVcV W X Y HbIbJbKbWcXcYcZc0c1c2c3c4c5c6c7cLb8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcd
112 g._h_graph = h_graph 2s EePbQbRbSb8dTbUbVbWbHlIlJlKlLlMlXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bm n o p a b c d CdDde %b'b(b)b*b+b,b-b3 4 5 6 .b/b:b;bx y z A Z 0 1 2 =b?b@b[b]b^b_b`bB C D E {b|b}b~b7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ acbcccdc` { | } ecfcgchcF G H I ~ abbbcbicjckclcmcncocpcqcrcsctcdbucvcwcxcebfbgbhbyczcAcBcJ K L M t u v w CcDcEcFcGcHcIcJcN O P Q KcLcMcNcibjbkblbmbnbobpbqbrbsbtbR S T U ubvbwbxbybzbAbBbCbOcPcQcRcDbEbFbGbScTcUcVcV W X Y HbIbJbKbWcXcYcZc0c1c2c3c4c5c6c7cLb8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcd
113 return g 2s EePbQbRbSb8dTbUbVbWbHlIlJlKlLlMlXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bm n o p a b c d CdDde %b'b(b)b*b+b,b-b3 4 5 6 .b/b:b;bx y z A Z 0 1 2 =b?b@b[b]b^b_b`bB C D E {b|b}b~b7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ acbcccdc` { | } ecfcgchcF G H I ~ abbbcbicjckclcmcncocpcqcrcsctcdbucvcwcxcebfbgbhbyczcAcBcJ K L M t u v w CcDcEcFcGcHcIcJcN O P Q KcLcMcNcibjbkblbmbnbobpbqbrbsbtbR S T U ubvbwbxbybzbAbBbCbOcPcQcRcDbEbFbGbScTcUcVcV W X Y HbIbJbKbWcXcYcZc0c1c2c3c4c5c6c7cLb8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcd
115 def __repr__(self) -> str:
116 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2El
118 def __eq__(self, other) -> bool:
119 if not isinstance(other, GraphDefinition): 28dHlIlJlKlLlMl8hklllmlnlse-dwd.dteueveweR S xe/dye%fT U olplqlrlslBkDk
120 return NotImplemented 28hklllmlnlse-dwd.dteueveweR S xe/dye%fT U olplqlrl
121 return as_intptr(self._h_graph) == as_intptr((<GraphDefinition>other)._h_graph) 28dHlIlJlKlLlMl8hslBkDk
123 def __hash__(self) -> int:
124 return hash(as_intptr(self._h_graph)) 2ulvlwlxlylcfbeNdcedfefffgf, - hfdeifni. / zlAlBlClDlFlGlBkDk
126 @property
127 def _entry(self) -> "GraphNode":
128 """Return the internal entry-point GraphNode (no dependencies)."""
129 cdef GraphNode n = GraphNode.__new__(GraphNode) 2lmmmnmompms ;dAg5dBgCgDgFeEgFgqmumHkrmr IkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkYkZk0kNlOlPlsmtmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhyd3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5e6e5h6h7h9h%b'b!h7e#hek(b)b$h8e9e%h'h(h)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)e*e/h:h;h=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,e-e]h^h_h`h=b?b{h.e|hhk@b[b}h/e:e~haibici]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]e^egihiiiji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbecedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfkfpiqirisiacbctilfuikkccdcmfnfofpfqf` { eerf| } visftfwixiyiziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfAfDiEiFiGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfGfRiSiTiUiqcrcViHfWinksctcdbXiIfJfYiZi0i1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfRf7i8i9i!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfUf'i(i)i*iCcDc+iVf,iqkEcFc-iWfXf.i/i:i;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3f4f[i]i^i_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-d.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'f(f~iajbjcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:f;fgjhjijjjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^f_fnjojpjqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fagBjCjDjEj4c5cFjbgGjwk6c7cLbHjcgdgIjJjKjLj8c9cMjegNjxk!c#cOjfgggPjQjRjSj$c%cTjhgUjyk'c(cVjigjgWjXjYjZj)c*c0jkg1jzk+c,c2jlgmg3j4j5j6j-c.c7jng8jAk/c:c9jogpg!j#j$j%j;c=c'jqg(jCk?c@c)jrgsg*j+j,j-j[c]c.jtg/jEk^c_c:jugvg;j=j?j@j`c{c[jwg]jFk|c}c^jxgyg_j`j{j|j~cad}jzg~jGkbdcd
130 n._h_node = create_graph_node_handle(<cydriver.CUgraphNode>NULL, self._h_graph) 2lmmmnmompms ;dAg5dBgCgDgFeEgFgqmumHkrmr IkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkYkZk0kNlOlPlsmtmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhyd3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5e6e5h6h7h9h%b'b!h7e#hek(b)b$h8e9e%h'h(h)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)e*e/h:h;h=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,e-e]h^h_h`h=b?b{h.e|hhk@b[b}h/e:e~haibici]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]e^egihiiiji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbecedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfkfpiqirisiacbctilfuikkccdcmfnfofpfqf` { eerf| } visftfwixiyiziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfAfDiEiFiGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfGfRiSiTiUiqcrcViHfWinksctcdbXiIfJfYiZi0i1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfRf7i8i9i!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfUf'i(i)i*iCcDc+iVf,iqkEcFc-iWfXf.i/i:i;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3f4f[i]i^i_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-d.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'f(f~iajbjcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:f;fgjhjijjjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^f_fnjojpjqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fagBjCjDjEj4c5cFjbgGjwk6c7cLbHjcgdgIjJjKjLj8c9cMjegNjxk!c#cOjfgggPjQjRjSj$c%cTjhgUjyk'c(cVjigjgWjXjYjZj)c*c0jkg1jzk+c,c2jlgmg3j4j5j6j-c.c7jng8jAk/c:c9jogpg!j#j$j%j;c=c'jqg(jCk?c@c)jrgsg*j+j,j-j[c]c.jtg/jEk^c_c:jugvg;j=j?j@j`c{c[jwg]jFk|c}c^jxgyg_j`j{j|j~cad}jzg~jGkbdcd
131 return n 2lmmmnmompms ;dAg5dBgCgDgFeEgFgqmumHkrmr IkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkYkZk0kNlOlPlsmtmGgHgGeHeIgJgKgLgMgPbQbNgIeOgPgQgRgRbSbSgTgJeKeUgVgWgXgYgTbUbZgLe0g1g2g3gVbWb4g5g6gMe7g8g9g!g#gNe$g%g'g(gOePe)g*g+g,g-gXbYb.gQe/g:g;g=gZb0b?g@gReSe[g]g^g_g`g1b2b{gTe|g}g~gah3b4bbhchUeVedhehfhghhh5b6bihWejhkhlhmh7b8bnhohXeYephqhrhshth9b!buhZevhwhxhyh#b$bzhAhBh0eChDhEhFhGh1eHhIhJhKhLhMh2eNhOhyd3dPhQhRh9dzd!dm n o p a b c d #d$dCdShThUh3e%dVhWhXh'd4e(dDd)de f g h i j YhZh0h1hk 2hq 3h7d4h5e6e5h6h7h9h%b'b!h7e#hek(b)b$h8e9e%h'h(h)h*b+b*h!e+hfk,b-b]d#e$e,h%e3 4 'e(e-h5 6 .h)e*e/h:h;h=h.b/b?h+e@hgk:b;b^d_d`dx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 [h,e-e]h^h_h`h=b?b{h.e|hhk@b[b}h/e:e~haibici]b^bdi;eeiik_b`b=e*d{d|d?e}dB C ~d@e[eD E fi]e^egihiiiji{b|bki_elijk}b~b`e{e7 8 9 ! |e# $ % ' ae}e~eaf( ) bfmi* + cfbecedfefffgf, - hfdeifni. / : ; = ? @ [ ] ^ _ oijfkfpiqirisiacbctilfuikkccdcmfnfofpfqf` { eerf| } visftfwixiyiziecfcAiufBilkgchc+dfegeheF G H I ievfwfxf~ abyfbbcbCizfAfDiEiFiGiicjcHiBfIimkkclcJiCfDfKiLiMiNimcncOiEfPiocpcQiFfGfRiSiTiUiqcrcViHfWinksctcdbXiIfJfYiZi0i1iucvc2iKf3iokwcxcjeLfMf4iNfebfbOfPf5igbhb6iQfRf7i8i9i!iyczc#iSf$ipkAcBckelemeJ K L M ddMbNbedfdgdhdt u idObjdndv w %iTfUf'i(i)i*iCcDc+iVf,iqkEcFc-iWfXf.i/i:i;iGcHc=iYf?irkIcJcZf,dneoe0fpeN O qe1f2fP Q @i3f4f[i]i^i_iKcLc`i5f{iskMcNc6f7fibjbkblb8fmbnbobpbre9f!f#fqbrb$f|isbtbse-d.dteueveweR S xe/dye%fT U ubvbwbxbybzbAbBbCb}i'f(f~iajbjcjOcPcdj)fejtkQcRc*f+f,f-f.fDbEbze/fFbGbfj:f;fgjhjijjjScTckj=fljukUcVc:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj^f_fnjojpjqjWcXcrj`fsjvkYcZctj{f|fujvjwjxj0c1cyj}fzj2c3cAj~fagBjCjDjEj4c5cFjbgGjwk6c7cLbHjcgdgIjJjKjLj8c9cMjegNjxk!c#cOjfgggPjQjRjSj$c%cTjhgUjyk'c(cVjigjgWjXjYjZj)c*c0jkg1jzk+c,c2jlgmg3j4j5j6j-c.c7jng8jAk/c:c9jogpg!j#j$j%j;c=c'jqg(jCk?c@c)jrgsg*j+j,j-j[c]c.jtg/jEk^c_c:jugvg;j=j?j@j`c{c[jwg]jFk|c}c^jxgyg_j`j{j|j~cad}jzg~jGkbdcd
133 def alloc(self, size_t size, options: GraphAllocOptions | None = None) -> "AllocNode":
134 """Add an entry-point memory allocation node (no dependencies).
136 See :meth:`GraphNode.alloc` for full documentation.
137 """
138 return self._entry.alloc(size, options) 2lmmmnmompm;dAg5dBgCgDgFeEgFgqmIkJkKkLkakbkckdkUkVkWkXkYkZk0kNlOlPlGgHgHeIgJgKgNgIeOgPgQgRgSgTgKeUgVgWgZgLe0g1g2g3g4g5g6gMe7g8g9g!g#gNe$g%g'g(gPe)g*g+g.gQe/g:g;g=g?g@gSe[g]g^g{gTe|g}g~gahbhchVedhehfhihWejhkhlhmhnhohYephqhrhuhZevhwhxhyhzhAhBh0eChDhEhFhGh1eHhIhKhLhMh2eNhOhQhRh!dThVh4h6e7h7e#h$h9e(h!e+h]d#e$e,h%e3 4 'e(e-h5 6 .h*e;h+e@hodldrdmdud[h-e_h.e|h}h:ebi;eei=e*d{d|d?e}dB C ~d@e[eD E fi^eii_eliae}e~eaf( ) bfmi* + cfceffdeifoikfrilfuipfeerfvitfyiufBi+dfegeheF G H I ievfwfxf~ abyfbbcbCiAfFiBfIiJiDfMiEfPiQiGfTiHfWiXiJf0iKf3ijeLfMf4iNfebfbOfPf5igbhb6iRf9iSf$iddNbgdObjd%iUf)iVf,i-iXf:iYf?iZf,dneoe0fpeN O qe1f2fP Q @i4f^i5f{ire9f!f#fqbrb$f|isbtbse.dve/dye}i(fbj)fej-fze/ffj;fij=flj:dAeBeCeV W X Y De?f@f[fHbIb]fJbKbmj_fpj`fsjtj|fwj}fzjAjagDjbgGjHjdgKjegNjOjggRjhgUjVjjgYjkg1j2jmg5jng8j9jpg$jqg(j)jsg,jtg/j:jvg?jwg]j^jyg{jzg~j
140 def free(self, dptr) -> "FreeNode":
141 """Add an entry-point memory free node (no dependencies).
143 See :meth:`GraphNode.free` for full documentation.
144 """
145 return self._entry.free(dptr) 2Ph
147 def memset(self, dst, value, size_t width, size_t height=1, size_t pitch=0) -> "MemsetNode":
148 """Add an entry-point memset node (no dependencies).
150 See :meth:`GraphNode.memset` for full documentation.
151 """
152 return self._entry.memset(dst, value, width, height, pitch) 1kq
154 def launch(self, config, kernel, *args) -> "KernelNode":
155 """Add an entry-point kernel launch node (no dependencies).
157 See :meth:`GraphNode.launch` for full documentation.
158 """
159 return self._entry.launch(config, kernel, *args) 26dPkQkRkSkTksmtmGeJeOeReUeXe9da b c d CdXh'd4e(dDdf g h i j k 7d5e!h8e*h]d'e)e?h^d_d`dx y z A kdtd,e{h/edi*d~d]ekiaebehfjftimfnfofpfqf` { eerf| } sfAi+diezfHiCfOiFfViIf2ijeOfQf#ikelemeJ K L M MbidTf+iWf=i,dqe3f`ire-dxe'fdj*f+f,f-f.fDbEbze/fFbGb:fkj:dDe^frj{fyj~fFjcgMjfgTjig0jlg7jog'jrg.jug[jxg}j
161 def empty(self) -> "EmptyNode":
162 """Add an entry-point empty node (no dependencies).
164 Returns
165 -------
166 EmptyNode
167 A new EmptyNode with no dependencies.
168 """
169 return self._entry.join() 2r Jh3dYhZh0h1h2h3h
171 def join(self, *nodes) -> "EmptyNode":
172 """Create an empty node that depends on all given nodes.
174 Parameters
175 ----------
176 *nodes : GraphNode
177 Nodes to merge.
179 Returns
180 -------
181 EmptyNode
182 A new EmptyNode that depends on all input nodes.
183 """
184 return self._entry.join(*nodes) 2FeakbkckdkNlOlPlHeIeKeLeMeNePeQeSeTeVeWeYeZe0e1e2ef g h i j 6e7e9e!e(e*e+eldmd-e.e:e;e=e*d{d|d?e}dB C ~d@e[eD E ^e_ebfcedekflfeetfuf+dfegeheF G H I yfAfBfDfEfGfHfJfKfPfRfSfNbObUfVfXfYfZf,dneoe0fpeN O qe1f2fP Q 4f5f$f.d/d(f)fze;f=f:dAeBeCeV W X Y ]f_f`f|f}fagbgdgeggghgjgkgmgngpgqgsgtgvgwgygzg
186 def memcpy(self, dst, src, size_t size) -> "MemcpyNode":
187 """Add an entry-point memcpy node (no dependencies).
189 See :meth:`GraphNode.memcpy` for full documentation.
190 """
191 return self._entry.memcpy(dst, src, size)
193 def embed(self, child: GraphDefinition) -> "ChildGraphNode":
194 """Add an entry-point child graph node (no dependencies).
196 See :meth:`GraphNode.embed` for full documentation.
197 """
198 return self._entry.embed(child) 26dGeJeOeReUeXeCdDd5e8e]d)e^d_d`dx y z A kd,e/e*d]eaebejfmfsf+diezfCfFfIfjeQfkelemeJ K L M MbTfWf,d3fre-d'f*f:f:dDe^f{f~fcgfgiglgogrgugxg
200 def record_event(self, event) -> "EventRecordNode":
201 """Add an entry-point event record node (no dependencies).
203 See :meth:`GraphNode.record_event` for full documentation.
204 """
205 return self._entry.record_event(event) 2MkShUh3e%d5h%h#e/h^dpd]h~h{dgi`e{e7 8 9 ! }edfpinfwifevfDiKiRiYiLf7ikeed'i.ine[i6f7fibjbkblb9fte~i+fgjAe?fnjujBjIjPjWj3j!j*j;j_j
207 def wait_event(self, event) -> "EventWaitNode":
208 """Add an entry-point event wait node (no dependencies).
210 See :meth:`GraphNode.wait_event` for full documentation.
211 """
212 return self._entry.wait_event(event) 2Wh6h'h$e:h_dqd^hai|dhi`e|e# $ % ' ~eefqiofxigewfEiLiSiZiMf8ilefd(i/ioe]i6f8fmbnbobpb!fueaj,fhjBe@fojvjCjJjQjXj4j#j+j=j`j
214 def callback(self, fn, *, user_data=None) -> "HostCallbackNode":
215 """Add an entry-point host callback node (no dependencies).
217 See :meth:`GraphNode.callback` for full documentation.
218 """
219 return self._entry.callback(fn, user_data=user_data) 2HkrmNkOkLgMgXgYg,g-g_g`gghhhshth#d$d)d9h)h%e=h`dsd`hci}dji{e|eafgf: ; = ? siqfzihexfGiNiUi1iNf!imehd*i;ipe_i7f8f#fweubvbwbxbcj.fjjCe[fqjxjEjLjSjZj6j%j-j@j|j
221 def create_condition(self, default_value: int | None = None) -> GraphCondition:
222 """Create a condition variable for use with conditional nodes.
224 The returned :class:`GraphCondition` object is passed to conditional-node
225 builder methods. Its value is controlled at runtime by device code
226 via ``cudaGraphSetConditional``.
228 Parameters
229 ----------
230 default_value : int, optional
231 The default value to assign to the condition.
232 If None, no default is assigned.
234 Returns
235 -------
236 GraphCondition
237 A condition variable for controlling conditional execution.
238 """
239 cdef cydriver.CUgraphConditionalHandle c_handle
240 cdef unsigned int flags = 0 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
241 cdef unsigned int default_val = 0 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
243 if default_value is not None: 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
244 default_val = <unsigned int>default_value 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bydzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
245 flags = cydriver.CU_GRAPH_COND_ASSIGN_DEFAULT 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$bydzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
247 cdef cydriver.CUcontext ctx = NULL 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
248 with nogil: 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
249 HANDLE_RETURN(cydriver.cuCtxGetCurrent(&ctx)) 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
250 HANDLE_RETURN(cydriver.cuGraphConditionalHandleCreate( 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
251 &c_handle, as_cu(self._h_graph), ctx, default_val, flags))
253 cdef GraphCondition cond = GraphCondition.__new__(GraphCondition) 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
254 cond._c_handle = c_handle 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
255 return cond 2s PbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$byd4dzdm n o p a b c d e vd%b'b(b)bPd*b+b,b-b3 4 5 6 Qd.b/b:b;bx y z A odkdldpdqdrdsdZ 0 tdmdudxd1 2 Rd=b?b@b[bSd]b^b_b`bB C D E Td{b|b}b~b7 8 9 ! # $ % ' ( ) * + Nd, - . / : ; = ? @ [ ] ^ _ Udacbcccdc` { | } VdecfcgchcF G H I ~ abbbcbWdicjckclcmcncocpcXdqcrcsctcdbYducvcwcxcebfbgbhbEdyczcAcBcJ K L M ddMbNbedfdgdhdt u idObjdndv w FdCcDcEcFcGdGcHcIcJcN O P Q HdKcLcMcNcibjbkblbmbnbobpbqbrbsbtbwdR S T U ubvbwbxbybzbAbBbCbIdOcPcQcRcDbEbFbGbJdScTcUcVcV W X Y HbIbJbKbKdWcXcYcZc0c1c2c3cLd4c5c6c7cLbOd8c9c!c#cMd$c%c'c(cZd)c*c+c,c0d-c.c/c:cAd;c=c?c@cBd[c]c^c_c1d`c{c|c}c2d~cadbdcd
257 def if_cond(self, condition: GraphCondition) -> "IfNode":
258 """Add an entry-point if-conditional node (no dependencies).
260 See :meth:`GraphNode.if_cond` for full documentation.
261 """
262 return self._entry.if_cond(condition) 2s PbTbXb1b5b9bydm a 'b+b4 /by 0 ?b^bC |b8 $ ) - ; ] ^ _ bc{ fcG abjcncrcvcfbzcK u DcHcO LcjbnbrbS vbAbBbCbPcEbTcW IbXc1c5c9c%c*c.c=c]c{cad
264 def if_else(self, condition: GraphCondition) -> "IfElseNode":
265 """Add an entry-point if-else conditional node (no dependencies).
267 See :meth:`GraphNode.if_else` for full documentation.
268 """
269 return self._entry.if_else(condition) 2QbUbYb2b6b!bn b %b*b3 .bx Z =b]bB {b7 # ( , : @ [ ] ac` ecF ~ icmcqcucebycJ t CcGcN KcibmbqbR ubybzbAbOcDbScV HbWc0c4c8c$c)c-c;c[c`c~c
271 def while_loop(self, condition: GraphCondition) -> "WhileNode":
272 """Add an entry-point while-loop conditional node (no dependencies).
274 See :meth:`GraphNode.while_loop` for full documentation.
275 """
276 return self._entry.while_loop(condition) 2SbWb0b4b8b$bp d e )b-b6 ;bA 2 [b`bE ~b! ' + / ? [ _ dc} hcI cblcpctcdbxchbBcM w FcJcQ NclbpbtbU xbzbCbRcGbVcY KbZc3c7cLb#c(c,c:c@c_c}ccd
278 def switch(self, condition: GraphCondition, unsigned int count) -> "SwitchNode":
279 """Add an entry-point switch conditional node (no dependencies).
281 See :meth:`GraphNode.switch` for full documentation.
282 """
283 return self._entry.switch(condition, count) 2RbVbZb3b7b#bzdo c (b,b5 :bz 1 @b_bD }b9 % * . = @ ^ cc| gcH bbkcocscdbwcgbAcL v EcIcP MckbobsbT wbybBbQcFbUcX JbYc2c6cLb!c'c+c/c?c^c|cbd
285 def instantiate(self, options=None):
286 """Instantiate the graph definition into an executable Graph.
288 Parameters
289 ----------
290 options : :obj:`~graph.GraphCompleteOptions`, optional
291 Customizable dataclass for graph instantiation options.
293 Returns
294 -------
295 Graph
296 An executable graph that can be launched on a stream.
297 """
298 from cuda.core.graph._graph_builder import _instantiate_graph 2HkIkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkvmwmxmYkZk0k9d!d#d$d%d'd(d)df g h i j k 7d
300 return _instantiate_graph( 2HkIkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkvmwmxmYkZk0k9d!d#d$d%d'd(d)df g h i j k 7d
301 driver.CUgraph(as_intptr(self._h_graph)), options) 2HkIkJkKkLk6dMkNkOkPkQkRkSkTkakbkckdkUkVkWkXkvmwmxmYkZk0k9d!d#d$d%d'd(d)df g h i j k 7d
303 def debug_dot_print(self, path: str, options=None) -> None:
304 """Write a GraphViz DOT representation of the graph to a file.
306 Parameters
307 ----------
308 path : str
309 File path for the DOT output.
310 options : GraphDebugPrintOptions, optional
311 Customizable options for the debug print.
312 """
313 from cuda.core.graph._graph_builder import GraphDebugPrintOptions 2;dAg5d
315 cdef unsigned int flags = 0 2;dAg5d
316 if options is not None: 2;dAg5d
317 if not isinstance(options, GraphDebugPrintOptions): 2Ag5d
318 raise TypeError("options must be a GraphDebugPrintOptions instance") 2Ag
319 flags = options._to_flags() 25d
321 cdef bytes path_bytes = path.encode('utf-8') 2;d5d
322 cdef const char* c_path = path_bytes 2;d5d
323 with nogil: 2;d5d
324 HANDLE_RETURN(cydriver.cuGraphDebugDotPrint(as_cu(self._h_graph), c_path, flags)) 2;d5d
326 def nodes(self) -> set:
327 """Return all nodes in the graph.
329 Returns
330 -------
331 set of GraphNode
332 All nodes in the graph.
333 """
334 cdef vector[cydriver.CUgraphNode] nodes_vec
335 nodes_vec.resize(128) 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(ktl)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3dm n o p a b c d CdDde f g h i j k q
336 cdef size_t num_nodes = 128 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(ktl)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3dm n o p a b c d CdDde f g h i j k q
338 with nogil: 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(ktl)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3dm n o p a b c d CdDde f g h i j k q
339 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes)) 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(ktl)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3dm n o p a b c d CdDde f g h i j k q
341 if num_nodes == 0: 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(ktl)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3dm n o p a b c d CdDde f g h i j k q
342 return set() 2tlm n o p
344 if num_nodes > 128: 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3da b c d CdDde f g h i j k q
345 nodes_vec.resize(num_nodes)
346 with nogil:
347 HANDLE_RETURN(cydriver.cuGraphGetNodes(as_cu(self._h_graph), nodes_vec.data(), &num_nodes))
349 return {GraphNode._create(self._h_graph, nodes_vec[i]) for i in range(num_nodes)} 2s r Ee1k2k8d3k4k5k6k7k8k9k!k#k$k%k'k(k)k*k+k,k-k.k/k:k;k=k?k@k[k]k^k_k`k{k|k}k~kalblcldlelflgl3da b c d CdDde f g h i j k q
351 def edges(self) -> set:
352 """Return all edges in the graph as (from_node, to_node) pairs.
354 Returns
355 -------
356 set of tuple
357 Each element is a (from_node, to_node) pair representing
358 a dependency edge in the graph.
359 """
360 cdef vector[cydriver.CUgraphNode] from_nodes
361 cdef vector[cydriver.CUgraphNode] to_nodes
362 from_nodes.resize(128) 2=d?dhlil@d[djlr f g h i j k q
363 to_nodes.resize(128) 2=d?dhlil@d[djlr f g h i j k q
364 cdef size_t num_edges = 128 2=d?dhlil@d[djlr f g h i j k q
366 with nogil: 2=d?dhlil@d[djlr f g h i j k q
367 IF CUDA_CORE_BUILD_MAJOR >= 13:
368 HANDLE_RETURN(cydriver.cuGraphGetEdges( 2=d?dhlil@d[djlr f g h i j k q
369 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges))
370 ELSE:
371 HANDLE_RETURN(cydriver.cuGraphGetEdges(
372 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges))
374 if num_edges == 0: 2=d?dhlil@d[djlr f g h i j k q
375 return set() 2hliljlq
377 if num_edges > 128: 2=d?d@d[dr f g h i j k q
378 from_nodes.resize(num_edges)
379 to_nodes.resize(num_edges)
380 with nogil:
381 IF CUDA_CORE_BUILD_MAJOR >= 13:
382 HANDLE_RETURN(cydriver.cuGraphGetEdges(
383 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), NULL, &num_edges))
384 ELSE:
385 HANDLE_RETURN(cydriver.cuGraphGetEdges(
386 as_cu(self._h_graph), from_nodes.data(), to_nodes.data(), &num_edges))
388 return { 2=d?d@d[dr f g h i j k q
389 (GraphNode._create(self._h_graph, from_nodes[i]), 2=d?d@d[dr f g h i j k q
390 GraphNode._create(self._h_graph, to_nodes[i])) 2=d?d@d[dr f g h i j k q
391 for i in range(num_edges) 2=d?d@d[dr f g h i j k q
392 }
394 @property
395 def handle(self) -> driver.CUgraph:
396 """Return the underlying driver CUgraph handle."""
397 return as_py(self._h_graph) 2Cm3e4e7d8h