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

203 statements  

« prev     ^ index     » next       coverage.py v7.14.0, created at 2026-05-22 01:37 +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._device_resources cimport DeviceResources 

25from cuda.core._event import Event, EventOptions 

26from cuda.core._resource_handles cimport ( 

27 ContextHandle, 

28 EventHandle, 

29 StreamHandle, 

30 create_context_handle_ref, 

31 create_event_handle_noctx, 

32 create_stream_handle, 

33 create_stream_handle_with_owner, 

34 get_current_context, 

35 get_last_error, 

36 get_legacy_stream, 

37 get_per_thread_stream, 

38 get_stream_context, 

39 as_intptr, 

40 as_cu, 

41 as_py, 

42) 

43  

44  

45  

46@dataclass 

47cdef class StreamOptions: 

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

49  

50 Attributes 

51 ---------- 

52 nonblocking : bool, optional 

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

54 priority : int, optional 

55 Stream priority where lower number represents a 

56 higher priority. (Default to lowest priority) 

57  

58 """ 

59  

60 nonblocking : cython.bint = True 

61 priority: int | None = None 

62  

63  

64class IsStreamType(Protocol): 

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

66 """ 

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

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

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

70 should be Python `int`. 

71 """ 

72 ... 

73  

74  

75cdef class Stream: 

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

77  

78 Applications use streams to control the order of execution for 

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

80 Whereas work across multiple streams can be further controlled 

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

82  

83 Advanced users can utilize default streams for enforce complex 

84 implicit synchronization behaviors. 

85  

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

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

88 object, or created directly through using an existing handle 

89 using Stream.from_handle(). 

90 """ 

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

92 raise RuntimeError( 2mh

93 "Stream objects cannot be instantiated directly. " 

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

95 ) 

96  

97 @staticmethod 

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

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

100 cdef Stream s = cls.__new__(cls) 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

101 s._h_stream = h_stream 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

102 s._h_context = get_stream_context(h_stream) 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

103 s._device_id = -1 # lazy init'd (invalid sentinel) 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

104 s._nonblocking = -1 # lazy init'd 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

105 s._priority = INT32_MIN # lazy init'd 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

106 return s 2: bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{d8gN 9gxd$cI Je|d}d3 4

107  

108 @classmethod 

109 def _legacy_default(cls): 

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

111 return Stream._from_handle(cls, get_legacy_stream()) 2: 8g

112  

113 @classmethod 

114 def _per_thread_default(cls): 

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

116 return Stream._from_handle(cls, get_per_thread_stream()) 2: 9g

117  

118 @classmethod 

119 def _init(cls, obj: IsStreamType | None = None, options=None, device_id: int = None, 

120 ctx: Context = None): 

121 cdef StreamHandle h_stream 

122 cdef cydriver.CUstream borrowed 

123 cdef ContextHandle h_context 

124 cdef Stream self 

125  

126 # Extract context handle if provided 

127 if ctx is not None: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{dN xd$cI Je|d}d3 4

128 h_context = (<Context>ctx)._h_context 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI |d}d3 4

129  

130 if obj is not None and options is not None: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{dN xd$cI Je|d}d3 4

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

132 if obj is not None: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u IeBeCeH 4d`djd{dN xd$cI Je|d}d3 4

133 # Borrowed stream from foreign object 

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

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

136 borrowed = _handle_from_stream_protocol(obj) 2D F G L M u IeH N I 4

137 h_stream = create_stream_handle_with_owner(borrowed, obj) 2D F G L M u IeH N I

138 return Stream._from_handle(cls, h_stream) 2D F G L M u IeH N I

139  

140 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

141 nonblocking = opts.nonblocking 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

142 priority = opts.priority 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

143  

144 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

145 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2Ke

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

147 cdef int high, low 

148 cdef cydriver.CUresult res_code 

149 with nogil: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

150 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

151 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

152 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 

153 raise RuntimeError( 

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

155 ) 

156 HANDLE_RETURN(res_code) 

157 cdef int prio 

158 if priority is not None: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

159 prio = priority 2jdxd

160 if not (low <= prio <= high): 2jdxd

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

162 else: 

163 prio = high 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`d{dN $cI Je|d}d3 4

