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

183 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-29 01:27 +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 

22  

23from cuda.core._context cimport Context 

24from cuda.core._event import Event, EventOptions 

25from cuda.core._resource_handles cimport ( 

26 ContextHandle, 

27 EventHandle, 

28 StreamHandle, 

29 create_context_handle_ref, 

30 create_event_handle_noctx, 

31 create_stream_handle, 

32 create_stream_handle_with_owner, 

33 get_current_context, 

34 get_legacy_stream, 

35 get_per_thread_stream, 

36 as_intptr, 

37 as_cu, 

38 as_py, 

39) 

40  

41  

42  

43@dataclass 

44cdef class StreamOptions: 

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

46  

47 Attributes 

48 ---------- 

49 nonblocking : bool, optional 

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

51 priority : int, optional 

52 Stream priority where lower number represents a 

53 higher priority. (Default to lowest priority) 

54  

55 """ 

56  

57 nonblocking : cython.bint = True 

58 priority: int | None = None 

59  

60  

61class IsStreamT(Protocol): 

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

63 """ 

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

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

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

67 should be Python `int`. 

68 """ 

69 ... 

70  

71  

72cdef class Stream: 

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

74  

75 Applications use streams to control the order of execution for 

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

77 Whereas work across multiple streams can be further controlled 

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

79  

80 Advanced users can utilize default streams for enforce complex 

81 implicit synchronization behaviors. 

82  

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

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

85 object, or created directly through using an existing handle 

86 using Stream.from_handle(). 

87 """ 

88 def __init__(self, *args, **kwargs): 

89 raise RuntimeError( 2Cg

90 "Stream objects cannot be instantiated directly. " 

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

92 ) 

93  

94 @staticmethod 

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

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

97 cdef Stream s = cls.__new__(cls) 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

98 s._h_stream = h_stream 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

99 # _h_context is default-initialized to empty ContextHandle by C++ 

100 s._device_id = -1 # lazy init'd (invalid sentinel) 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

101 s._nonblocking = -1 # lazy init'd 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

102 s._priority = INT32_MIN # lazy init'd 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

103 return s 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y

104  

105 @classmethod 

106 def _legacy_default(cls): 

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

108 return Stream._from_handle(cls, get_legacy_stream()) 20 Qe

109  

110 @classmethod 

111 def _per_thread_default(cls): 

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

113 return Stream._from_handle(cls, get_per_thread_stream()) 20 Re

114  

115 @classmethod 

116 def _init(cls, obj: IsStreamT | None = None, options=None, device_id: int = None, 

117 ctx: Context = None): 

118 cdef StreamHandle h_stream 

119 cdef cydriver.CUstream borrowed 

120 cdef ContextHandle h_context 

121 cdef Stream self 

122  

123 # Extract context handle if provided 

124 if ctx is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y

125 h_context = (<Context>ctx)._h_context 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ #d$dX Y

126  

127 if obj is not None and options is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y

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

129 if obj is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y

130 # Borrowed stream from foreign object 

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

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

133 borrowed = _handle_from_stream_protocol(obj) 20 D G H K L u jeI M J Y

134 h_stream = create_stream_handle_with_owner(borrowed, obj) 2D G H K L u jeI M J

135 return Stream._from_handle(cls, h_stream) 2D G H K L u jeI M J

136  

137 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

138 nonblocking = opts.nonblocking 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

139 priority = opts.priority 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

140  

141 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

142 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 

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

144 cdef int high, low 

145 with nogil: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

146 HANDLE_RETURN(cydriver.cuCtxGetStreamPriorityRange(&high, &low)) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

147 cdef int prio 

148 if priority is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

149 prio = priority 27b!b

150 if not (low <= prio <= high): 27b!b

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

152 else: 

153 prio = high 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d!dM jbJ ke#d$dX Y

154  

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

156 h_stream = create_stream_handle(h_context, flags, prio) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

157 if not h_stream: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

158 raise RuntimeError("Failed to create CUDA stream") 

159 self = Stream._from_handle(cls, h_stream) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

160 self._nonblocking = int(nonblocking) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

161 self._priority = prio 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

162 if device_id is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

163 self._device_id = device_id 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

164 return self 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y

165  

166 cpdef close(self): 

167 """Destroy the stream. 

168  

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

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

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

172 """ 

173 self._h_stream.reset() 2Id1 w Jdx kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv

174  

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

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

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

178  

179 def __hash__(self) -> int: 

180 return hash(as_intptr(self._h_stream)) 2G 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeFdGdDgPeH u feI HdJ

181  

182 def __eq__(self, other) -> bool: 

183 if not isinstance(other, Stream): 29bG KdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7dFdGdPeH 8dK L u I Hd9dM J $d

