Coverage for cuda/core/_stream.pyx: 82.35%
204 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-19 01:12 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-07-19 01:12 +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( 2^h
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) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
105 s._h_stream = h_stream 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
106 s._h_context = get_stream_context(h_stream) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
107 s._device_id = -1 # lazy init'd (invalid sentinel) 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
108 s._nonblocking = -1 # lazy init'd 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
109 s._priority = INT32_MIN # lazy init'd 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
110 return s 2yb!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeKhT Lh5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
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()) 2ybKh
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()) 2ybLh
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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
132 h_context = (<Context>ctx)._h_context 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO EeFeZ 0 AbBbRdidjdkdcb
134 if obj is not None and options is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
135 raise ValueError("obj and options cannot be both specified")
136 if obj is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v /e8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
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) 2B L M R S v /eN T O 0
141 h_stream = create_stream_handle_with_owner(borrowed, obj) 2B L M R S v /eN T O
142 return Stream._from_handle(cls, h_stream) 2B L M R S v /eN T O
144 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
145 nonblocking = opts.nonblocking 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
146 priority = opts.priority 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
148 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
149 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 2;e
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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
154 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
155 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
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: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
163 prio = priority 2Qd5d
164 if not (low <= prio <= high): 2Qd5d
165 raise ValueError(f"{priority=} is out of range {[low, high]}") 25d
166 else:
167 prio = high 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeDeT _cO :eEeFeZ 0 AbBbRdidjdkdcb
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) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
172 if not h_stream: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrb;egdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
173 res_code = get_last_error() 2;e
174 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 2;e
175 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT;
176 # no need to check is_green since primary streams don't fail this way
177 raise ValueError( 2;e
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) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
189 self._nonblocking = int(nonblocking) 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
190 self._priority = prio 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
191 if device_id is not None: 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
192 self._device_id = device_id 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
193 return self 2!exdydzdAd#e1 Bdy C - D Cd$e%ez DdX Ed'ex db(eA Y )e`cebFda 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ mdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibtdudjbvdwd*e+ekblbFbGbHbIbJbKdU V K $ % ' ( ) * + mbLdMdKbLbMbNbObPbQbRbSbTbUbVbWbXb~cadbdcdddedGenbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, SdTdUdVd,eWdXdYdZd0d1d2d3dfdpbqbrbgdW sb#b$btbB %b'b(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?cNd@cbbldubvbwb[c4dL HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5edeeexbfegeheiejekelemeneoepeqereseteuevewexeyeze]c^cOdAe6e7eaebe-e.ehdPdM BeR S v 8e9eN ceCeQdDeT 5d_cO :eEeFeZ 0 AbBbRdidjdkdcb
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() 2dbebbbldAbBbRdidjdkd
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)) 1Bv
208 def __hash__(self) -> int:
209 return hash(as_intptr(self._h_stream)) 2L HeIeJezbKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7eaebe_hMhM v 9eN ceO
211 def __eq__(self, other: object) -> bool:
212 if not isinstance(other, Stream): 24dL deeexbfegeheiejekelemeneoepeqereseteuevewexeyezeAeaebeMhM BeR S v N ceCeT O Fe
213 return NotImplemented 24ddeeexbfegeheiejekelemeneoepeqereseteuevewexeyezeFe
214 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 24dL AeaebeMhM BeR S v N ceCeT O
216 def __repr__(self) -> str:
217 Stream_ensure_ctx(self) 2U V K $ % ' ( ) * + Od
218 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2U V K $ % ' ( ) * + Od
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) 2xdydzdAd1 C - D X x Y `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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d: ; = ? @ [ ] ^ ~d_ ` { | } ~ 2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # absdw GeCfNd4dL M R S 8eN T O Abidjdkdcb
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: 2QdDe
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) 2QdDe
241 @property
242 def priority(self) -> int:
243 """Return the stream priority."""
244 cdef int prio
245 if self._priority == INT32_MIN: 2Qd5d
246 with nogil:
247 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio))
248 self._priority = prio
249 return self._priority 2Qd5d
251 def sync(self) -> None:
252 """Synchronize the stream."""
253 with nogil: 2xdydzdAd1 C D X x dbY `ceba 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d=e?e@e: ; = [e? @ [ ] ]e^e^ ~d_e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abhbibtdudjbvdwdkblbK nbP obQ pbqbrbW sbtbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfbbldubvbwbEeZ AbidjdkdBfcb
254 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2xdydzdAd1 C D X x dbY `ceba 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 6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d. / {d|d}d=e?e@e: ; = [e? @ [ ] ]e^e^ ~d_e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abhbibtdudjbvdwdkblbK nbP obQ pbqbrbW sbtbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfbbldubvbwbEeZ AbidjdkdBfcb
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: 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
279 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
280 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 U V K $ % ' ( ) * + mbLdMdnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
281 elif event.is_ipc_enabled: 2mb
282 raise TypeError( 2mb
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) 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
288 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
289 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
290 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 U V K $ % ' ( ) * + mbnbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, W [c]c^c_cZ
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): 1yzxAabcdefghijklmnopqrstuwZ0
314 with nogil: 1yzxAabcdefghijklmnopqrstuwZ
315 # TODO: support flags other than 0?
316 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1yzxAabcdefghijklmnopqrstuwZ
317 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0))
318 return 1yzxAabcdefghijklmnopqrstuwZ
320 # Convert to Stream if needed
321 if isinstance(event_or_stream, Stream): 1yzxAabcdefghijklmnopqrstuw0
322 stream = <Stream>event_or_stream 1yzxAabcdefghijklmnopqrstuw
323 else:
324 try: 10
325 stream = Stream._init(obj=event_or_stream) 10
326 except Exception as e: 10
327 raise ValueError( 10
328 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 10
329 f" got {type(event_or_stream)}" 10
330 ) from e 10
332 # Wait on stream via temporary event
333 with nogil: 1yzxAabcdefghijklmnopqrstuw
334 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1yzxAabcdefghijklmnopqrstuw
335 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1yzxAabcdefghijklmnopqrstuw
336 # TODO: support flags other than 0?
337 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1yzxAabcdefghijklmnopqrstuw
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 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 tbPdv
351 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 tbPdv
352 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 tbPdv
354 @property
355 def context(self) -> Context:
356 """Return the :obj:`~_context.Context` associated with this stream."""
357 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 ~cadbdcdddedgdW hdv
358 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 ~cadbdcdddedgdW hdv
359 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 ~cadbdcdddedgdW hdv
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) 2fd
370 Stream_ensure_ctx_device(self) 2fd
371 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2fd
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: 2L M R S /eN T O
399 def __cuda_stream__(self) -> tuple[int, int]: 2L M R S /eN T O
400 return (0, handle) 2L M R S /eN T O
402 return Stream._init(obj=_stream_holder()) 2L M R S /eN T O
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 2xdydzdAdX dbY eb
417 return GraphBuilder._init(self) 2xdydzdAdX dbY eb
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") 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
437 cdef int use_ptds = 0 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
438 if use_ptds_raw != NULL: 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
439 use_ptds = strtol(use_ptds_raw, NULL, 10)
441 # value is non-zero, including for weird stuff like 123foo
442 if use_ptds: 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
443 return PER_THREAD_DEFAULT_STREAM
444 else:
445 return LEGACY_DEFAULT_STREAM 21 C D X Y 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `e2 fb3 4 5 gb6 7 8 9 ! J # abhbibOhPhQhRhShDfThUhEfjbVhFfWhGfXhYhZhkblbFbGbHbIbJbKdHfIfJfKfLfMfNfOf0h1hK PfQf2hRfSf3h4hTfUf5h6hVfWf7h8hXfYf9h!hZf0f#h$h1f2f%h3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q 'hpbqbrbsb#b$b{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf(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|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=h*f+f=cAf?h,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCf@h[hbgcgdg@cegfgbbgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gMhBb+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
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: 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv
452 self._h_context = get_stream_context(self._h_stream)
453 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv
454 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 U V K $ % ' ( ) * + ~cadbdcdddedfdgdW Odhdv
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: 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 U V K $ % ' ( ) * + mbLdMd~cadbdcdddednbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, fdgdW tb[c]c^chdPdv _cZ
470 with nogil: 1v
471 # Get device ID from context, switching context temporarily if needed
472 Stream_ensure_ctx(self) 1v
473 current_context = get_current_context() 1v
474 switch_context = (as_cu(current_context) != as_cu(self._h_context)) 1v
475 if switch_context: 1v
476 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context)))
477 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1v
478 if switch_context: 1v
479 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx))
480 self._device_id = <int>target_dev 1v
481 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 U V K $ % ' ( ) * + mbLdMd~cadbdcdddednbP obYbZb0b1b2b3bQ 4b5b6b7b8b9b!b, fdgdW tb[c]c^chdPdv _cZ
484cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*:
485 if isinstance(obj, Stream): 2B L M R S v /eN T O 0
486 return <cydriver.CUstream><uintptr_t>(obj.handle)
488 try: 2B L M R S v /eN T O 0
489 cuda_stream_attr = obj.__cuda_stream__ 2B L M R S v /eN T O 0
490 except AttributeError: 10
491 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 10
493 if callable(cuda_stream_attr): 2B L M R S v /eN T O
494 info = cuda_stream_attr() 2B L M R S v /eN T O
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: 2B L M R S v /eN T O
505 len_info = len(info) 2B L M R S v /eN T O
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: 2B L M R S v /eN T O
509 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements")
510 if info[0] != 0: 2B L M R S v /eN T O
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]) 2B L M R S v /eN T O
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 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*g]hAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
523 if arg is None: 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*g]hAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
524 raise TypeError( 2]h
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): 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! {c|c}cCbDbEbJ # abGdHdIdJdsdw hbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gAbNhBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
529 return <Stream>(arg) 21 C D X dbY eba 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 . / =e?e@e: ; = [e? @ [ ] ]e^e^ _e_ ` { | } ~ `emdndodpdqdrd2 fb3 4 5 gb6 7 8 9 ! CbDbEbJ # abhbibDftdudEfjbvdwdFfGfkblbFbGbHbIbJbHfIfJfKfLfMfNfOfU V K PfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8fKbLbMbNbObPbQbRb9f!f#f$fSbTbUbVbWbXb%f'fP Q , SdTdUdVdWdXdYdZd0d1d2d3dpbqbrbsb#b$btbB {e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzf%b'b(f)f(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*f+f=cAf,f-f?c.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagCfNdbgcgdg@cegfgbbldgghgigjgubvbwbkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgFgGgHgIgJgzbKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg0g1g2g3g4g5g6g7gxb8g9g!g#g$g%g'g(g)g*gAbBbRdidjdkd+g,g-g.g/g:g;g=g?g@g[g]g^g_gBf`g{g|g}g~gahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzhAhBhChDhEhFhGhHhIhJhcb
530 elif isinstance(arg, GraphBuilder): 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 mdndodpdqdrd2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # GdHdIdJdsdw B AbNh
531 return <Stream>(arg.stream) 21 Bdy C D Cdz DdX Edx dbA Y `cebFda 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 mdndodpdqdrd2 3 4 5 6 7 8 9 ! {c|c}cCbDbEbJ # GdHdIdJdsdw Ab
532 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 2B Nh
533 stream = Stream._init(arg) 1B
534 warnings.warn( 1B
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, 1B
540 )
541 return <Stream>(stream) 1B
542 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}") 2Nh