164  

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

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

167 h_stream = create_stream_handle(h_context, flags, prio) 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

168 if not h_stream: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ Ke@cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

169 res_code = get_last_error() 2Ke

170 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2Ke

171 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT; 

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

173 raise ValueError( 2Ke

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

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

176 ) 

177 elif res_code == cydriver.CUresult.CUDA_ERROR_NOT_SUPPORTED: 

178 raise RuntimeError( 

179 "cuGreenCtxStreamCreate is not available. " 

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

181 ) 

182 else: 

183 HANDLE_RETURN(res_code) 

184 self = Stream._from_handle(cls, h_stream) 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

185 self._nonblocking = int(nonblocking) 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

186 self._priority = prio 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

187 if device_id is not None: 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

188 self._device_id = device_id 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

189 return self 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ |c}c[ ~cadDeEe] ^ mbnbobpbqbddP E 5 6 7 8 9 ! # O _ edfdrbsbtbubvbwbxbybzbAbBbCbDbEb-c.c/c:c;c=c~d` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ kdldmdndFeodpdqdrdsdtdudvd?c| } ~ @cQ abSbTbbbD UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7cgd8ccb9cwdF aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeye7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d!c#chd^dzeAe2d3dGeHe[cidG _dL M u BeCeH 4d`djd{dN xd$cI Je|d}d3 4

190  

191 cpdef close(self): 

192 """Destroy the stream. 

193  

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

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

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

197 """ 

198 self._h_stream.reset() 25dS w 6dx ib% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cT U V W X Y Z 0 1 jbkblbebfbgbC 2 ]c^c_c`c{cv

199  

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

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

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

203  

204 def __hash__(self) -> int: 

205 return hash(as_intptr(self._h_stream)) 2F aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeyezeAe2d3dnh!gG u CeH 4dI

206  

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

208 if not isinstance(other, Stream): 2wdF 7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d2d3d!gG _dL M u H 4d`dN I }d

209 return NotImplemented 2wd7d8ddb9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d}d

