Coverage for cuda/core/_stream.pyx: 82.35%

204 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-07-29 01:38 +0000

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

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from __future__ import annotations 

6  

7from libc.stdint cimport uintptr_t, INT32_MIN 

8from libc.stdlib cimport strtol, getenv 

9  

10from cuda.bindings cimport cydriver 

11  

12from cuda.core._event cimport Event as cyEvent 

13from cuda.core._utils.cuda_utils cimport ( 

14 check_or_create_options, 

15 HANDLE_RETURN, 

16) 

17  

18import cython 

19import warnings 

20from dataclasses import dataclass 

21from typing import Protocol, TYPE_CHECKING 

22  

23from cuda.core._context cimport Context 

24from cuda.core._device_resources cimport DeviceResources 

25from cuda.core._event import Event, EventOptions 

26  

27from cuda.core._resource_handles cimport ( 

28 ContextHandle, 

29 EventHandle, 

30 StreamHandle, 

31 create_context_handle_ref, 

32 create_event_handle_noctx, 

33 create_stream_handle, 

34 create_stream_handle_with_owner, 

35 get_current_context, 

36 get_last_error, 

37 get_legacy_stream, 

38 get_per_thread_stream, 

39 get_stream_context, 

40 as_intptr, 

41 as_cu, 

42 as_py, 

43) 

44  

45if TYPE_CHECKING: 

46 import cuda.bindings.driver # no-cython-lint 

47 from cuda.core._device import Device 

48 from cuda.core.graph import GraphBuilder 

49  

50@dataclass 

51cdef class StreamOptions: 

52 """Customizable :obj:`~_stream.Stream` options. 

53  

54 Attributes 

55 ---------- 

56 nonblocking : bool, optional 

57 Stream does not synchronize with the NULL stream. (Default to True) 

58 priority : int, optional 

59 Stream priority where lower number represents a 

60 higher priority. (Default to lowest priority) 

61  

62 """ 

63  

64 nonblocking : cython.bint = True 

65 priority: int | None = None 

66  

67  

68class IsStreamType(Protocol): 

69 def __cuda_stream__(self) -> tuple[int, int]: 

70 """ 

71 For any Python object that is meant to be interpreted as a CUDA stream, the intent 

72 can be communicated by implementing this protocol that returns a 2-tuple: The protocol 

73 version number (currently ``0``) and the address of ``cudaStream_t``. Both values 

74 should be Python `int`. 

75 """ 

76 ... 

77  

78  

79cdef class Stream: 

80 """Represent a queue of GPU operations that are executed in a specific order. 

81  

82 Applications use streams to control the order of execution for 

83 GPU work. Work within a single stream are executed sequentially. 

84 Whereas work across multiple streams can be further controlled 

85 using stream priorities and :obj:`~_event.Event` managements. 

86  

87 Advanced users can utilize default streams for enforce complex 

88 implicit synchronization behaviors. 

89  

90 Directly creating a :obj:`~_stream.Stream` is not supported due to ambiguity. 

91 New streams should instead be created through a :obj:`~_device.Device` 

92 object, or created directly through using an existing handle 

93 using Stream.from_handle(). 

94 """ 

95 def __init__(self, *args, **kwargs) -> None: 

96 raise RuntimeError( 2fi

97 "Stream objects cannot be instantiated directly. " 

98 "Please use Device APIs (create_stream) or other Stream APIs (from_handle)." 

99 ) 

100  

101 @staticmethod 

102 cdef Stream _from_handle(type cls, StreamHandle h_stream): 

103 """Create a Stream from an existing StreamHandle (cdef-only factory).""" 

104 cdef Stream s = cls.__new__(cls) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

105 s._h_stream = h_stream 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

106 s._h_context = get_stream_context(h_stream) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

107 s._device_id = -1 # lazy init'd (invalid sentinel) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

108 s._nonblocking = -1 # lazy init'd 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

109 s._priority = INT32_MIN # lazy init'd 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

110 return s 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb

111  

112 @classmethod 

113 def _legacy_default(cls) -> Stream: 

114 """Return the legacy default stream (supports subclassing).""" 

115 return Stream._from_handle(cls, get_legacy_stream()) 2fbWh

116  

117 @classmethod 

118 def _per_thread_default(cls) -> Stream: 

119 """Return the per-thread default stream (supports subclassing).""" 

120 return Stream._from_handle(cls, get_per_thread_stream()) 2fbXh

121  

122 @classmethod 