184 return NotImplemented 29bKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d$d

185 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 29bG 7dFdGdPeH 8dK L u I Hd9dM J

186  

187 def __repr__(self) -> str: 

188 Stream_ensure_ctx(self) 2E F P Q R S T U V W Tb

189 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2E F P Q R S T U V W Tb

190  

191 @property 

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

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

194  

195 .. caution:: 

196  

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

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

199 """ 

200 return as_py(self._h_stream) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv %d8b9bG H K L eeI M J

201  

202 @property 

203 def is_nonblocking(self) -> bool: 

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

205 cdef unsigned int flags 

206 if self._nonblocking == -1: 27b!d

207 with nogil: 

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

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

210 return bool(self._nonblocking) 27b!d

211  

212 @property 

213 def priority(self) -> int: 

214 """Return the stream priority.""" 

215 cdef int prio 

216 if self._priority == INT32_MIN: 27b!b

217 with nogil: 

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

219 self._priority = prio 

220 return self._priority 27b!b

221  

222 def sync(self): 

223 """Synchronize the stream.""" 

224 with nogil: 20b1b1 w Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ub6 7 ' ( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe) #dX

225 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 20b1b1 w Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ub6 7 ' ( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe) #dX

226  

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

228 """Record an event onto the stream. 

229  

230 Creates an Event object (or reuses the given one) by 

231 recording on the stream. 

232  

233 Parameters 

234 ---------- 

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

236 Optional event object to be reused for recording. 

237 options : :obj:`EventOptions`, optional 

238 Customizable dataclass for event creation options. 

239  

240 Returns 

241 ------- 

242 :obj:`~_event.Event` 

243 Newly created event object. 

244  

245 """ 

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

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

248 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions. 

249 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 E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

250 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 E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

251 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 E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

252 elif event.is_ipc_enabled: 15

253 raise TypeError( 15

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

255 "new event by supplying options." 

256 ) 

257  

258 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 E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

259 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 E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

260 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 E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

261 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 E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX

262  

263 def wait(self, event_or_stream: Event | Stream): 

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

265  

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

267  

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

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

270 on the stream and then waiting on it. 

271  

272 """ 

273 cdef Stream stream 

274 cdef EventHandle h_event 

275  

276 # Handle Event directly 

277 if isinstance(event_or_stream, Event): 1wxabcdefghijklmnopqrstvXY

278 with nogil: 1wxabcdefghijklmnopqrstvX

279 # TODO: support flags other than 0? 

280 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1wxabcdefghijklmnopqrstvX

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

282 return 1wxabcdefghijklmnopqrstvX

283  

284 # Convert to Stream if needed 

285 if isinstance(event_or_stream, Stream): 1wxabcdefghijklmnopqrstvY

286 stream = <Stream>event_or_stream 1wxabcdefghijklmnopqrstv

287 else: 

288 try: 1Y

289 stream = Stream._init(obj=event_or_stream) 1Y

290 except Exception as e: 1Y

291 raise ValueError( 1Y

292 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 1Y

293 f" got {type(event_or_stream)}" 1Y

294 ) from e 1Y

295  

296 # Wait on stream via temporary event 

297 with nogil: 1wxabcdefghijklmnopqrstv

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

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

300 # TODO: support flags other than 0? 

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

302  

303 @property 

304 def device(self) -> Device: 

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

306  

307 Note 

308 ---- 

309 The current context on the device may differ from this 

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

311 context is set current after a stream is created. 

312  

313 """ 

314 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 ( 6bu

315 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 ( 6bu

316 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 ( 6bu

317  

318 @property 

319 def context(self) -> Context: 

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

321 Stream_ensure_ctx(self) 1abcdefghijklmnopqrstyzABCv89!#$%*u

322 Stream_ensure_ctx_device(self) 1abcdefghijklmnopqrstyzABCv89!#$%*u

323 return Context._from_handle(Context, self._h_context, self._device_id) 1abcdefghijklmnopqrstyzABCv89!#$%*u

324  

325 @staticmethod 

326 def from_handle(handle: int) -> Stream: 

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

328  

329 Uses a cudaStream_t pointer address represented as a Python int 

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

331  

332 Note 

333 ---- 

334 Stream lifetime is not managed, foreign object must remain 

335 alive while this steam is active. 

336  

337 Parameters 

338 ---------- 

339 handle : int 

340 Stream handle representing the address of a foreign 

341 stream object. 

342  

343 Returns 

344 ------- 

345 :obj:`~_stream.Stream` 

346 Newly created stream object. 

347  

348 """ 

349  

350 class _stream_holder: 2G H K L jeI M J

351 def __cuda_stream__(self): 2G H K L jeI M J

352 return (0, handle) 2G H K L jeI M J