210 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 2wdF ^d2d3d!gG _dL M u H 4d`dN I

211  

212 def __repr__(self) -> str: 

213 Stream_ensure_ctx(self) 2P E 5 6 7 8 9 ! # O hd

214 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2P E 5 6 7 8 9 ! # O hd

215  

216 @property 

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

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

219  

220 .. caution:: 

221  

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

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

224 """ 

225 return as_py(self._h_stream) 2bdcd5dS w 6dx R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . 'c(c)c*c+c,cT U V W X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ~d)egdwdF G L M BeH N I

226  

227 @property 

228 def is_nonblocking(self) -> bool: 

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

230 cdef unsigned int flags 

231 if self._nonblocking == -1: 2jd{d

232 with nogil: 

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

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

235 return bool(self._nonblocking) 2jd{d

236  

237 @property 

238 def priority(self) -> int: 

239 """Return the stream priority.""" 

240 cdef int prio 

241 if self._priority == INT32_MIN: 2jdxd

242 with nogil: 

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

244 self._priority = prio 

245 return self._priority 2jdxd

246  

247 def sync(self): 

248 """Synchronize the stream.""" 

249 with nogil: 2bdcdS w R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . LeT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ? @ |c}c[ ~cad] ^ E ` J { K | } ~ Q abbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(ecb|d3

250 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2bdcdS w R ib% a b c d e f g h i j k l m n o p q r s t y z A B ydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYd' ( Zd0d1d%c) * + , - . LeT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ? @ |c}c[ ~cad] ^ E ` J { K | } ~ Q abbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(ecb|d3

251  

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

253 """Record an event onto the stream. 

254  

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

256 recording on the stream. 

257  

258 Parameters 

259 ---------- 

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

261 Optional event object to be reused for recording. 

262 options : :obj:`EventOptions`, optional 

263 Customizable dataclass for event creation options. 

264  

265 Returns 

266 ------- 

267 :obj:`~_event.Event` 

268 Newly created event object. 

269  

270 """ 

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

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

273 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions. 

274 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 P E 5 6 7 8 9 ! # O _ edfd` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

275 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 P E 5 6 7 8 9 ! # O _ edfd` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

276 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 P E 5 6 7 8 9 ! # O _ edfd` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

277 elif event.is_ipc_enabled: 1_

278 raise TypeError( 1_

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

280 "new event by supplying options." 

281 ) 

282  

283 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 P E 5 6 7 8 9 ! # O _ ` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

284 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 P E 5 6 7 8 9 ! # O _ ` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

285 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 P E 5 6 7 8 9 ! # O _ ` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

286 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 P E 5 6 7 8 9 ! # O _ ` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ Q 9c!c#c$c3

287  

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

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

290  

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

292  

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

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

295 on the stream and then waiting on it. 

296  

297 Parameters 

298 ---------- 

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

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

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

302 streams. 

303  

304 """ 

305 cdef Stream stream 

306 cdef EventHandle h_event 

307  

308 # Handle Event directly 

309 if isinstance(event_or_stream, Event): 1wxabcdefghijklmnopqrstv34

310 with nogil: 1wxabcdefghijklmnopqrstv3

311 # TODO: support flags other than 0? 

312 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1wxabcdefghijklmnopqrstv3

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

314 return 1wxabcdefghijklmnopqrstv3

315  

316 # Convert to Stream if needed 

317 if isinstance(event_or_stream, Stream): 1wxabcdefghijklmnopqrstv4

318 stream = <Stream>event_or_stream 1wxabcdefghijklmnopqrstv

319 else: 

320 try: 14

321 stream = Stream._init(obj=event_or_stream) 14

322 except Exception as e: 14

323 raise ValueError( 14

324 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 14

325 f" got {type(event_or_stream)}" 14

326 ) from e 14

327  

328 # Wait on stream via temporary event 

329 with nogil: 1wxabcdefghijklmnopqrstv

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

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

332 # TODO: support flags other than 0? 

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

334  

335 @property 

336 def device(self) -> Device: 

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

338  

339 Note 

340 ---- 

341 The current context on the device may differ from this 

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

343 context is set current after a stream is created. 

344  

345 """ 

346 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 bbidu

347 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 bbidu

348 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 bbidu

349  

350 @property 

351 def context(self) -> Context: 

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

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

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

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

356  

357 @property 

358 def resources(self): 

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

360  

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

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

363 context, returns the full device resources. 

364 """ 

365 Stream_ensure_ctx(self) 2?c

366 Stream_ensure_ctx_device(self) 2?c

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

368  

369 @staticmethod 

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

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

372  

373 Uses a cudaStream_t pointer address represented as a Python int 

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

375  

376 Note 

377 ---- 

378 Stream lifetime is not managed, foreign object must remain 

379 alive while this stream is active. 

380  

381 Parameters 

382 ---------- 

383 handle : int 

384 Stream handle representing the address of a foreign 

385 stream object. 

386  

387 Returns 

388 ------- 

389 :obj:`~_stream.Stream` 

390 Newly created stream object. 

391  

392 """ 

393  

394 class _stream_holder: 2F G L M IeH N I

395 def __cuda_stream__(self): 2F G L M IeH N I

396 return (0, handle) 2F G L M IeH N I

397  

398 return Stream._init(obj=_stream_holder()) 2F G L M IeH N I

399  

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

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

402  

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

404  

405 Returns 

406 ------- 

407 :obj:`~graph.GraphBuilder` 

408 Newly created graph builder object. 

409  

410 """ 

411 from cuda.core.graph._graph_builder import GraphBuilder 2bdcdR %

412  

413 return GraphBuilder._init(stream=self, is_stream_owner=False) 2bdcdR %

414  

415  

416# c-only python objects, not public 

417cdef Stream C_LEGACY_DEFAULT_STREAM = Stream._legacy_default() 

418cdef Stream C_PER_THREAD_DEFAULT_STREAM = Stream._per_thread_default() 

419  

420# standard python objects, public 

421LEGACY_DEFAULT_STREAM = C_LEGACY_DEFAULT_STREAM 

422PER_THREAD_DEFAULT_STREAM = C_PER_THREAD_DEFAULT_STREAM 

423  

424  

425cpdef Stream default_stream(): 

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

427  

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

429 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set. 

430  

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

432 the legacy stream. 

433  

434 """ 

435 # TODO: flip the default 

436 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 2S R 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) * + , - . LeT ; U V W = X Y Z 0 1 C 2 / ? @ #g$g%g'g*e(g)g+e[ *g,e+g-e,g-g.g] ^ mbnbobpbqbdd.e/e:e;e=e?eE O @e[e/g]e^e:g;g_e`e=g?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{gefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K | } ~ abSbTbMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e|gUbVb}g~gahbhchdhehqfrffhghWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5chhsftf6cihufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)ejhkhNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtg!gugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

