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

204 statements  

« prev     ^ index     » next       coverage.py v7.14.1, created at 2026-06-13 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( 2ph

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) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

105 s._h_stream = h_stream 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

106 s._h_context = get_stream_context(h_stream) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

107 s._device_id = -1 # lazy init'd (invalid sentinel) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

108 s._nonblocking = -1 # lazy init'd 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

109 s._priority = INT32_MIN # lazy init'd 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

110 return s 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3

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()) 2; #g

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()) 2; $g

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 cdef Stream self 

129  

130 # Extract context handle if provided 

131 if ctx is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3

132 h_context = (<Context>ctx)._h_context 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH ~dae2 3

133  

134 if obj is not None and options is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3

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

136 if obj is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3

137 # Borrowed stream from foreign object 

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

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

140 borrowed = _handle_from_stream_protocol(obj) 2D E F K L u KeG M H 3

141 h_stream = create_stream_handle_with_owner(borrowed, obj) 2D E F K L u KeG M H

142 return Stream._from_handle(cls, h_stream) 2D E F K L u KeG M H

143  

144 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

145 nonblocking = opts.nonblocking 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

146 priority = opts.priority 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

147  

148 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

149 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2Me

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

151 cdef int high, low 

152 cdef cydriver.CUresult res_code 

153 with nogil: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

154 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

155 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

156 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 

157 raise RuntimeError( 

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

159 ) 

160 HANDLE_RETURN(res_code) 

161 cdef int prio 

162 if priority is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

163 prio = priority 2kdyd

164 if not (low <= prio <= high): 2kdyd

165 raise ValueError(f"{priority=} is out of range {[low, high]}") 2yd

166 else: 

167 prio = high 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|d}dM %cH Le~dae2 3

168  

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

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

171 h_stream = create_stream_handle(h_context, flags, prio) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

172 if not h_stream: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

173 res_code = get_last_error() 2Me

174 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2Me

175 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT; 

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

177 raise ValueError( 2Me

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

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

180 ) 

181 elif res_code == cydriver.CUresult.CUDA_ERROR_NOT_SUPPORTED: 

182 raise RuntimeError( 

183 "cuGreenCtxStreamCreate is not available. " 

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

185 ) 

186 else: 

187 HANDLE_RETURN(res_code) 

188 self = Stream._from_handle(cls, h_stream) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

189 self._nonblocking = int(nonblocking) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

190 self._priority = prio 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

191 if device_id is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

192 self._device_id = device_id 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

193 return self 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3

194  

195 cpdef close(self): 

196 """Destroy the stream. 

197  

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

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

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

201 """ 

202 self._h_stream.reset() 27dR w 8dx jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv : |c

203  

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

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

206 return (0, as_intptr(self._h_stream)) 1Du

207  

208 def __hash__(self) -> int: 

209 return hash(as_intptr(self._h_stream)) 2E cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCe4d5dqh%gF u EeG 6dH

210  

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

