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

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

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5"""GraphDefinition: explicit CUDA graph definition.""" 

6  

7from __future__ import annotations 

8  

9from libc.stddef cimport size_t 

10  

11from libcpp.vector cimport vector 

12  

13from cuda.bindings cimport cydriver 

14  

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 

25  

26from dataclasses import dataclass 

27  

28from cuda.core._utils.cuda_utils import driver 

29  

30  

31cdef class GraphCondition: 

32 """A condition variable for conditional graph nodes. 

33  

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 """ 

39  

40 def __repr__(self) -> str: 

41 return f"<GraphCondition handle=0x{<unsigned long long>self._c_handle:x}>" 2Od

42  

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

47  

48 def __hash__(self) -> int: 

49 return hash(<unsigned long long>self._c_handle) 2PdQdodkdldpdqdrdsdZ 0 tdmdudxd1 2 RdSdTdNdUdVdWdXdYdZd0dAdBd

50  

51 @property 

52 def handle(self) -> driver.CUgraphConditionalHandle: 

53 """The raw CUgraphConditionalHandle as an int.""" 

54 return <unsigned long long>self._c_handle 2vd

55  

56  

57@dataclass 

58class GraphAllocOptions: 

59 """Options for graph memory allocation nodes. 

60  

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: 

68  

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. 

75  

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. 

80  

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 """ 

87  

88 device: int | "Device" | None = None 

89 memory_type: str = "device" 

90 peer_access: list | None = None 

91  

92  

93cdef class GraphDefinition: 

94 """A graph definition. 

95  

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 """ 

100  

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

107  

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

114  

115 def __repr__(self) -> str: 

116 return f"<GraphDefinition handle=0x{as_intptr(self._h_graph):x}>" 2El

117  

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

122  

123 def __hash__(self) -> int: 

124 return hash(as_intptr(self._h_graph)) 2ulvlwlxlylcfbeNdcedfefffgf, - hfdeifni. / zlAlBlClDlFlGlBkDk

125  

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

132  

133 def alloc(self, size_t size, options: GraphAllocOptions | None = None) -> "AllocNode": 

134 """Add an entry-point memory allocation node (no dependencies). 

135  

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

139  

140 def free(self, dptr) -> "FreeNode": 

141 """Add an entry-point memory free node (no dependencies). 

142  

143 See :meth:`GraphNode.free` for full documentation. 

144 """ 

145 return self._entry.free(dptr) 2Ph

146  

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

149  

150 See :meth:`GraphNode.memset` for full documentation. 

151 """ 

152 return self._entry.memset(dst, value, width, height, pitch) 1kq

153  

154 def launch(self, config, kernel, *args) -> "KernelNode": 

155 """Add an entry-point kernel launch node (no dependencies). 

156  

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

160  

161 def empty(self) -> "EmptyNode": 

162 """Add an entry-point empty node (no dependencies). 

163  

164 Returns 

165 ------- 

166 EmptyNode 

167 A new EmptyNode with no dependencies. 

168 """ 

169 return self._entry.join() 2r Jh3dYhZh0h1h2h3h

170  

171 def join(self, *nodes) -> "EmptyNode": 

172 """Create an empty node that depends on all given nodes. 

173  

174 Parameters 

175 ---------- 

176 *nodes : GraphNode 

177 Nodes to merge. 

178  

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

185  

186 def memcpy(self, dst, src, size_t size) -> "MemcpyNode": 

187 """Add an entry-point memcpy node (no dependencies). 

188  

189 See :meth:`GraphNode.memcpy` for full documentation. 

190 """ 

191 return self._entry.memcpy(dst, src, size) 

192  

193 def embed(self, child: GraphDefinition) -> "ChildGraphNode": 

194 """Add an entry-point child graph node (no dependencies). 

195  

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

199  

200 def record_event(self, event) -> "EventRecordNode": 

201 """Add an entry-point event record node (no dependencies). 

202  

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

206  

207 def wait_event(self, event) -> "EventWaitNode": 

208 """Add an entry-point event wait node (no dependencies). 

209  

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

213  

214 def callback(self, fn, *, user_data=None) -> "HostCallbackNode": 

215 """Add an entry-point host callback node (no dependencies). 

216  

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

220  

221 def create_condition(self, default_value: int | None = None) -> GraphCondition: 

222 """Create a condition variable for use with conditional nodes. 

223  

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``. 

227  

228 Parameters 

229 ---------- 

230 default_value : int, optional 

231 The default value to assign to the condition. 

232 If None, no default is assigned. 

233  

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

242  

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

246  

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

252  

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

256  

257 def if_cond(self, condition: GraphCondition) -> "IfNode": 

258 """Add an entry-point if-conditional node (no dependencies). 

259  

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

263  

264 def if_else(self, condition: GraphCondition) -> "IfElseNode": 

265 """Add an entry-point if-else conditional node (no dependencies). 

266  

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

270  

271 def while_loop(self, condition: GraphCondition) -> "WhileNode": 

272 """Add an entry-point while-loop conditional node (no dependencies). 

273  

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

277  

278 def switch(self, condition: GraphCondition, unsigned int count) -> "SwitchNode": 

279 """Add an entry-point switch conditional node (no dependencies). 

280  

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

284  

285 def instantiate(self, options=None): 

286 """Instantiate the graph definition into an executable Graph. 

287  

288 Parameters 

289 ---------- 

290 options : :obj:`~graph.GraphCompleteOptions`, optional 

291 Customizable dataclass for graph instantiation options. 

292  

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

299  

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

302  

303 def debug_dot_print(self, path: str, options=None) -> None: 

304 """Write a GraphViz DOT representation of the graph to a file. 

305  

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

314  

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

320  

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

325  

326 def nodes(self) -> set: 

327 """Return all nodes in the graph. 

328  

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

337  

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

340  

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

343  

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

348  

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

350  

351 def edges(self) -> set: 

352 """Return all edges in the graph as (from_node, to_node) pairs. 

353  

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

365  

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

373  

374 if num_edges == 0: 2=d?dhlil@d[djlr f g h i j k q

375 return set() 2hliljlq

376  

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

387  

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 } 

393  

394 @property 

395 def handle(self) -> driver.CUgraph: 

396 """Return the underlying driver CUgraph handle.""" 

397 return as_py(self._h_graph) 2Cm3e4e7d8h