123 def _init(cls, obj: IsStreamType | None = None, options: object = None, 

124 device_id: int | None = None, ctx: Context | None = None) -> Stream: 

125 cdef StreamHandle h_stream 

126 cdef cydriver.CUstream borrowed 

127 cdef ContextHandle h_context 

128  

129 # Extract context handle if provided 

130 if ctx is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

131 h_context = (<Context>ctx)._h_context 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO OePeY Z CbDbUdkdldmdeb

132  

133 if obj is not None and options is not None: 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

134 raise ValueError("obj and options cannot be both specified") 

135 if obj is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

136 # Borrowed stream from foreign object 

137 # C++ handle prevents owner from being GC'd until handle is released 

138 # Owner is responsible for keeping the stream's context alive 

139 borrowed = _handle_from_stream_protocol(obj) 2B L M R S v {eN T O Z

140 h_stream = create_stream_handle_with_owner(borrowed, obj) 2B L M R S v {eN T O

141 return Stream._from_handle(cls, h_stream) 2B L M R S v {eN T O

142  

143 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

144 nonblocking = opts.nonblocking 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

145 priority = opts.priority 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

146  

147 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

148 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2}e

149 # TODO: we might want to consider memoizing high/low per CUDA context and avoid this call 

150 cdef int high, low 

151 cdef cydriver.CUresult res_code 

152 with nogil: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

153 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

154 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

155 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 

156 raise RuntimeError( 

157 "No current CUDA context. Call dev.set_current() before creating streams." 

158 ) 

159 HANDLE_RETURN(res_code) 

160 cdef int prio 

161 if priority is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

162 prio = priority 2Td8d

163 if not (low <= prio <= high): 2Td8d

164 raise ValueError(f"{priority=} is out of range {[low, high]}") 28d

165 else: 

166 prio = high 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeNeT {cO |eOePeY Z CbDbUdkdldmdeb

167  

168 # C++ creates the stream and returns owning handle with context dependency. 

169 # For green contexts, the C++ layer auto-dispatches to cuGreenCtxStreamCreate. 

170 h_stream = create_stream_handle(h_context, flags, prio) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

171 if not h_stream: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

172 res_code = get_last_error() 2}e

173 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2}e

174 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT; 

175 # no need to check is_green since primary streams don't fail this way 

176 raise ValueError( 2}e

177 "Green context streams must be non-blocking. " 

178 "Use StreamOptions(nonblocking=True) or omit the option (True is the default)." 

179 ) 

180 elif res_code == cydriver.CUresult.CUDA_ERROR_NOT_SUPPORTED: 

181 raise RuntimeError( 

182 "cuGreenCtxStreamCreate is not available. " 

183 "Green context stream creation requires CUDA 12.5 or newer." 

184 ) 

185 else: 

186 HANDLE_RETURN(res_code) 

187 cdef Stream self = Stream._from_handle(cls, h_stream) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

188 self._nonblocking = int(nonblocking) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

189 self._priority = prio 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

190 if device_id is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

191 self._device_id = device_id 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

192 return self 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb

193  

194 cpdef close(self): 

195 """Destroy the stream. 

196  

197 Releases the stream handle. For owned streams, this destroys the 

198 underlying CUDA stream. For borrowed streams, this releases the 

199 reference and allows the Python owner to be GC'd. 

200 """ 

201 self._h_stream.reset() 2gbhbdbndCbDbUdkdldmd

202  

203 def __cuda_stream__(self) -> tuple[int, int]: 

204 """Return an instance of a __cuda_stream__ protocol.""" 

205 return (0, as_intptr(self._h_stream)) 1Bv

206  

207 def __hash__(self) -> int: 

208 return hash(as_intptr(self._h_stream)) 2L SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+ekelegiYhM v -eN meO

209  

210 def __eq__(self, other: object) -> bool: 

211 if not isinstance(other, Stream): 27dL neoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKekeleYhM LeR S v N meMeT O Pe

212 return NotImplemented 27dneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJePe

213 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 27dL KekeleYhM LeR S v N meMeT O

214  

215 def __repr__(self) -> str: 

216 Stream_ensure_ctx(self) 2K U # $ % ' ( ) * + Rd

217 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2K U # $ % ' ( ) * + Rd

218  

219 @property 

220 def handle(self) -> cuda.bindings.driver.CUstream: 