353  

354 return Stream._init(obj=_stream_holder()) 2G H K L jeI M J

355  

356 def create_graph_builder(self) -> "GraphBuilder": 

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

358  

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

360  

361 Returns 

362 ------- 

363 :obj:`~graph.GraphBuilder` 

364 Newly created graph builder object. 

365  

366 """ 

367 from cuda.core.graph._graph_builder import GraphBuilder 20b1bZ 4

368  

369 return GraphBuilder._init(stream=self, is_stream_owner=False) 20b1bZ 4

370  

371  

372# c-only python objects, not public 

373cdef Stream C_LEGACY_DEFAULT_STREAM = Stream._legacy_default() 

374cdef Stream C_PER_THREAD_DEFAULT_STREAM = Stream._per_thread_default() 

375  

376# standard python objects, public 

377LEGACY_DEFAULT_STREAM = C_LEGACY_DEFAULT_STREAM 

378PER_THREAD_DEFAULT_STREAM = C_PER_THREAD_DEFAULT_STREAM 

379  

380  

381cpdef Stream default_stream(): 

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

383  

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

385 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set. 

386  

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

388 the legacy stream. 

389  

390 """ 

391 # TODO: flip the default 

392 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg

393  

394 cdef int use_ptds = 0 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg

395 if use_ptds_raw != NULL: 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg

396 use_ptds = strtol(use_ptds_raw, NULL, 10) 

397  

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

399 if use_ptds: 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg

400 return C_PER_THREAD_DEFAULT_STREAM 

401 else: 

402 return C_LEGACY_DEFAULT_STREAM 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg

403  

404  

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

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

407 cdef cydriver.CUcontext ctx 

408 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 E F P Q R S T U V W 8 9 ! # $ % Tb* u

409 HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx)) 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 E F P Q R S T U V W 8 9 ! # $ % Tb* u

410 with gil: 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 E F P Q R S T U V W 8 9 ! # $ % Tb* u

411 self._h_context = create_context_handle_ref(ctx) 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 E F P Q R S T U V W 8 9 ! # $ % Tb* u

412 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 E F P Q R S T U V W 8 9 ! # $ % Tb* u

413  

414  

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

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

417 cdef cydriver.CUcontext ctx 

418 cdef cydriver.CUdevice target_dev 

419 cdef bint switch_context 

420  

421 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 E F P Q R S T U V W 5 4b5b8 9 ! # $ % 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 ( gbhbib* 6bu jbX

422 with nogil: 1u

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

424 Stream_ensure_ctx(self) 1u

425 switch_context = (get_current_context() != self._h_context) 1u

426 if switch_context: 1u

427 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context))) 1u

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

429 if switch_context: 1u

430 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 1u

431 self._device_id = <int>target_dev 1u

432 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 E F P Q R S T U V W 5 4b5b8 9 ! # $ % 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 ( gbhbib* 6bu jbX

433  

434  

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

436 if isinstance(obj, Stream): 2D G H K L u jeI M J Y

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

438  

439 try: 2D G H K L u jeI M J Y

440 cuda_stream_attr = obj.__cuda_stream__ 2D G H K L u jeI M J Y

441 except AttributeError: 1Y

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

443  

444 if callable(cuda_stream_attr): 2D G H K L u jeI M J

445 info = cuda_stream_attr() 2D G H K L u jeI M J

446 else: 

447 info = cuda_stream_attr 

448 warnings.simplefilter("once", DeprecationWarning) 

449 warnings.warn( 

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

451 stacklevel=3, 

452 category=DeprecationWarning, 

453 ) 

454  

455 try: 2D G H K L u jeI M J

456 len_info = len(info) 2D G H K L u jeI M J

457 except TypeError as e: 

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

459 if len_info != 2: 2D G H K L u jeI M J

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

461 if info[0] != 0: 2D G H K L u jeI M J

462 raise RuntimeError( 

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

464 ) 

465 return <cydriver.CUstream><uintptr_t>(info[1]) 2D G H K L u jeI M J

466  

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

468# needed checks and returns the relevant stream. 

469cdef Stream Stream_accept(arg, bint allow_stream_protocol=False): 

470 from cuda.core.graph._graph_builder import GraphBuilder 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)

471  

472 if isinstance(arg, Stream): 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)

473 return <Stream>(arg) 24 MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? @ [ ] E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)

474 elif isinstance(arg, GraphBuilder): 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv D

475 return <Stream>(arg.stream) 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv

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

477 stream = Stream._init(arg) 1D

478 warnings.warn( 1D

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

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

481 "using Stream(obj) instead.", 

482 stacklevel=2, 

483 category=DeprecationWarning, 1D

484 ) 

485 return <Stream>(stream) 1D

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