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

204 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-07-19 01:12 +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( 2^h

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) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

105 s._h_stream = h_stream 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

106 s._h_context = get_stream_context(h_stream) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

107 s._device_id = -1 # lazy init'd (invalid sentinel) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

108 s._nonblocking = -1 # lazy init'd 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

109 s._priority = INT32_MIN # lazy init'd 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

110 return s 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

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()) 2ybKh

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()) 2ybLh

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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

132 h_context = (<Context>ctx)._h_context 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO EeFeZ 0 AbBbRdidjdkdcb

133  

134 if obj is not None and options is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

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

136 if obj is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

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) 2B L M R S v /eN T O 0

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

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

143  

144 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

145 nonblocking = opts.nonblocking 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

146 priority = opts.priority 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

147  

148 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

149 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2;e

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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

154 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

155 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

163 prio = priority 2Qd5d

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

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

166 else: 

167 prio = high 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeDeT _cO :eEeFeZ 0 AbBbRdidjdkdcb

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) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

172 if not h_stream: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

173 res_code = get_last_error() 2;e

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

175 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT; 

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

177 raise ValueError( 2;e

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) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

189 self._nonblocking = int(nonblocking) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

190 self._priority = prio 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

191 if device_id is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

192 self._device_id = device_id 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

193 return self 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb

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() 2dbebbbldAbBbRdidjdkd

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

207  

208 def __hash__(self) -> int: 

209 return hash(as_intptr(self._h_stream)) 2L HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7eaebe_hMhM v 9eN ceO

210  

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

212 if not isinstance(other, Stream): 24dL deeexbfegeheiejekelemeneoepeqereseteuevewexeyezeAeaebeMhM BeR S v N ceCeT O Fe

213 return NotImplemented 24ddeeexbfegeheiejekelemeneoepeqereseteuevewexeyezeFe

214 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 24dL AeaebeMhM BeR S v N ceCeT O

215  

216 def __repr__(self) -> str: 

217 Stream_ensure_ctx(self) 2U V K $ % ' ( ) * + Od

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

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) 2xdydzdAd1 C - D X x Y `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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ 2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # absdw GeCfNd4dL M R S 8eN T O Abidjdkdcb

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: 2QdDe

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

240  

241 @property 

242 def priority(self) -> int: 

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

244 cdef int prio 

245 if self._priority == INT32_MIN: 2Qd5d

246 with nogil: 

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

248 self._priority = prio 

249 return self._priority 2Qd5d

250  

251 def sync(self) -> None: 

252 """Synchronize the stream.""" 

253 with nogil: 2xdydzdAd1 C D X x dbY `ceba 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d=e?e@e: ; = [e? @ [ ] ]e^e^ ~d_e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abhbibtdudjbvdwdkblbK nbP obQ pbqbrbW sbtbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfbbldubvbwbEeZ AbidjdkdBfcb

254 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2xdydzdAd1 C D X x dbY `ceba 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d=e?e@e: ; = [e? @ [ ] ]e^e^ ~d_e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abhbibtdudjbvdwdkblbK nbP obQ pbqbrbW sbtbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfbbldubvbwbEeZ AbidjdkdBfcb

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: 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

279 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

280 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

281 elif event.is_ipc_enabled: 2mb

282 raise TypeError( 2mb

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) 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

288 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

289 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

290 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ

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): 1yzxAabcdefghijklmnopqrstuwZ0

314 with nogil: 1yzxAabcdefghijklmnopqrstuwZ

315 # TODO: support flags other than 0? 

316 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1yzxAabcdefghijklmnopqrstuwZ

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

318 return 1yzxAabcdefghijklmnopqrstuwZ

319  

320 # Convert to Stream if needed 

321 if isinstance(event_or_stream, Stream): 1yzxAabcdefghijklmnopqrstuw0

322 stream = <Stream>event_or_stream 1yzxAabcdefghijklmnopqrstuw

323 else: 

324 try: 10

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

326 except Exception as e: 10

327 raise ValueError( 10

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

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

330 ) from e 10

331  

332 # Wait on stream via temporary event 

333 with nogil: 1yzxAabcdefghijklmnopqrstuw

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

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

336 # TODO: support flags other than 0? 

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

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

351 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 tbPdv

352 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 tbPdv

353  

354 @property 

355 def context(self) -> Context: 

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

357 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 ~cadbdcdddedgdW hdv

358 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 ~cadbdcdddedgdW hdv

359 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 ~cadbdcdddedgdW hdv

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

370 Stream_ensure_ctx_device(self) 2fd

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

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: 2L M R S /eN T O

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

400 return (0, handle) 2L M R S /eN T O

401  

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

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 2xdydzdAdX dbY eb

416  

417 return GraphBuilder._init(self) 2xdydzdAdX dbY eb

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") 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

436  

437 cdef int use_ptds = 0 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

438 if use_ptds_raw != NULL: 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

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: 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

443 return PER_THREAD_DEFAULT_STREAM 

444 else: 

445 return LEGACY_DEFAULT_STREAM 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

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: 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv

452 self._h_context = get_stream_context(self._h_stream) 

453 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv

454 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv

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: 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 U V K $ % ' ( ) * + mbLdMd~cadbdcdddednbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, fdgdW tb[c]c^chdPdv _cZ

470 with nogil: 1v

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

472 Stream_ensure_ctx(self) 1v

473 current_context = get_current_context() 1v

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

475 if switch_context: 1v

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

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

478 if switch_context: 1v

479 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 

480 self._device_id = <int>target_dev 1v

481 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 U V K $ % ' ( ) * + mbLdMd~cadbdcdddednbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, fdgdW tb[c]c^chdPdv _cZ

482  

483  

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

485 if isinstance(obj, Stream): 2B L M R S v /eN T O 0

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

487  

488 try: 2B L M R S v /eN T O 0

489 cuda_stream_attr = obj.__cuda_stream__ 2B L M R S v /eN T O 0

490 except AttributeError: 10

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

492  

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

494 info = cuda_stream_attr() 2B L M R S v /eN T O

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: 2B L M R S v /eN T O

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

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: 2B L M R S v /eN T O

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

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

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]) 2B L M R S v /eN T O

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 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*g]hAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

522  

523 if arg is None: 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*g]hAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

524 raise TypeError( 2]h

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): 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

529 return <Stream>(arg) 21 C D X dbY eba 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! CbDbEbJ # abhbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gAbBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb

530 elif isinstance(arg, GraphBuilder): 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 mdndodpdqdrd2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # GdHdIdJdsdw B AbNh

531 return <Stream>(arg.stream) 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 mdndodpdqdrd2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # GdHdIdJdsdw Ab

532 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 2B Nh

533 stream = Stream._init(arg) 1B

534 warnings.warn( 1B

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, 1B

540 ) 

541 return <Stream>(stream) 1B

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