212 if not isinstance(other, Stream): 2xdE 9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d4d5d%gF {dK L u G 6d|dM H ae

213 return NotImplemented 2xd9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_dae

214 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 2xdE `d4d5d%gF {dK L u G 6d|dM H

215  

216 def __repr__(self) -> str: 

217 Stream_ensure_ctx(self) 2N O 4 5 6 7 8 9 ! # id

218 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2N O 4 5 6 7 8 9 ! # id

219  

220 @property 

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

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

223  

224 .. caution:: 

225  

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

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

228 """ 

229 return as_py(self._h_stream) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv be-ehdxdE F K L DeG M H

230  

231 @property 

232 def is_nonblocking(self) -> bool: 

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

234 cdef unsigned int flags 

235 if self._nonblocking == -1: 2kd}d

236 with nogil: 

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

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

239 return bool(self._nonblocking) 2kd}d

240  

241 @property 

242 def priority(self) -> int: 

243 """Return the stream priority.""" 

244 cdef int prio 

245 if self._priority == INT32_MIN: 2kdyd

246 with nogil: 

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

248 self._priority = prio 

249 return self._priority 2kdyd

250  

251 def sync(self) -> None: 

252 """Synchronize the stream.""" 

253 with nogil: 2cdddR w Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . NeS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / @ [ }c~c] adbd^ _ { I | J } ~ abP bbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e: |cdb~d2

254 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2cdddR w Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . NeS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / @ [ }c~c] adbd^ _ { I | J } ~ abP bbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e: |cdb~d2

255  

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

257 """Record an event onto the stream. 

258  

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

260 recording on the stream. 

261  

262 Parameters 

263 ---------- 

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

265 Optional event object to be reused for recording. 

266 options : :obj:`EventOptions`, optional 

267 Customizable dataclass for event creation options. 

268  

269 Returns 

270 ------- 

271 :obj:`~_event.Event` 

272 Newly created event object. 

273  

274 """ 

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

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

277 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions. 

278 if event is None: 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

279 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

280 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

281 elif event.is_ipc_enabled: 1`

282 raise TypeError( 1`

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

284 "new event by supplying options." 

285 ) 

286  

287 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

288 with nogil: 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

289 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

290 return event 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2

291  

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

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

294  

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

296  

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

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

299 on the stream and then waiting on it. 

300  

301 Parameters 

302 ---------- 

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

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

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

306 streams. 

307  

308 """ 

309 cdef Stream stream 

310 cdef EventHandle h_event 

311  

312 # Handle Event directly 

313 if isinstance(event_or_stream, Event): 1wxabcdefghijklmnopqrstv23

314 with nogil: 1wxabcdefghijklmnopqrstv2

315 # TODO: support flags other than 0? 

316 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1wxabcdefghijklmnopqrstv2

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

318 return 1wxabcdefghijklmnopqrstv2

319  

320 # Convert to Stream if needed 

321 if isinstance(event_or_stream, Stream): 1wxabcdefghijklmnopqrstv3

322 stream = <Stream>event_or_stream 1wxabcdefghijklmnopqrstv

323 else: 

324 try: 13

325 stream = Stream._init(obj=event_or_stream) 13

326 except Exception as e: 13

327 raise ValueError( 13

328 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 13

329 f" got {type(event_or_stream)}" 13

330 ) from e 13

331  

332 # Wait on stream via temporary event 

333 with nogil: 1wxabcdefghijklmnopqrstv

334 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1wxabcdefghijklmnopqrstv

335 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1wxabcdefghijklmnopqrstv

336 # TODO: support flags other than 0? 

337 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1wxabcdefghijklmnopqrstv

338  

339 @property 

340 def device(self) -> Device: 

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

342  

343 Note 

344 ---- 

345 The current context on the device may differ from this 

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

347 context is set current after a stream is created. 

348  

349 """ 

350 from cuda.core._device import Device # avoid circular import 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu

351 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu

352 return Device(self._device_id) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu

353  

354 @property 

355 def context(self) -> Context: 

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

357 Stream_ensure_ctx(self) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu

358 Stream_ensure_ctx_device(self) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu

359 return Context._from_handle(Context, self._h_context, self._device_id) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu

360  

361 @property 

362 def resources(self) -> DeviceResources: 

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

364  

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

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

367 context, returns the full device resources. 

368 """ 

369 Stream_ensure_ctx(self) 2?c

370 Stream_ensure_ctx_device(self) 2?c

371 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2?c

372  

373 @staticmethod 

374 def from_handle(handle) -> Stream: 

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

376  

377 Uses a cudaStream_t pointer address represented as a Python int 

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

379  

380 Note 

381 ---- 

382 Stream lifetime is not managed, foreign object must remain 

383 alive while this stream is active. 

384  

385 Parameters 

386 ---------- 

387 handle : int 

388 Stream handle representing the address of a foreign 

389 stream object. 

390  

391 Returns 

392 ------- 

393 :obj:`~_stream.Stream` 

394 Newly created stream object. 

395  

396 """ 

397  

398 class _stream_holder: 2E F K L KeG M H

399 def __cuda_stream__(self) -> tuple[int, int]: 2E F K L KeG M H

400 return (0, handle) 2E F K L KeG M H

401  

402 return Stream._init(obj=_stream_holder()) 2E F K L KeG M H

403  

404 def create_graph_builder(self) -> GraphBuilder: 

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

406  

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

408  

409 Returns 

410 ------- 

411 :obj:`~graph.GraphBuilder` 

412 Newly created graph builder object. 

413  

414 """ 

415 from cuda.core.graph._graph_builder import GraphBuilder 2cdddQ %

416  

417 return GraphBuilder._init(stream=self, is_stream_owner=False) 2cdddQ %

418  

419  

420LEGACY_DEFAULT_STREAM: Stream = Stream._legacy_default() 

421PER_THREAD_DEFAULT_STREAM: Stream = Stream._per_thread_default() 

422  

423  

424cpdef Stream default_stream(): 

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

426  

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

428 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set. 

429  

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

431 the legacy stream. 

432  

433 """ 

434 # TODO: flip the default 

435 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

436  

437 cdef int use_ptds = 0 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

438 if use_ptds_raw != NULL: 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

439 use_ptds = strtol(use_ptds_raw, NULL, 10) 

440  

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

442 if use_ptds: 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

443 return PER_THREAD_DEFAULT_STREAM 

444 else: 

445 return LEGACY_DEFAULT_STREAM 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

446  

447  

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

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

450 cdef cydriver.CUcontext ctx 

451 if not self._h_context: 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu

452 self._h_context = get_stream_context(self._h_stream) 

453 if self._h_context: 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu

454 return 0 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu

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

456 if ctx != NULL: 

457 with gil: 

458 self._h_context = create_context_handle_ref(ctx) 

459 return 0 

460  

461  

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

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

464 cdef cydriver.CUcontext ctx 

465 cdef cydriver.CUdevice target_dev 

466 cdef ContextHandle current_context 

467 cdef bint switch_context 

468  

469 if self._device_id < 0: 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # ` fdgd-c.c/c:c;c=c{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ?c@cP cb!c#c$c[cjdu %c2

470 with nogil: 1u

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

472 Stream_ensure_ctx(self) 1u

473 current_context = get_current_context() 1u

474 switch_context = (as_cu(current_context) != as_cu(self._h_context)) 1u

475 if switch_context: 1u

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

477 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1u

478 if switch_context: 1u

479 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 

480 self._device_id = <int>target_dev 1u

481 return 0 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # ` fdgd-c.c/c:c;c=c{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ?c@cP cb!c#c$c[cjdu %c2

482  

483  

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

485 if isinstance(obj, Stream): 2D E F K L u KeG M H 3

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

487  

488 try: 2D E F K L u KeG M H 3

489 cuda_stream_attr = obj.__cuda_stream__ 2D E F K L u KeG M H 3

490 except AttributeError: 13

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

492  

493 if callable(cuda_stream_attr): 2D E F K L u KeG M H

494 info = cuda_stream_attr() 2D E F K L u KeG M H

495 else: 

496 info = cuda_stream_attr 

497 warnings.simplefilter("once", DeprecationWarning) 

498 warnings.warn( 

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

500 stacklevel=3, 

501 category=DeprecationWarning, 

502 ) 

503  

504 try: 2D E F K L u KeG M H

505 len_info = len(info) 2D E F K L u KeG M H

506 except TypeError as e: 

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

508 if len_info != 2: 2D E F K L u KeG M H

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

510 if info[0] != 0: 2D E F K L u KeG M H

511 raise RuntimeError( 

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

513 ) 

514 return <cydriver.CUstream><uintptr_t>(info[1]) 2D E F K L u KeG M H

515  

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

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

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

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

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

521 from cuda.core.graph._graph_builder import GraphBuilder 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgohxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

522  

523 if arg is None: 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgohxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

524 raise TypeError( 2oh

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

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

527 ) 

528 if isinstance(arg, Stream): 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

529 return <Stream>(arg) 2R Q % a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 fbgbhbC 1 / @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g

530 elif isinstance(arg, GraphBuilder): 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv D

531 return <Stream>(arg.stream) 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv

532 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 1D

533 stream = Stream._init(arg) 1D

534 warnings.warn( 1D

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

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

537 "using Stream(obj) instead.", 

538 stacklevel=2, 

539 category=DeprecationWarning, 1D

540 ) 

541 return <Stream>(stream) 1D

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