Coverage for cuda/core/_stream.pyx: 82.35%
204 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-29 01:38 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-29 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( 2fi
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) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
105 s._h_stream = h_stream 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
106 s._h_context = get_stream_context(h_stream) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
107 s._device_id = -1 # lazy init'd (invalid sentinel) 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
108 s._nonblocking = -1 # lazy init'd 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
109 s._priority = INT32_MIN # lazy init'd 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
110 return s 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeWhT Xh8d{cO |eOePeY Z CbDbUdkdldmdeb
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()) 2fbWh
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()) 2fbXh
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
129 # Extract context handle if provided
130 if ctx is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
131 h_context = (<Context>ctx)._h_context 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO OePeY Z CbDbUdkdldmdeb
133 if obj is not None and options is not None: 2fbzd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
134 raise ValueError("obj and options cannot be both specified")
135 if obj is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v {e,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
136 # Borrowed stream from foreign object
137 # C++ handle prevents owner from being GC'd until handle is released
138 # Owner is responsible for keeping the stream's context alive
139 borrowed = _handle_from_stream_protocol(obj) 2B L M R S v {eN T O Z
140 h_stream = create_stream_handle_with_owner(borrowed, obj) 2B L M R S v {eN T O
141 return Stream._from_handle(cls, h_stream) 2B L M R S v {eN T O
143 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
144 nonblocking = opts.nonblocking 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
145 priority = opts.priority 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
147 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
148 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2}e
149 # TODO: we might want to consider memoizing high/low per CUDA context and avoid this call
150 cdef int high, low
151 cdef cydriver.CUresult res_code
152 with nogil: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
153 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
154 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
155 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT:
156 raise RuntimeError(
157 "No current CUDA context. Call dev.set_current() before creating streams."
158 )
159 HANDLE_RETURN(res_code)
160 cdef int prio
161 if priority is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
162 prio = priority 2Td8d
163 if not (low <= prio <= high): 2Td8d
164 raise ValueError(f"{priority=} is out of range {[low, high]}") 28d
165 else:
166 prio = high 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeNeT {cO |eOePeY Z CbDbUdkdldmdeb
168 # C++ creates the stream and returns owning handle with context dependency.
169 # For green contexts, the C++ layer auto-dispatches to cuGreenCtxStreamCreate.
170 h_stream = create_stream_handle(h_context, flags, prio) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
171 if not h_stream: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbub}eidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
172 res_code = get_last_error() 2}e
173 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2}e
174 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT;
175 # no need to check is_green since primary streams don't fail this way
176 raise ValueError( 2}e
177 "Green context streams must be non-blocking. "
178 "Use StreamOptions(nonblocking=True) or omit the option (True is the default)."
179 )
180 elif res_code == cydriver.CUresult.CUDA_ERROR_NOT_SUPPORTED:
181 raise RuntimeError(
182 "cuGreenCtxStreamCreate is not available. "
183 "Green context stream creation requires CUDA 12.5 or newer."
184 )
185 else:
186 HANDLE_RETURN(res_code)
187 cdef Stream self = Stream._from_handle(cls, h_stream) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
188 self._nonblocking = int(nonblocking) 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
189 self._priority = prio 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
190 if device_id is not None: 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
191 self._device_id = device_id 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
192 return self 2zd.eAdBdCdDd/e0 Edy C - D Fd:e;ez GdW Hd=ex gb?eA X @e|chbIda b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeJdKdLdMdudw kblbvdwdmbxdyd[e]enbobHbIbJbKbLbNdK U # $ % ' ( ) * + pbOdPdMbNbObPbQbRbSbTbUbVbWbXbYbZbbdcdddedfdgdReqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, VdWdXdYd^eZd0d1d2d3d4d5d6dhdsbtbubidV vb%b'bwbB (b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[cQd]cdbndxbybzb^c7dL SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)eneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJe_c`cRdKe*e+ekele_e`ejdSdM LeR S v ,e-eN meMeTdNeT 8d{cO |eOePeY Z CbDbUdkdldmdeb
194 cpdef close(self):
195 """Destroy the stream.
197 Releases the stream handle. For owned streams, this destroys the
198 underlying CUDA stream. For borrowed streams, this releases the
199 reference and allows the Python owner to be GC'd.
200 """
201 self._h_stream.reset() 2gbhbdbndCbDbUdkdldmd
203 def __cuda_stream__(self) -> tuple[int, int]:
204 """Return an instance of a __cuda_stream__ protocol."""
205 return (0, as_intptr(self._h_stream)) 1Bv
207 def __hash__(self) -> int:
208 return hash(as_intptr(self._h_stream)) 2L SeTeUeBbVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+ekelegiYhM v -eN meO
210 def __eq__(self, other: object) -> bool:
211 if not isinstance(other, Stream): 27dL neoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKekeleYhM LeR S v N meMeT O Pe
212 return NotImplemented 27dneoeAbpeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJePe
213 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 27dL KekeleYhM LeR S v N meMeT O
215 def __repr__(self) -> str:
216 Stream_ensure_ctx(self) 2K U # $ % ' ( ) * + Rd
217 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2K U # $ % ' ( ) * + Rd
219 @property
220 def handle(self) -> cuda.bindings.driver.CUstream:
221 """Return the underlying ``CUstream`` object.
223 .. caution::
225 This handle is a Python object. To get the memory address of the underlying C
226 handle, call ``int(Stream.handle)``.
227 """
228 return as_py(self._h_stream) 2zdAdBdCdDd0 C - D W x X |ca b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dQe{d|d}d~daebe. / : cedeee; = ? @ [ ] ^ _ fege` { | } ~ abbb1 2 3 4 5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjeudw ReOfQd7dL M R S ,eN T O Cbkdldmdeb
230 @property
231 def is_nonblocking(self) -> bool:
232 """Return True if this is a nonblocking stream, otherwise False."""
233 cdef unsigned int flags
234 if self._nonblocking == -1: 2TdNe
235 with nogil:
236 HANDLE_RETURN(cydriver.cuStreamGetFlags(as_cu(self._h_stream), &flags))
237 self._nonblocking = flags & cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING
238 return bool(self._nonblocking) 2TdNe
240 @property
241 def priority(self) -> int:
242 """Return the stream priority."""
243 cdef int prio
244 if self._priority == INT32_MIN: 2Td8d
245 with nogil:
246 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio))
247 self._priority = prio
248 return self._priority 2Td8d
250 def sync(self) -> None:
251 """Synchronize the stream."""
252 with nogil: 2zdAdBdCdDd0 C D W x gbX |chba b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d~e`d{d|d}d~dafaebe. / : cedeeebfcfdf; = ? ef@ [ ] ^ ffgf_ fege` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjekblbvdwdmbxdydnbobK qbP rbQ sbtbubV vbwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfdbndxbybzbOeY CbkdldmdNfeb
253 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2zdAdBdCdDd0 C D W x gbX |chba b c d e f g h i j k l m n o p E q r s t u F G H I 9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d~e`d{d|d}d~dafaebe. / : cedeeebfcfdf; = ? ef@ [ ] ^ ffgf_ fege` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbheieJ ! cbjekblbvdwdmbxdydnbobK qbP rbQ sbtbubV vbwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfdbndxbybzbOeY CbkdldmdNfeb
255 def record(self, event: Event | None = None, options: EventOptions | None = None) -> Event:
256 """Record an event onto the stream.
258 Creates an :obj:`~_event.Event` object (or reuses the given one) by
259 recording on the stream.
261 Parameters
262 ----------
263 event : :obj:`~_event.Event`, optional
264 Optional event object to be reused for recording.
265 options : :obj:`EventOptions`, optional
266 Customizable dataclass for event creation options.
268 Returns
269 -------
270 :obj:`~_event.Event`
271 Newly created event object.
273 """
274 # Create an Event object (or reusing the given one) by recording
275 # on the stream. Event flags such as disabling timing, nonblocking,
276 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions.
277 if event is None: 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
278 Stream_ensure_ctx_device(self) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
279 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbOdPdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
280 elif event.is_ipc_enabled: 2pb
281 raise TypeError( 2pb
282 "IPC-enabled events should not be re-recorded, instead create a "
283 "new event by supplying options."
284 )
286 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
287 with nogil: 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
288 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
289 return event 2y z x A a b c d e f g h i j k l m n o p q r s t u w K U # $ % ' ( ) * + pbqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, V ^c_c`c{cY
291 def wait(self, event_or_stream: Event | Stream) -> None:
292 """Wait for a CUDA event or a CUDA stream.
294 Waiting for an event or a stream establishes a stream order.
296 If a :obj:`~_stream.Stream` is provided, then wait until the stream's
297 work is completed. This is done by recording a new :obj:`~_event.Event`
298 on the stream and then waiting on it.
300 Parameters
301 ----------
302 event_or_stream : :obj:`~_event.Event` | :obj:`~_stream.Stream`
303 The event or stream to wait for. Objects supporting the
304 ``__cuda_stream__`` protocol are also accepted and treated as
305 streams.
307 """
308 cdef Stream stream
309 cdef EventHandle h_event
311 # Handle Event directly
312 if isinstance(event_or_stream, Event): 1yzxAabcdefghijklmnopqrstuwYZ
313 with nogil: 1yzxAabcdefghijklmnopqrstuwY
314 # TODO: support flags other than 0?
315 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1yzxAabcdefghijklmnopqrstuwY
316 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0))
317 return 1yzxAabcdefghijklmnopqrstuwY
319 # Convert to Stream if needed
320 if isinstance(event_or_stream, Stream): 1yzxAabcdefghijklmnopqrstuwZ
321 stream = <Stream>event_or_stream 1yzxAabcdefghijklmnopqrstuw
322 else:
323 try: 1Z
324 stream = Stream._init(obj=event_or_stream) 1Z
325 except Exception as e: 1Z
326 raise ValueError( 1Z
327 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 1Z
328 f" got {type(event_or_stream)}" 1Z
329 ) from e 1Z
331 # Wait on stream via temporary event
332 with nogil: 1yzxAabcdefghijklmnopqrstuw
333 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1yzxAabcdefghijklmnopqrstuw
334 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1yzxAabcdefghijklmnopqrstuw
335 # TODO: support flags other than 0?
336 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1yzxAabcdefghijklmnopqrstuw
338 @property
339 def device(self) -> Device:
340 """Return the :obj:`~_device.Device` singleton associated with this stream.
342 Note
343 ----
344 The current context on the device may differ from this
345 stream's context. This case occurs when a different CUDA
346 context is set current after a stream is created.
348 """
349 from cuda.core._device import Device # avoid circular import 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv
350 Stream_ensure_ctx_device(self) 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv
351 return Device(self._device_id) 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w wbSdv
353 @property
354 def context(self) -> Context:
355 """Return the :obj:`~_context.Context` associated with this stream."""
356 Stream_ensure_ctx(self) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv
357 Stream_ensure_ctx_device(self) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv
358 return Context._from_handle(Context, self._h_context, self._device_id) 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w bdcdddedfdgdidV jdv
360 @property
361 def resources(self) -> DeviceResources:
362 """Query the hardware resources provisioned for this stream's context.
364 For streams created from a green context, returns the resources
365 that context was provisioned with. For streams on the primary
366 context, returns the full device resources.
367 """
368 Stream_ensure_ctx(self) 2hd
369 Stream_ensure_ctx_device(self) 2hd
370 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2hd
372 @staticmethod
373 def from_handle(handle) -> Stream:
374 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle.
376 Uses a cudaStream_t pointer address represented as a Python int
377 to create a new :obj:`~_stream.Stream` object.
379 Note
380 ----
381 Stream lifetime is not managed, foreign object must remain
382 alive while this stream is active.
384 Parameters
385 ----------
386 handle : int
387 Stream handle representing the address of a foreign
388 stream object.
390 Returns
391 -------
392 :obj:`~_stream.Stream`
393 Newly created stream object.
395 """
397 class _stream_holder: 2L M R S {eN T O
398 def __cuda_stream__(self) -> tuple[int, int]: 2L M R S {eN T O
399 return (0, handle) 2L M R S {eN T O
401 return Stream._init(obj=_stream_holder()) 2L M R S {eN T O
403 def create_graph_builder(self) -> GraphBuilder:
404 """Create a new :obj:`~graph.GraphBuilder` object.
406 The new graph builder will be associated with this stream.
408 Returns
409 -------
410 :obj:`~graph.GraphBuilder`
411 Newly created graph builder object.
413 """
414 from cuda.core.graph._graph_builder import GraphBuilder 2zdAdBdCdDdW gbX hb
416 return GraphBuilder._init(self) 2zdAdBdCdDdW gbX hb
419LEGACY_DEFAULT_STREAM: Stream = Stream._legacy_default()
420PER_THREAD_DEFAULT_STREAM: Stream = Stream._per_thread_default()
423cpdef Stream default_stream():
424 """Return the default CUDA :obj:`~_stream.Stream`.
426 The type of default stream returned depends on if the environment
427 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set.
429 If set, returns a per-thread default stream. Otherwise returns
430 the legacy stream.
432 """
433 # TODO: flip the default
434 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
436 cdef int use_ptds = 0 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
437 if use_ptds_raw != NULL: 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
438 use_ptds = strtol(use_ptds_raw, NULL, 10)
440 # value is non-zero, including for weird stuff like 123foo
441 if use_ptds: 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
442 return PER_THREAD_DEFAULT_STREAM
443 else:
444 return LEGACY_DEFAULT_STREAM 20 C D W X a b c d e f g h i j k l m n o p E q r s t u F G H I 0h~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbb1 ib2 3 4 jb5 6 7 8 9 J ! cbkblb1h2h3h4h5hPf6h7hQfmb8hRf9hSf!h#h$hnbobHbIbJbKbLbNdTfUfVfWfXfYfZf0f%h'hK 1f2f(h3f4f)h*h5f6f+h,h7f8f-h.h9f!f/h:h#f$f;h=h%f'f?h(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q sbtbubvb%b'bifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf@h(b)b[h]h^h_h`h{h|h@f[f}h~h*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?cai]f^f@cMfbi_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfcidingogpg]cqgrgdbsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gYhDb^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
447cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil:
448 """Ensure the stream's context handle is populated."""
449 cdef cydriver.CUcontext ctx
450 if not self._h_context: 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv
451 self._h_context = get_stream_context(self._h_stream)
452 if self._h_context: 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv
453 return 0 2C - D a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + bdcdddedfdgdhdidV Rdjdv
454 HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx))
455 if ctx != NULL:
456 with gil:
457 self._h_context = create_context_handle_ref(ctx)
458 return 0
461cdef inline int Stream_ensure_ctx_device(Stream self) except?-1:
462 """Ensure the stream's context and device_id are populated."""
463 cdef cydriver.CUcontext ctx
464 cdef cydriver.CUdevice target_dev
465 cdef ContextHandle current_context
466 cdef bint switch_context
468 if self._device_id < 0: 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + pbOdPdbdcdddedfdgdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, hdidV wb^c_c`cjdSdv {cY
469 with nogil: 1v
470 # Get device ID from context, switching context temporarily if needed
471 Stream_ensure_ctx(self) 1v
472 current_context = get_current_context() 1v
473 switch_context = (as_cu(current_context) != as_cu(self._h_context)) 1v
474 if switch_context: 1v
475 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context)))
476 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1v
477 if switch_context: 1v
478 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx))
479 self._device_id = <int>target_dev 1v
480 return 0 2y C - D z x A a b c d e f g h i j k l m n o p E q r s t u F G H I J w K U # $ % ' ( ) * + pbOdPdbdcdddedfdgdqbP rb0b1b2b3b4b5bQ 6b7b8b9b!b#b$b, hdidV wb^c_c`cjdSdv {cY
483cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*:
484 if isinstance(obj, Stream): 2B L M R S v {eN T O Z
485 return <cydriver.CUstream><uintptr_t>(obj.handle)
487 try: 2B L M R S v {eN T O Z
488 cuda_stream_attr = obj.__cuda_stream__ 2B L M R S v {eN T O Z
489 except AttributeError: 1Z
490 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 1Z
492 if callable(cuda_stream_attr): 2B L M R S v {eN T O
493 info = cuda_stream_attr() 2B L M R S v {eN T O
494 else:
495 info = cuda_stream_attr
496 warnings.simplefilter("once", DeprecationWarning)
497 warnings.warn(
498 "Implementing __cuda_stream__ as an attribute is deprecated; it must be implemented as a method",
499 stacklevel=3,
500 category=DeprecationWarning,
501 )
503 try: 2B L M R S v {eN T O
504 len_info = len(info) 2B L M R S v {eN T O
505 except TypeError as e:
506 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {type(info)}") from e
507 if len_info != 2: 2B L M R S v {eN T O
508 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements")
509 if info[0] != 0: 2B L M R S v {eN T O
510 raise RuntimeError(
511 f"The first element of the sequence returned by obj.__cuda_stream__ must be 0, got {repr(info[0])}"
512 )
513 return <cydriver.CUstream><uintptr_t>(info[1]) 2B L M R S v {eN T O
515# Helper for API functions that accept either Stream or GraphBuilder. Performs
516# needed checks and returns the relevant stream. Rejects None so that callers
517# cannot rely on an implicit fallback to the default stream; if the default
518# stream is wanted, pass `device.default_stream` explicitly.
519cpdef Stream Stream_accept(arg, bint allow_stream_protocol=False):
520 from cuda.core.graph._graph_builder import GraphBuilder 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]geiCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
522 if arg is None: 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]geiCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
523 raise TypeError( 2ei
524 "stream is required and must not be None; "
525 "pass device.default_stream explicitly to use the default stream."
526 )
527 if isinstance(arg, Stream): 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 }c~cadEbFbGbJ ! cbJdKdLdMdudw kblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gCbZhDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
528 return <Stream>(arg) 20 C D W gbX hba b c d e f g h i j k l m n o p E q r s t u F G H I ~eaf. / : bfcfdf; = ? ef@ [ ] ^ ffgf_ ` { | } ~ abhfbbodpdqdrdsdtd1 ib2 3 4 jb5 6 7 8 9 EbFbGbJ ! cbkblbPfvdwdQfmbxdydRfSfnbobHbIbJbKbLbTfUfVfWfXfYfZf0fK U 1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-fMbNbObPbQbRbSbTb.f/f:f;fUbVbWbXbYbZb=f?fP Q , VdWdXdYdZd0d1d2d3d4d5d6dsbtbubvb%b'bwbB ifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf(b)b@f[f*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c]f^f@cMf_f`f[c{f|f}f~fagbgcgdgegfggghgigjgkglgmgOfQdngogpg]cqgrgdbndsgtgugvgxbybzbwgxgygzgAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgBbWgXgYgZg0g1g2g3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,gAb-g.g/g:g;g=g?g@g[g]gCbDbUdkdldmd^g_g`g{g|g}g~gahbhchdhehfhghNfhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVheb
529 elif isinstance(arg, GraphBuilder): 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I odpdqdrdsdtd1 2 3 4 5 6 7 8 9 }c~cadEbFbGbJ ! JdKdLdMdudw B CbZh
530 return <Stream>(arg.stream) 20 Edy C D Fdz GdW Hdx gbA X |chbIda b c d e f g h i j k l m n o p E q r s t u F G H I odpdqdrdsdtd1 2 3 4 5 6 7 8 9 }c~cadEbFbGbJ ! JdKdLdMdudw Cb
531 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 2B Zh
532 stream = Stream._init(arg) 1B
533 warnings.warn( 1B
534 "Passing foreign stream objects to this function via the "
535 "stream protocol is deprecated. Convert the object explicitly "
536 "using Stream(obj) instead.",
537 stacklevel=2,
538 category=DeprecationWarning, 1B
539 )
540 return <Stream>(stream) 1B
541 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}") 2Zh