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
« 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
5from __future__ import annotations
7from libc.stdint cimport uintptr_t, INT32_MIN
8from libc.stdlib cimport strtol, getenv
10from cuda.bindings cimport cydriver
12from cuda.core._event cimport Event as cyEvent
13from cuda.core._utils.cuda_utils cimport (
14 check_or_create_options,
15 HANDLE_RETURN,
16)
18import cython
19import warnings
20from dataclasses import dataclass
21from typing import Protocol
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)
46@dataclass
47cdef class StreamOptions:
48 """Customizable :obj:`~_stream.Stream` options.
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)
58 """
60 nonblocking : cython.bint = True
61 priority: int | None = None
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 ...
75cdef class Stream:
76 """Represent a queue of GPU operations that are executed in a specific order.
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.
83 Advanced users can utilize default streams for enforce complex
84 implicit synchronization behaviors.
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 )
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
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
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
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
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
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
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
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
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
191 cpdef close(self):
192 """Destroy the stream.
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
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
204 def __hash__(self) -> int:
205 return hash(as_intptr(self._h_stream)) 2F aebecehbdeeefegeheiejekelemeneoepeqereseteuevewexeyezeAe2d3dnh!gG u CeH 4dI
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
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
216 @property
217 def handle(self) -> cuda.bindings.driver.CUstream:
218 """Return the underlying ``CUstream`` object.
220 .. caution::
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
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
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
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
252 def record(self, event: Event = None, options: EventOptions = None) -> Event:
253 """Record an event onto the stream.
255 Creates an :obj:`~_event.Event` object (or reuses the given one) by
256 recording on the stream.
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.
265 Returns
266 -------
267 :obj:`~_event.Event`
268 Newly created event object.
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 )
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
288 def wait(self, event_or_stream: Event | Stream):
289 """Wait for a CUDA event or a CUDA stream.
291 Waiting for an event or a stream establishes a stream order.
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.
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.
304 """
305 cdef Stream stream
306 cdef EventHandle h_event
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
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
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
335 @property
336 def device(self) -> Device:
337 """Return the :obj:`~_device.Device` singleton associated with this stream.
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.
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
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
357 @property
358 def resources(self):
359 """Query the hardware resources provisioned for this stream's context.
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
369 @staticmethod
370 def from_handle(handle: int) -> Stream:
371 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle.
373 Uses a cudaStream_t pointer address represented as a Python int
374 to create a new :obj:`~_stream.Stream` object.
376 Note
377 ----
378 Stream lifetime is not managed, foreign object must remain
379 alive while this stream is active.
381 Parameters
382 ----------
383 handle : int
384 Stream handle representing the address of a foreign
385 stream object.
387 Returns
388 -------
389 :obj:`~_stream.Stream`
390 Newly created stream object.
392 """
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
398 return Stream._init(obj=_stream_holder()) 2F G L M IeH N I
400 def create_graph_builder(self) -> "GraphBuilder":
401 """Create a new :obj:`~graph.GraphBuilder` object.
403 The new graph builder will be associated with this stream.
405 Returns
406 -------
407 :obj:`~graph.GraphBuilder`
408 Newly created graph builder object.
410 """
411 from cuda.core.graph._graph_builder import GraphBuilder 2bdcdR %
413 return GraphBuilder._init(stream=self, is_stream_owner=False) 2bdcdR %
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()
420# standard python objects, public
421LEGACY_DEFAULT_STREAM = C_LEGACY_DEFAULT_STREAM
422PER_THREAD_DEFAULT_STREAM = C_PER_THREAD_DEFAULT_STREAM
425cpdef Stream default_stream():
426 """Return the default CUDA :obj:`~_stream.Stream`.
428 The type of default stream returned depends on if the environment
429 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set.
431 If set, returns a per-thread default stream. Otherwise returns
432 the legacy stream.
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
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)
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
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
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
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
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)
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
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 )
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
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
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__}")