221 """Return the underlying ``CUstream`` object. 

222  

223 .. caution:: 

224  

225 This handle is a Python object. To get the memory address of the underlying C 

226 handle, call ``int(Stream.handle)``. 

227 """ 

228 return as_py(self._h_stream) 2zdAdBdCdDd0 C - D W x X |ca b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbb1 2 3 4 5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeudw ReOfQd7dL M R S ,eN T O Cbkdldmdeb

229  

230 @property 

231 def is_nonblocking(self) -> bool: 

232 """Return True if this is a nonblocking stream, otherwise False.""" 

233 cdef unsigned int flags 

234 if self._nonblocking == -1: 2TdNe

235 with nogil: 

236 HANDLE_RETURN(cydriver.cuStreamGetFlags(as_cu(self._h_stream), &flags)) 

237 self._nonblocking = flags & cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING 

238 return bool(self._nonblocking) 2TdNe

239  

240 @property 

241 def priority(self) -> int: 

242 """Return the stream priority.""" 

243 cdef int prio 

244 if self._priority == INT32_MIN: 2Td8d

245 with nogil: 

246 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio)) 

247 self._priority = prio 

248 return self._priority 2Td8d

249  

250 def sync(self) -> None: 

251 """Synchronize the stream.""" 

252 with nogil: 2zdAdBdCdDd0 C D W x gbX |chba b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d~e`d{d|d}d~dafaebe. / : cedeeebfcfdf; = ? ef@ [ ] ^ ffgf_ fege` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjekblbvdwdmbxdydnbobK qbP rbQ sbtbubV vbwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfdbndxbybzbOeY CbkdldmdNfeb

253 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2zdAdBdCdDd0 C D W x gbX |chba b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d~e`d{d|d}d~dafaebe. / : cedeeebfcfdf; = ? ef@ [ ] ^ ffgf_ fege` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjekblbvdwdmbxdydnbobK qbP rbQ sbtbubV vbwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfdbndxbybzbOeY CbkdldmdNfeb

254  

255 def record(self, event: Event | None = None, options: EventOptions | None = None) -> Event: 

256 """Record an event onto the stream. 

257  

258 Creates an :obj:`~_event.Event` object (or reuses the given one) by 

259 recording on the stream. 

260  

261 Parameters 

262 ---------- 

263 event : :obj:`~_event.Event`, optional 

264 Optional event object to be reused for recording. 

265 options : :obj:`EventOptions`, optional 

266 Customizable dataclass for event creation options. 

267  

268 Returns 

269 ------- 

270 :obj:`~_event.Event` 

271 Newly created event object. 

272  

273 """ 

274 # Create an Event object (or reusing the given one) by recording 

275 # on the stream. Event flags such as disabling timing, nonblocking, 

276 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions. 

277 if event is None: 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

278 Stream_ensure_ctx_device(self) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

279 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

280 elif event.is_ipc_enabled: 2pb

281 raise TypeError( 2pb

282 "IPC-enabled events should not be re-recorded, instead create a " 

283 "new event by supplying options." 

284 ) 

285  

286 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

287 with nogil: 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

288 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

289 return event 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY

290  

291 def wait(self, event_or_stream: Event | Stream) -> None: 

292 """Wait for a CUDA event or a CUDA stream. 

293  

294 Waiting for an event or a stream establishes a stream order. 

295  

296 If a :obj:`~_stream.Stream` is provided, then wait until the stream's 

297 work is completed. This is done by recording a new :obj:`~_event.Event` 

298 on the stream and then waiting on it. 

299  

300 Parameters 

301 ---------- 

302 event_or_stream : :obj:`~_event.Event` | :obj:`~_stream.Stream` 

303 The event or stream to wait for. Objects supporting the 

304 ``__cuda_stream__`` protocol are also accepted and treated as 

305 streams. 

306  

307 """ 

308 cdef Stream stream 

309 cdef EventHandle h_event 

310  

311 # Handle Event directly 

312 if isinstance(event_or_stream, Event): 1yzxAabcdefghijklmnopqrstuwYZ

313 with nogil: 1yzxAabcdefghijklmnopqrstuwY

314 # TODO: support flags other than 0? 

315 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1yzxAabcdefghijklmnopqrstuwY

316 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0)) 

317 return 1yzxAabcdefghijklmnopqrstuwY

318  

319 # Convert to Stream if needed 

320 if isinstance(event_or_stream, Stream): 1yzxAabcdefghijklmnopqrstuwZ

321 stream = <Stream>event_or_stream 1yzxAabcdefghijklmnopqrstuw