437  

438 cdef int use_ptds = 0 2S R 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) * + , - . LeT ; U V W = X Y Z 0 1 C 2 / ? @ #g$g%g'g*e(g)g+e[ *g,e+g-e,g-g.g] ^ mbnbobpbqbdd.e/e:e;e=e?eE O @e[e/g]e^e:g;g_e`e=g?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{gefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K | } ~ abSbTbMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e|gUbVb}g~gahbhchdhehqfrffhghWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5chhsftf6cihufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)ejhkhNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtg!gugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

439 if use_ptds_raw != NULL: 2S R 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) * + , - . LeT ; U V W = X Y Z 0 1 C 2 / ? @ #g$g%g'g*e(g)g+e[ *g,e+g-e,g-g.g] ^ mbnbobpbqbdd.e/e:e;e=e?eE O @e[e/g]e^e:g;g_e`e=g?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{gefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K | } ~ abSbTbMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e|gUbVb}g~gahbhchdhehqfrffhghWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5chhsftf6cihufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)ejhkhNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtg!gugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

440 use_ptds = strtol(use_ptds_raw, NULL, 10) 

441  

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

443 if use_ptds: 2S R 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) * + , - . LeT ; U V W = X Y Z 0 1 C 2 / ? @ #g$g%g'g*e(g)g+e[ *g,e+g-e,g-g.g] ^ mbnbobpbqbdd.e/e:e;e=e?eE O @e[e/g]e^e:g;g_e`e=g?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{gefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K | } ~ abSbTbMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e|gUbVb}g~gahbhchdhehqfrffhghWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5chhsftf6cihufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)ejhkhNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtg!gugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

444 return C_PER_THREAD_DEFAULT_STREAM 

445 else: 

446 return C_LEGACY_DEFAULT_STREAM 2S R 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) * + , - . LeT ; U V W = X Y Z 0 1 C 2 / ? @ #g$g%g'g*e(g)g+e[ *g,e+g-e,g-g.g] ^ mbnbobpbqbdd.e/e:e;e=e?eE O @e[e/g]e^e:g;g_e`e=g?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{gefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K | } ~ abSbTbMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e|gUbVb}g~gahbhchdhehqfrffhghWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5chhsftf6cihufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)ejhkhNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtg!gugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

447  

448  

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

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

451 cdef cydriver.CUcontext ctx 

452 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 P E 5 6 7 8 9 ! # O -c.c/c:c;c=c?c@cQ hd[cu

453 self._h_context = get_stream_context(self._h_stream) 

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

455 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 P E 5 6 7 8 9 ! # O -c.c/c:c;c=c?c@cQ hd[cu

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

457 if ctx != NULL: 

458 with gil: 

459 self._h_context = create_context_handle_ref(ctx) 

460 return 0 

461  

462  

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

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

465 cdef cydriver.CUcontext ctx 

466 cdef cydriver.CUdevice target_dev 

467 cdef ContextHandle current_context 

468 cdef bint switch_context 

469  

