Coverage for cuda/core/_stream.pyx: 82.35%
204 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-13 01:38 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-13 01:38 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
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, TYPE_CHECKING
23from cuda.core._context cimport Context
24from cuda.core._device_resources cimport DeviceResources
25from cuda.core._event import Event, EventOptions
27from cuda.core._resource_handles cimport (
28 ContextHandle,
29 EventHandle,
30 StreamHandle,
31 create_context_handle_ref,
32 create_event_handle_noctx,
33 create_stream_handle,
34 create_stream_handle_with_owner,
35 get_current_context,
36 get_last_error,
37 get_legacy_stream,
38 get_per_thread_stream,
39 get_stream_context,
40 as_intptr,
41 as_cu,
42 as_py,
43)
45if TYPE_CHECKING:
46 import cuda.bindings.driver # no-cython-lint
47 from cuda.core._device import Device
48 from cuda.core.graph import GraphBuilder
50@dataclass
51cdef class StreamOptions:
52 """Customizable :obj:`~_stream.Stream` options.
54 Attributes
55 ----------
56 nonblocking : bool, optional
57 Stream does not synchronize with the NULL stream. (Default to True)
58 priority : int, optional
59 Stream priority where lower number represents a
60 higher priority. (Default to lowest priority)
62 """
64 nonblocking : cython.bint = True
65 priority: int | None = None
68class IsStreamType(Protocol):
69 def __cuda_stream__(self) -> tuple[int, int]:
70 """
71 For any Python object that is meant to be interpreted as a CUDA stream, the intent
72 can be communicated by implementing this protocol that returns a 2-tuple: The protocol
73 version number (currently ``0``) and the address of ``cudaStream_t``. Both values
74 should be Python `int`.
75 """
76 ...
79cdef class Stream:
80 """Represent a queue of GPU operations that are executed in a specific order.
82 Applications use streams to control the order of execution for
83 GPU work. Work within a single stream are executed sequentially.
84 Whereas work across multiple streams can be further controlled
85 using stream priorities and :obj:`~_event.Event` managements.
87 Advanced users can utilize default streams for enforce complex
88 implicit synchronization behaviors.
90 Directly creating a :obj:`~_stream.Stream` is not supported due to ambiguity.
91 New streams should instead be created through a :obj:`~_device.Device`
92 object, or created directly through using an existing handle
93 using Stream.from_handle().
94 """
95 def __init__(self, *args, **kwargs) -> None:
96 raise RuntimeError( 2ph
97 "Stream objects cannot be instantiated directly. "
98 "Please use Device APIs (create_stream) or other Stream APIs (from_handle)."
99 )
101 @staticmethod
102 cdef Stream _from_handle(type cls, StreamHandle h_stream):
103 """Create a Stream from an existing StreamHandle (cdef-only factory)."""
104 cdef Stream s = cls.__new__(cls) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
105 s._h_stream = h_stream 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
106 s._h_context = get_stream_context(h_stream) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
107 s._device_id = -1 # lazy init'd (invalid sentinel) 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
108 s._nonblocking = -1 # lazy init'd 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
109 s._priority = INT32_MIN # lazy init'd 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
110 return s 2; cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}d#gM $gyd%cH Le~dae2 3
112 @classmethod
113 def _legacy_default(cls) -> Stream:
114 """Return the legacy default stream (supports subclassing)."""
115 return Stream._from_handle(cls, get_legacy_stream()) 2; #g
117 @classmethod
118 def _per_thread_default(cls) -> Stream:
119 """Return the per-thread default stream (supports subclassing)."""
120 return Stream._from_handle(cls, get_per_thread_stream()) 2; $g
122 @classmethod
123 def _init(cls, obj: IsStreamType | None = None, options: object = None,
124 device_id: int | None = None, ctx: Context | None = None) -> Stream:
125 cdef StreamHandle h_stream
126 cdef cydriver.CUstream borrowed
127 cdef ContextHandle h_context
128 cdef Stream self
130 # Extract context handle if provided
131 if ctx is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3
132 h_context = (<Context>ctx)._h_context 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH ~dae2 3
134 if obj is not None and options is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3
135 raise ValueError("obj and options cannot be both specified")
136 if obj is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u KeDeEeG 6d|dkd}dM yd%cH Le~dae2 3
137 # Borrowed stream from foreign object
138 # C++ handle prevents owner from being GC'd until handle is released
139 # Owner is responsible for keeping the stream's context alive
140 borrowed = _handle_from_stream_protocol(obj) 2D E F K L u KeG M H 3
141 h_stream = create_stream_handle_with_owner(borrowed, obj) 2D E F K L u KeG M H
142 return Stream._from_handle(cls, h_stream) 2D E F K L u KeG M H
144 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
145 nonblocking = opts.nonblocking 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
146 priority = opts.priority 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
148 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
149 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2Me
150 # TODO: we might want to consider memoizing high/low per CUDA context and avoid this call
151 cdef int high, low
152 cdef cydriver.CUresult res_code
153 with nogil: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
154 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
155 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
156 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT:
157 raise RuntimeError(
158 "No current CUDA context. Call dev.set_current() before creating streams."
159 )
160 HANDLE_RETURN(res_code)
161 cdef int prio
162 if priority is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
163 prio = priority 2kdyd
164 if not (low <= prio <= high): 2kdyd
165 raise ValueError(f"{priority=} is out of range {[low, high]}") 2yd
166 else:
167 prio = high 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|d}dM %cH Le~dae2 3
169 # C++ creates the stream and returns owning handle with context dependency.
170 # For green contexts, the C++ layer auto-dispatches to cuGreenCtxStreamCreate.
171 h_stream = create_stream_handle(h_context, flags, prio) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
172 if not h_stream: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ abMe@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
173 res_code = get_last_error() 2Me
174 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2Me
175 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT;
176 # no need to check is_green since primary streams don't fail this way
177 raise ValueError( 2Me
178 "Green context streams must be non-blocking. "
179 "Use StreamOptions(nonblocking=True) or omit the option (True is the default)."
180 )
181 elif res_code == cydriver.CUresult.CUDA_ERROR_NOT_SUPPORTED:
182 raise RuntimeError(
183 "cuGreenCtxStreamCreate is not available. "
184 "Green context stream creation requires CUDA 12.5 or newer."
185 )
186 else:
187 HANDLE_RETURN(res_code)
188 self = Stream._from_handle(cls, h_stream) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
189 self._nonblocking = int(nonblocking) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
190 self._priority = prio 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
191 if device_id is not None: 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
192 self._device_id = device_id 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
193 return self 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ }c~c] adbdFeGe^ _ nbobpbqbrbedN O 4 5 6 7 8 9 ! # ` fdgdsbtbubvbwbxbybzbAbBbCbDbEbFb-c.c/c:c;c=cbe{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ldmdndodHepdqdrdsdtdudvdwd?c} ~ ab@cP bbTbUbcbD VbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8chd9c: |cdb!cxdE cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAe9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d#c$cid`dBeCe4d5dIeJe[cjdF {dK L u DeEeG 6d|dkd}dM yd%cH Le~dae2 3
195 cpdef close(self):
196 """Destroy the stream.
198 Releases the stream handle. For owned streams, this destroys the
199 underlying CUDA stream. For borrowed streams, this releases the
200 reference and allows the Python owner to be GC'd.
201 """
202 self._h_stream.reset() 27dR w 8dx jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv : |c
204 def __cuda_stream__(self) -> tuple[int, int]:
205 """Return an instance of a __cuda_stream__ protocol."""
206 return (0, as_intptr(self._h_stream)) 1Du
208 def __hash__(self) -> int:
209 return hash(as_intptr(self._h_stream)) 2E cedeeeibfegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCe4d5dqh%gF u EeG 6dH
211 def __eq__(self, other: object) -> bool:
212 if not isinstance(other, Stream): 2xdE 9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d4d5d%gF {dK L u G 6d|dM H ae
213 return NotImplemented 2xd9d!deb#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_dae
214 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 2xdE `d4d5d%gF {dK L u G 6d|dM H
216 def __repr__(self) -> str:
217 Stream_ensure_ctx(self) 2N O 4 5 6 7 8 9 ! # id
218 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2N O 4 5 6 7 8 9 ! # id
220 @property
221 def handle(self) -> cuda.bindings.driver.CUstream:
222 """Return the underlying ``CUstream`` object.
224 .. caution::
226 This handle is a Python object. To get the memory address of the underlying C
227 handle, call ``int(Stream.handle)``.
228 """
229 return as_py(self._h_stream) 2cddd7dR w 8dx Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv be-ehdxdE F K L DeG M H
231 @property
232 def is_nonblocking(self) -> bool:
233 """Return True if this is a nonblocking stream, otherwise False."""
234 cdef unsigned int flags
235 if self._nonblocking == -1: 2kd}d
236 with nogil:
237 HANDLE_RETURN(cydriver.cuStreamGetFlags(as_cu(self._h_stream), &flags))
238 self._nonblocking = flags & cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING
239 return bool(self._nonblocking) 2kd}d
241 @property
242 def priority(self) -> int:
243 """Return the stream priority."""
244 cdef int prio
245 if self._priority == INT32_MIN: 2kdyd
246 with nogil:
247 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio))
248 self._priority = prio
249 return self._priority 2kdyd
251 def sync(self) -> None:
252 """Synchronize the stream."""
253 with nogil: 2cdddR w Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . NeS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / @ [ }c~c] adbd^ _ { I | J } ~ abP bbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e: |cdb~d2
254 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2cdddR w Q jb% a b c d e f g h i j k l m n o p q r s t y z A B zdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd' ( 0d1d2d3d) * + , - . NeS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / @ [ }c~c] adbd^ _ { I | J } ~ abP bbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e: |cdb~d2
256 def record(self, event: Event | None = None, options: EventOptions | None = None) -> Event:
257 """Record an event onto the stream.
259 Creates an :obj:`~_event.Event` object (or reuses the given one) by
260 recording on the stream.
262 Parameters
263 ----------
264 event : :obj:`~_event.Event`, optional
265 Optional event object to be reused for recording.
266 options : :obj:`EventOptions`, optional
267 Customizable dataclass for event creation options.
269 Returns
270 -------
271 :obj:`~_event.Event`
272 Newly created event object.
274 """
275 # Create an Event object (or reusing the given one) by recording
276 # on the stream. Event flags such as disabling timing, nonblocking,
277 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions.
278 if event is None: 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
279 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
280 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` fdgd{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
281 elif event.is_ipc_enabled: 1`
282 raise TypeError( 1`
283 "IPC-enabled events should not be re-recorded, instead create a "
284 "new event by supplying options."
285 )
287 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
288 with nogil: 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
289 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
290 return event 2w x a b c d e f g h i j k l m n o p q r s t v N O 4 5 6 7 8 9 ! # ` { I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ P !c#c$c%c2
292 def wait(self, event_or_stream: Event | Stream) -> None:
293 """Wait for a CUDA event or a CUDA stream.
295 Waiting for an event or a stream establishes a stream order.
297 If a :obj:`~_stream.Stream` is provided, then wait until the stream's
298 work is completed. This is done by recording a new :obj:`~_event.Event`
299 on the stream and then waiting on it.
301 Parameters
302 ----------
303 event_or_stream : :obj:`~_event.Event` | :obj:`~_stream.Stream`
304 The event or stream to wait for. Objects supporting the
305 ``__cuda_stream__`` protocol are also accepted and treated as
306 streams.
308 """
309 cdef Stream stream
310 cdef EventHandle h_event
312 # Handle Event directly
313 if isinstance(event_or_stream, Event): 1wxabcdefghijklmnopqrstv23
314 with nogil: 1wxabcdefghijklmnopqrstv2
315 # TODO: support flags other than 0?
316 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1wxabcdefghijklmnopqrstv2
317 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0))
318 return 1wxabcdefghijklmnopqrstv2
320 # Convert to Stream if needed
321 if isinstance(event_or_stream, Stream): 1wxabcdefghijklmnopqrstv3
322 stream = <Stream>event_or_stream 1wxabcdefghijklmnopqrstv
323 else:
324 try: 13
325 stream = Stream._init(obj=event_or_stream) 13
326 except Exception as e: 13
327 raise ValueError( 13
328 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 13
329 f" got {type(event_or_stream)}" 13
330 ) from e 13
332 # Wait on stream via temporary event
333 with nogil: 1wxabcdefghijklmnopqrstv
334 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1wxabcdefghijklmnopqrstv
335 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1wxabcdefghijklmnopqrstv
336 # TODO: support flags other than 0?
337 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1wxabcdefghijklmnopqrstv
339 @property
340 def device(self) -> Device:
341 """Return the :obj:`~_device.Device` singleton associated with this stream.
343 Note
344 ----
345 The current context on the device may differ from this
346 stream's context. This case occurs when a different CUDA
347 context is set current after a stream is created.
349 """
350 from cuda.core._device import Device # avoid circular import 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu
351 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu
352 return Device(self._device_id) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v cbjdu
354 @property
355 def context(self) -> Context:
356 """Return the :obj:`~_context.Context` associated with this stream."""
357 Stream_ensure_ctx(self) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu
358 Stream_ensure_ctx_device(self) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu
359 return Context._from_handle(Context, self._h_context, self._device_id) 2a b c d e f g h i j k l m n o p q r s t y z A B C v -c.c/c:c;c=c@cP [cu
361 @property
362 def resources(self) -> DeviceResources:
363 """Query the hardware resources provisioned for this stream's context.
365 For streams created from a green context, returns the resources
366 that context was provisioned with. For streams on the primary
367 context, returns the full device resources.
368 """
369 Stream_ensure_ctx(self) 2?c
370 Stream_ensure_ctx_device(self) 2?c
371 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2?c
373 @staticmethod
374 def from_handle(handle) -> Stream:
375 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle.
377 Uses a cudaStream_t pointer address represented as a Python int
378 to create a new :obj:`~_stream.Stream` object.
380 Note
381 ----
382 Stream lifetime is not managed, foreign object must remain
383 alive while this stream is active.
385 Parameters
386 ----------
387 handle : int
388 Stream handle representing the address of a foreign
389 stream object.
391 Returns
392 -------
393 :obj:`~_stream.Stream`
394 Newly created stream object.
396 """
398 class _stream_holder: 2E F K L KeG M H
399 def __cuda_stream__(self) -> tuple[int, int]: 2E F K L KeG M H
400 return (0, handle) 2E F K L KeG M H
402 return Stream._init(obj=_stream_holder()) 2E F K L KeG M H
404 def create_graph_builder(self) -> GraphBuilder:
405 """Create a new :obj:`~graph.GraphBuilder` object.
407 The new graph builder will be associated with this stream.
409 Returns
410 -------
411 :obj:`~graph.GraphBuilder`
412 Newly created graph builder object.
414 """
415 from cuda.core.graph._graph_builder import GraphBuilder 2cdddQ %
417 return GraphBuilder._init(stream=self, is_stream_owner=False) 2cdddQ %
420LEGACY_DEFAULT_STREAM: Stream = Stream._legacy_default()
421PER_THREAD_DEFAULT_STREAM: Stream = Stream._per_thread_default()
424cpdef Stream default_stream():
425 """Return the default CUDA :obj:`~_stream.Stream`.
427 The type of default stream returned depends on if the environment
428 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set.
430 If set, returns a per-thread default stream. Otherwise returns
431 the legacy stream.
433 """
434 # TODO: flip the default
435 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
437 cdef int use_ptds = 0 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
438 if use_ptds_raw != NULL: 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
439 use_ptds = strtol(use_ptds_raw, NULL, 10)
441 # value is non-zero, including for weird stuff like 123foo
442 if use_ptds: 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
443 return PER_THREAD_DEFAULT_STREAM
444 else:
445 return LEGACY_DEFAULT_STREAM 2R Q a b c d e f g h i j k l m n o p q r s t y z A B 'g' ( ) * + , - . NeS = T U V ? W X Y Z 0 C 1 / @ [ (g)g*g+g.e,g-g/e] .g:e/g;e:g;g=g^ _ nbobpbqbrbed=e?e@e[e]e^e_e`e?g{e|e@g[g}e~e]g^gafbf_g`gcfdf{g|gefff}g~ggfhfahifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J } ~ abbbTbUbOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*ebhVbWbchdhehfhghhhihufvfjhkhXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6clhwfxf7c+emhyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-enh,eRfSfTf9cUfVf: WfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwg%gxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
448cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil:
449 """Ensure the stream's context handle is populated."""
450 cdef cydriver.CUcontext ctx
451 if not self._h_context: 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu
452 self._h_context = get_stream_context(self._h_stream)
453 if self._h_context: 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu
454 return 0 2a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # -c.c/c:c;c=c?c@cP id[cu
455 HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx))
456 if ctx != NULL:
457 with gil:
458 self._h_context = create_context_handle_ref(ctx)
459 return 0
462cdef inline int Stream_ensure_ctx_device(Stream self) except?-1:
463 """Ensure the stream's context and device_id are populated."""
464 cdef cydriver.CUcontext ctx
465 cdef cydriver.CUdevice target_dev
466 cdef ContextHandle current_context
467 cdef bint switch_context
469 if self._device_id < 0: 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # ` fdgd-c.c/c:c;c=c{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ?c@cP cb!c#c$c[cjdu %c2
470 with nogil: 1u
471 # Get device ID from context, switching context temporarily if needed
472 Stream_ensure_ctx(self) 1u
473 current_context = get_current_context() 1u
474 switch_context = (as_cu(current_context) != as_cu(self._h_context)) 1u
475 if switch_context: 1u
476 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context)))
477 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1u
478 if switch_context: 1u
479 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx))
480 self._device_id = <int>target_dev 1u
481 return 0 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v N O 4 5 6 7 8 9 ! # ` fdgd-c.c/c:c;c=c{ I | GbHbIbJbKbLbJ MbNbObPbQbRbSb$ ?c@cP cb!c#c$c[cjdu %c2
484cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*:
485 if isinstance(obj, Stream): 2D E F K L u KeG M H 3
486 return <cydriver.CUstream><uintptr_t>(obj.handle)
488 try: 2D E F K L u KeG M H 3
489 cuda_stream_attr = obj.__cuda_stream__ 2D E F K L u KeG M H 3
490 except AttributeError: 13
491 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 13
493 if callable(cuda_stream_attr): 2D E F K L u KeG M H
494 info = cuda_stream_attr() 2D E F K L u KeG M H
495 else:
496 info = cuda_stream_attr
497 warnings.simplefilter("once", DeprecationWarning)
498 warnings.warn(
499 "Implementing __cuda_stream__ as an attribute is deprecated; it must be implemented as a method",
500 stacklevel=3,
501 category=DeprecationWarning,
502 )
504 try: 2D E F K L u KeG M H
505 len_info = len(info) 2D E F K L u KeG M H
506 except TypeError as e:
507 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {type(info)}") from e
508 if len_info != 2: 2D E F K L u KeG M H
509 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements")
510 if info[0] != 0: 2D E F K L u KeG M H
511 raise RuntimeError(
512 f"The first element of the sequence returned by obj.__cuda_stream__ must be 0, got {repr(info[0])}"
513 )
514 return <cydriver.CUstream><uintptr_t>(info[1]) 2D E F K L u KeG M H
516# Helper for API functions that accept either Stream or GraphBuilder. Performs
517# needed checks and returns the relevant stream. Rejects None so that callers
518# cannot rely on an implicit fallback to the default stream; if the default
519# stream is wanted, pass `device.default_stream` explicitly.
520cpdef Stream Stream_accept(arg, bint allow_stream_protocol=False):
521 from cuda.core.graph._graph_builder import GraphBuilder 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgohxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
523 if arg is None: 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgohxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
524 raise TypeError( 2oh
525 "stream is required and must not be None; "
526 "pass device.default_stream explicitly to use the default stream."
527 )
528 if isinstance(arg, Stream): 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 kblbmbfbgbhbC 1 / ]c^c_c`c{cv @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
529 return <Stream>(arg) 2R Q % a b c d e f g h i j k l m n o p q r s t y z A B ' ( ) * + , - . Ne'c(c)c*c+c,cS = T U V ? W X Y Z 0 fbgbhbC 1 / @ [ .e}c~c/e] adbd:e;e^ _ nbobpbqbrb=e?e@e[e]e^eN O _e`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfsbtbubvbwbxbybzbofpfqfrfAbBbCbDbEbFbsftfI J $ ldmdndodpdqdrdsdtdudvdwd} ~ abbbTbUbcbD OePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eVbWbufvfXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6cwfxf7c+eyfzf8cAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQf-e,ehdRfSfTf9cUfVf: |cWfXfYfZfdb0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=fib?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgebngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g
530 elif isinstance(arg, GraphBuilder): 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv D
531 return <Stream>(arg.stream) 2R w x Q jb% a b c d e f g h i j k l m n o p q r s t y z A B 'c(c)c*c+c,cS T U V W X Y Z 0 kblbmbfbgbhbC 1 ]c^c_c`c{cv
532 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 1D
533 stream = Stream._init(arg) 1D
534 warnings.warn( 1D
535 "Passing foreign stream objects to this function via the "
536 "stream protocol is deprecated. Convert the object explicitly "
537 "using Stream(obj) instead.",
538 stacklevel=2,
539 category=DeprecationWarning, 1D
540 )
541 return <Stream>(stream) 1D
542 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}")