322 else: 

323 try: 1Z

324 stream = Stream._init(obj=event_or_stream) 1Z

325 except Exception as e: 1Z

326 raise ValueError( 1Z

327 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 1Z

328 f" got {type(event_or_stream)}" 1Z

329 ) from e 1Z

330  

331 # Wait on stream via temporary event 

332 with nogil: 1yzxAabcdefghijklmnopqrstuw

333 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1yzxAabcdefghijklmnopqrstuw

334 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1yzxAabcdefghijklmnopqrstuw

335 # TODO: support flags other than 0? 

336 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1yzxAabcdefghijklmnopqrstuw

337  

338 @property 

339 def device(self) -> Device: 

340 """Return the :obj:`~_device.Device` singleton associated with this stream. 

341  

342 Note 

343 ---- 

344 The current context on the device may differ from this 

345 stream's context. This case occurs when a different CUDA 

346 context is set current after a stream is created. 

347  

348 """ 

349 from cuda.core._device import Device # avoid circular import 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv

350 Stream_ensure_ctx_device(self) 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv

351 return Device(self._device_id) 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv

352  

353 @property 

354 def context(self) -> Context: 

355 """Return the :obj:`~_context.Context` associated with this stream.""" 

356 Stream_ensure_ctx(self) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv

357 Stream_ensure_ctx_device(self) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv

358 return Context._from_handle(Context, self._h_context, self._device_id) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv

359  

360 @property 

361 def resources(self) -> DeviceResources: 

362 """Query the hardware resources provisioned for this stream's context. 

363  

364 For streams created from a green context, returns the resources 

365 that context was provisioned with. For streams on the primary 

366 context, returns the full device resources. 

367 """ 

368 Stream_ensure_ctx(self) 2hd

369 Stream_ensure_ctx_device(self) 2hd

370 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2hd

371  

372 @staticmethod 

373 def from_handle(handle) -> Stream: 

374 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle. 

375  

376 Uses a cudaStream_t pointer address represented as a Python int 

377 to create a new :obj:`~_stream.Stream` object. 

378  

379 Note 

380 ---- 

381 Stream lifetime is not managed, foreign object must remain 

382 alive while this stream is active. 

383  

384 Parameters 

385 ---------- 

386 handle : int 

387 Stream handle representing the address of a foreign 

388 stream object. 

389  

390 Returns 

391 ------- 

392 :obj:`~_stream.Stream` 

393 Newly created stream object. 

394  

395 """ 

396  

397 class _stream_holder: 2L M R S {eN T O

398 def __cuda_stream__(self) -> tuple[int, int]: 2L M R S {eN T O

399 return (0, handle) 2L M R S {eN T O

400  

401 return Stream._init(obj=_stream_holder()) 2L M R S {eN T O

402  

403 def create_graph_builder(self) -> GraphBuilder: 

404 """Create a new :obj:`~graph.GraphBuilder` object. 

405  

406 The new graph builder will be associated with this stream. 

407  

408 Returns 

409 ------- 

410 :obj:`~graph.GraphBuilder` 

411 Newly created graph builder object. 

412  

413 """ 

414 from cuda.core.graph._graph_builder import GraphBuilder 2zdAdBdCdDdW gbX hb

415  

416 return GraphBuilder._init(self) 2zdAdBdCdDdW gbX hb

417  

418  

419LEGACY_DEFAULT_STREAM: Stream = Stream._legacy_default() 

420PER_THREAD_DEFAULT_STREAM: Stream = Stream._per_thread_default() 

421  

422  

423cpdef Stream default_stream(): 

424 """Return the default CUDA :obj:`~_stream.Stream`. 

425  

426 The type of default stream returned depends on if the environment 

427 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set. 

428  

429 If set, returns a per-thread default stream. Otherwise returns 

430 the legacy stream. 

431  

432 """ 

433 # TODO: flip the default 

434 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

435  

436 cdef int use_ptds = 0 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

437 if use_ptds_raw != NULL: 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

438 use_ptds = strtol(use_ptds_raw, NULL, 10) 

439  

440 # value is non-zero, including for weird stuff like 123foo 

441 if use_ptds: 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

442 return PER_THREAD_DEFAULT_STREAM 

443 else: 

444 return LEGACY_DEFAULT_STREAM 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

445  

446  

447cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil: 

448 """Ensure the stream's context handle is populated.""" 

449 cdef cydriver.CUcontext ctx 