470 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 P E 5 6 7 8 9 ! # O _ edfd-c.c/c:c;c=c` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ ?c@cQ bb9c!c#c[cidu $c3

471 with nogil: 1u

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

473 Stream_ensure_ctx(self) 1u

474 current_context = get_current_context() 1u

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

476 if switch_context: 1u

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

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

479 if switch_context: 1u

480 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 

481 self._device_id = <int>target_dev 1u

482 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 P E 5 6 7 8 9 ! # O _ edfd-c.c/c:c;c=c` J { FbGbHbIbJbKbK LbMbNbObPbQbRb$ ?c@cQ bb9c!c#c[cidu $c3

483  

484  

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

486 if isinstance(obj, Stream): 2D F G L M u IeH N I 4

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

488  

489 try: 2D F G L M u IeH N I 4

490 cuda_stream_attr = obj.__cuda_stream__ 2D F G L M u IeH N I 4

491 except AttributeError: 14

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

493  

494 if callable(cuda_stream_attr): 2D F G L M u IeH N I

495 info = cuda_stream_attr() 2D F G L M u IeH N I

496 else: 

497 info = cuda_stream_attr 

498 warnings.simplefilter("once", DeprecationWarning) 

499 warnings.warn( 

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

501 stacklevel=3, 

502 category=DeprecationWarning, 

503 ) 

504  

505 try: 2D F G L M u IeH N I

506 len_info = len(info) 2D F G L M u IeH N I

507 except TypeError as e: 

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

509 if len_info != 2: 2D F G L M u IeH N I

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

511 if info[0] != 0: 2D F G L M u IeH N I

512 raise RuntimeError( 

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

514 ) 

515 return <cydriver.CUstream><uintptr_t>(info[1]) 2D F G L M u IeH N I

516  

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

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

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

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

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

522 from cuda.core.graph._graph_builder import GraphBuilder 2S w x R ib% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Le'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ *e|c}c+e[ ~cad,e-e] ^ mbnbobpbqb.e/e:e;e=e?eP E @e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K $ kdldmdndodpdqdrdsdtdudvd| } ~ abSbTbbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(eUbVbqfrfWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5csftf6cufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)egdNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtglhugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

523  

524 if arg is None: 2S w x R ib% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Le'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ *e|c}c+e[ ~cad,e-e] ^ mbnbobpbqb.e/e:e;e=e?eP E @e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K $ kdldmdndodpdqdrdsdtdudvd| } ~ abSbTbbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(eUbVbqfrfWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5csftf6cufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)egdNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtglhugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

525 raise TypeError( 2lh

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

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

528 ) 

529 if isinstance(arg, Stream): 2S w x R ib% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Le'c(c)c*c+c,cT ; U V W = X Y Z 0 1 jbkblbebfbgbC 2 / ]c^c_c`c{cv ? @ *e|c}c+e[ ~cad,e-e] ^ mbnbobpbqb.e/e:e;e=e?eP E @e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K $ kdldmdndodpdqdrdsdtdudvd| } ~ abSbTbbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(eUbVbqfrfWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5csftf6cufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)egdNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

530 return <Stream>(arg) 2S R % a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Le'c(c)c*c+c,cT ; U V W = X Y Z 0 1 ebfbgbC 2 / ? @ *e|c}c+e[ ~cad,e-e] ^ mbnbobpbqb.e/e:e;e=e?eP E @e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjfrbsbtbubvbwbxbybkflfmfnfzbAbBbCbDbEbofpfJ K $ kdldmdndodpdqdrdsdtdudvd| } ~ abSbTbbbD MeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(eUbVbqfrfWbXbYbZb0b1b2b3b4b5b6b7b8b9b!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~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5csftf6cufvf7cwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMf)egdNfOfPf8cQfRfSfTfUfVfWfcbXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/fhb:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgdbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g

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

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

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

534 stream = Stream._init(arg) 1D

535 warnings.warn( 1D

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

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

538 "using Stream(obj) instead.", 

539 stacklevel=2, 

540 category=DeprecationWarning, 1D

541 ) 

542 return <Stream>(stream) 1D

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