450 if not self._h_context: 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv

451 self._h_context = get_stream_context(self._h_stream) 

452 if self._h_context: 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv

453 return 0 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv

454 HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx)) 

455 if ctx != NULL: 

456 with gil: 

457 self._h_context = create_context_handle_ref(ctx) 

458 return 0 

459  

460  

461cdef inline int Stream_ensure_ctx_device(Stream self) except?-1: 

462 """Ensure the stream's context and device_id are populated.""" 

463 cdef cydriver.CUcontext ctx 

464 cdef cydriver.CUdevice target_dev 

465 cdef ContextHandle current_context 

466 cdef bint switch_context 

467  

468 if self._device_id < 0: 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + pbOdPdbdcdddedfdgdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, hdidV wb^c_c`cjdSdv {cY

469 with nogil: 1v

470 # Get device ID from context, switching context temporarily if needed 

471 Stream_ensure_ctx(self) 1v

472 current_context = get_current_context() 1v

473 switch_context = (as_cu(current_context) != as_cu(self._h_context)) 1v

474 if switch_context: 1v

475 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context))) 

476 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1v

477 if switch_context: 1v

478 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 

479 self._device_id = <int>target_dev 1v

480 return 0 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + pbOdPdbdcdddedfdgdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, hdidV wb^c_c`cjdSdv {cY

481  

482  

483cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*: 

484 if isinstance(obj, Stream): 2B L M R S v {eN T O Z

485 return <cydriver.CUstream><uintptr_t>(obj.handle) 

486  

487 try: 2B L M R S v {eN T O Z

488 cuda_stream_attr = obj.__cuda_stream__ 2B L M R S v {eN T O Z

489 except AttributeError: 1Z

490 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 1Z

491  

492 if callable(cuda_stream_attr): 2B L M R S v {eN T O

493 info = cuda_stream_attr() 2B L M R S v {eN T O

494 else: 

495 info = cuda_stream_attr 

496 warnings.simplefilter("once", DeprecationWarning) 

497 warnings.warn( 

498 "Implementing __cuda_stream__ as an attribute is deprecated; it must be implemented as a method", 

499 stacklevel=3, 

500 category=DeprecationWarning, 

501 ) 

502  

503 try: 2B L M R S v {eN T O

504 len_info = len(info) 2B L M R S v {eN T O

505 except TypeError as e: 

506 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {type(info)}") from e 

507 if len_info != 2: 2B L M R S v {eN T O

508 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements") 

509 if info[0] != 0: 2B L M R S v {eN T O

510 raise RuntimeError( 

511 f"The first element of the sequence returned by obj.__cuda_stream__ must be 0, got {repr(info[0])}" 

512 ) 

513 return <cydriver.CUstream><uintptr_t>(info[1]) 2B L M R S v {eN T O

514  

515# Helper for API functions that accept either Stream or GraphBuilder. Performs 

516# needed checks and returns the relevant stream. Rejects None so that callers 

517# cannot rely on an implicit fallback to the default stream; if the default 

518# stream is wanted, pass `device.default_stream` explicitly. 

519cpdef Stream Stream_accept(arg, bint allow_stream_protocol=False): 

520 from cuda.core.graph._graph_builder import GraphBuilder 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]geiCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

521  

522 if arg is None: 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]geiCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

523 raise TypeError( 2ei

524 "stream is required and must not be None; " 

525 "pass device.default_stream explicitly to use the default stream." 

526 ) 

527 if isinstance(arg, Stream): 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

528 return <Stream>(arg) 20 C D W gbX hba b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 EbFbGbJ ! cbkblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gCbDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb

529 elif isinstance(arg, GraphBuilder): 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I odpdqdrdsdtd1 2 3 4 5 6 7 8 9 }c~cadEbFbGbJ ! JdKdLdMdudw B CbZh

530 return <Stream>(arg.stream) 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I odpdqdrdsdtd1 2 3 4 5 6 7 8 9 }c~cadEbFbGbJ ! JdKdLdMdudw Cb

531 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 2B Zh

532 stream = Stream._init(arg) 1B

533 warnings.warn( 1B

534 "Passing foreign stream objects to this function via the " 

535 "stream protocol is deprecated. Convert the object explicitly " 

536 "using Stream(obj) instead.", 

537 stacklevel=2, 

538 category=DeprecationWarning, 1B

539 ) 

540 return <Stream>(stream) 1B

541 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}") 2Zh