Coverage for cuda/core/_stream.pyx: 82.35%
204 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-03 01:38 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-03 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( 20h
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) 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
105 s._h_stream = h_stream 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
106 s._h_context = get_stream_context(h_stream) 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
107 s._device_id = -1 # lazy init'd (invalid sentinel) 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
108 s._nonblocking = -1 # lazy init'd 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
109 s._priority = INT32_MIN # lazy init'd 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
110 return s 2jbQeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjehhQ ihLd)cL 1ekeleV W lbmbxd^c_c`c?
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()) 2jbhh
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()) 2jbih
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: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
132 h_context = (<Context>ctx)._h_context 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL keleV W lbmbxd^c_c`c?
134 if obj is not None and options is not None: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
135 raise ValueError("obj and options cannot be both specified")
136 if obj is not None: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v 0eOePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
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) 2A I J O P v 0eK Q L W
141 h_stream = create_stream_handle_with_owner(borrowed, obj) 2A I J O P v 0eK Q L
142 return Stream._from_handle(cls, h_stream) 2A I J O P v 0eK Q L
144 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
145 nonblocking = opts.nonblocking 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
146 priority = opts.priority 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
148 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
149 else cydriver.CUstream_flags.CU_STREAM_DEFAULT) 22e
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: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
154 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
155 if res_code != cydriver.CUresult.CUDA_SUCCESS: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
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: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
163 prio = priority 2wdLd
164 if not (low <= prio <= high): 2wdLd
165 raise ValueError(f"{priority=} is out of range {[low, high]}") 2Ld
166 else:
167 prio = high 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diejeQ )cL 1ekeleV W lbmbxd^c_c`c?
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) 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
172 if not h_stream: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb2e[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
173 res_code = get_last_error() 22e
174 if not nonblocking and res_code == cydriver.CUresult.CUDA_ERROR_INVALID_VALUE: 22e
175 # cuGreenCtxStreamCreate rejects CU_STREAM_DEFAULT;
176 # no need to check is_green since primary streams don't fail this way
177 raise ValueError( 22e
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) 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
189 self._nonblocking = int(nonblocking) 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
190 self._priority = prio 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
191 if device_id is not None: 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
192 self._device_id = device_id 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
193 return self 2QeidjdReX kdy Sex @ Tez U Ue*c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : |c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` edfd{ gdhdVeWe| } qbrbsbtbubqdR S 8 9 ! H # $ % ' ~ rdsdvbwbxbybzbAbBbCbDbEbFbGbHbIb.c/c:c;c=c?cmeabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( ydzdAdBdXeCdDdEdFdGdHdIdJd@ccbdbeb[cT fbWbXbgbA YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#ctd$c= {chb%cKdI neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLe-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefe'c(cudgeMeNe*d+dYeZe]cvdJ heO P v OePeK ,diewdjeQ Ld)cL 1ekeleV W lbmbxd^c_c`c?
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() 2@ [ = {clbmbxd^c_c`c
204 def __cuda_stream__(self) -> tuple[int, int]:
205 """Return an instance of a __cuda_stream__ protocol."""
206 return (0, as_intptr(self._h_stream)) 1Av
208 def __hash__(self) -> int:
209 return hash(as_intptr(self._h_stream)) 2I neoepekbqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNe*d+d1hjhJ v PeK ,dL
211 def __eq__(self, other: object) -> bool:
212 if not isinstance(other, Stream): 2KdI -d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefege*d+djhJ heO P v K ,dieQ L le
213 return NotImplemented 2Kd-d.dib/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefele
214 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 2KdI ge*d+djhJ heO P v K ,dieQ L
216 def __repr__(self) -> str:
217 Stream_ensure_ctx(self) 2R S 8 9 ! H # $ % ' ud
218 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2R S 8 9 ! H # $ % ' ud
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) 2idjdX x U *ca b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : Y Z 0 1 2 3 4 5 6 +c,c-cnbobpbG 7 ; ddw me~etdKdI J O P OeK Q L lb^c_c`c?
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: 2wdje
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) 2wdje
241 @property
242 def priority(self) -> int:
243 """Return the stream priority."""
244 cdef int prio
245 if self._priority == INT32_MIN: 2wdLd
246 with nogil:
247 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio))
248 self._priority = prio
249 return self._priority 2wdLd
251 def sync(self) -> None:
252 """Synchronize the stream."""
253 with nogil: 2idjdX x @ U *c[ a b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; _ ` edfd{ gdhd| } H abM bbN cbdbebT fbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e= {chbkeV lb^c_c`c}e?
254 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 2idjdX x @ U *c[ a b c d e f g h i j k l m n o p B q r s t u C D E F MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d) * %d'd(d)d+ , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; _ ` edfd{ gdhd| } H abM bbN cbdbebT fbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e= {chbkeV lb^c_c`c}e?
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 x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ rdsdabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
279 Stream_ensure_ctx_device(self) 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ rdsdabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
280 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ rdsdabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
281 elif event.is_ipc_enabled: 1~
282 raise TypeError( 1~
283 "IPC-enabled events should not be re-recorded, instead create a "
284 "new event by supplying options."
285 )
287 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ abM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
288 with nogil: 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ abM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
289 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ abM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
290 return event 2y x z a b c d e f g h i j k l m n o p q r s t u w R S 8 9 ! H # $ % ' ~ abM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( T %c'c(c)cV
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): 1yxzabcdefghijklmnopqrstuwVW
314 with nogil: 1yxzabcdefghijklmnopqrstuwV
315 # TODO: support flags other than 0?
316 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1yxzabcdefghijklmnopqrstuwV
317 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0))
318 return 1yxzabcdefghijklmnopqrstuwV
320 # Convert to Stream if needed
321 if isinstance(event_or_stream, Stream): 1yxzabcdefghijklmnopqrstuwW
322 stream = <Stream>event_or_stream 1yxzabcdefghijklmnopqrstuw
323 else:
324 try: 1W
325 stream = Stream._init(obj=event_or_stream) 1W
326 except Exception as e: 1W
327 raise ValueError( 1W
328 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 1W
329 f" got {type(event_or_stream)}" 1W
330 ) from e 1W
332 # Wait on stream via temporary event
333 with nogil: 1yxzabcdefghijklmnopqrstuw
334 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1yxzabcdefghijklmnopqrstuw
335 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1yxzabcdefghijklmnopqrstuw
336 # TODO: support flags other than 0?
337 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1yxzabcdefghijklmnopqrstuw
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 x z a b c d e f g h i j k l m n o p B q r s t u C D E F G w gbvdv
351 Stream_ensure_ctx_device(self) 2y x z a b c d e f g h i j k l m n o p B q r s t u C D E F G w gbvdv
352 return Device(self._device_id) 2y x z a b c d e f g h i j k l m n o p B q r s t u C D E F G w gbvdv
354 @property
355 def context(self) -> Context:
356 """Return the :obj:`~_context.Context` associated with this stream."""
357 Stream_ensure_ctx(self) 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w .c/c:c;c=c?c[cT ]cv
358 Stream_ensure_ctx_device(self) 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w .c/c:c;c=c?c[cT ]cv
359 return Context._from_handle(Context, self._h_context, self._device_id) 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w .c/c:c;c=c?c[cT ]cv
361 @property
362 def resources(self) -> DeviceResources:
363 """Query the hardware resources provisioned for this stream's context.
365 For streams created from a green context, returns the resources
366 that context was provisioned with. For streams on the primary
367 context, returns the full device resources.
368 """
369 Stream_ensure_ctx(self) 2@c
370 Stream_ensure_ctx_device(self) 2@c
371 return DeviceResources._init_from_ctx(self._h_context, self._device_id) 2@c
373 @staticmethod
374 def from_handle(handle) -> Stream:
375 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle.
377 Uses a cudaStream_t pointer address represented as a Python int
378 to create a new :obj:`~_stream.Stream` object.
380 Note
381 ----
382 Stream lifetime is not managed, foreign object must remain
383 alive while this stream is active.
385 Parameters
386 ----------
387 handle : int
388 Stream handle representing the address of a foreign
389 stream object.
391 Returns
392 -------
393 :obj:`~_stream.Stream`
394 Newly created stream object.
396 """
398 class _stream_holder: 2I J O P 0eK Q L
399 def __cuda_stream__(self) -> tuple[int, int]: 2I J O P 0eK Q L
400 return (0, handle) 2I J O P 0eK Q L
402 return Stream._init(obj=_stream_holder()) 2I J O P 0eK Q L
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 2idjd@ U [
417 return GraphBuilder._init(self) 2idjd@ U [
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") 2X U a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 G 7 ; _ ` lhmhnhohphafqhrhbf{ shcfthdfuhvhwh| } qbrbsbtbubqdefffgfhfifjfkflfxhyhH mfnfzhofpfAhBhqfrfChDhsftfEhFhufvfGhHhwfxfIhJhyfzfKhAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N cbdbebfbWbXb4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eLhYbZbMhNhOhPhQhRhShMfNfThUh0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cVhOfPf!c|eWhQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~eXhYh9f!f#f$c$f%f= 'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgjhmbPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
437 cdef int use_ptds = 0 2X U a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 G 7 ; _ ` lhmhnhohphafqhrhbf{ shcfthdfuhvhwh| } qbrbsbtbubqdefffgfhfifjfkflfxhyhH mfnfzhofpfAhBhqfrfChDhsftfEhFhufvfGhHhwfxfIhJhyfzfKhAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N cbdbebfbWbXb4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eLhYbZbMhNhOhPhQhRhShMfNfThUh0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cVhOfPf!c|eWhQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~eXhYh9f!f#f$c$f%f= 'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgjhmbPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
438 if use_ptds_raw != NULL: 2X U a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 G 7 ; _ ` lhmhnhohphafqhrhbf{ shcfthdfuhvhwh| } qbrbsbtbubqdefffgfhfifjfkflfxhyhH mfnfzhofpfAhBhqfrfChDhsftfEhFhufvfGhHhwfxfIhJhyfzfKhAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N cbdbebfbWbXb4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eLhYbZbMhNhOhPhQhRhShMfNfThUh0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cVhOfPf!c|eWhQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~eXhYh9f!f#f$c$f%f= 'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgjhmbPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
439 use_ptds = strtol(use_ptds_raw, NULL, 10)
441 # value is non-zero, including for weird stuff like 123foo
442 if use_ptds: 2X U a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 G 7 ; _ ` lhmhnhohphafqhrhbf{ shcfthdfuhvhwh| } qbrbsbtbubqdefffgfhfifjfkflfxhyhH mfnfzhofpfAhBhqfrfChDhsftfEhFhufvfGhHhwfxfIhJhyfzfKhAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N cbdbebfbWbXb4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eLhYbZbMhNhOhPhQhRhShMfNfThUh0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cVhOfPf!c|eWhQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~eXhYh9f!f#f$c$f%f= 'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgjhmbPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
443 return PER_THREAD_DEFAULT_STREAM
444 else:
445 return LEGACY_DEFAULT_STREAM 2X U a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3eY ] Z 0 1 ^ 2 3 4 5 6 G 7 ; _ ` lhmhnhohphafqhrhbf{ shcfthdfuhvhwh| } qbrbsbtbubqdefffgfhfifjfkflfxhyhH mfnfzhofpfAhBhqfrfChDhsftfEhFhufvfGhHhwfxfIhJhyfzfKhAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N cbdbebfbWbXb4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eLhYbZbMhNhOhPhQhRhShMfNfThUh0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cVhOfPf!c|eWhQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~eXhYh9f!f#f$c$f%f= 'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgjhmbPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
448cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil:
449 """Ensure the stream's context handle is populated."""
450 cdef cydriver.CUcontext ctx
451 if not self._h_context: 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w R S 8 9 ! H # $ % ' .c/c:c;c=c?c@c[cT ud]cv
452 self._h_context = get_stream_context(self._h_stream)
453 if self._h_context: 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w R S 8 9 ! H # $ % ' .c/c:c;c=c?c@c[cT ud]cv
454 return 0 2a b c d e f g h i j k l m n o p B q r s t u C D E F G w R S 8 9 ! H # $ % ' .c/c:c;c=c?c@c[cT ud]cv
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 x z a b c d e f g h i j k l m n o p B q r s t u C D E F G w R S 8 9 ! H # $ % ' ~ rdsd.c/c:c;c=c?cabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( @c[cT gb%c'c(c]cvdv )cV
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 x z a b c d e f g h i j k l m n o p B q r s t u C D E F G w R S 8 9 ! H # $ % ' ~ rdsd.c/c:c;c=c?cabM bbJbKbLbMbNbObN PbQbRbSbTbUbVb( @c[cT gb%c'c(c]cvdv )cV
484cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*:
485 if isinstance(obj, Stream): 2A I J O P v 0eK Q L W
486 return <cydriver.CUstream><uintptr_t>(obj.handle)
488 try: 2A I J O P v 0eK Q L W
489 cuda_stream_attr = obj.__cuda_stream__ 2A I J O P v 0eK Q L W
490 except AttributeError: 1W
491 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 1W
493 if callable(cuda_stream_attr): 2A I J O P v 0eK Q L
494 info = cuda_stream_attr() 2A I J O P v 0eK Q L
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: 2A I J O P v 0eK Q L
505 len_info = len(info) 2A I J O P v 0eK Q L
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: 2A I J O P v 0eK Q L
509 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements")
510 if info[0] != 0: 2A I J O P v 0eK Q L
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]) 2A I J O P v 0eK Q L
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 2X kdy x @ z U *c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3e|c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` afedfdbf{ gdhdcfdf| } qbrbsbtbubefffgfhfifjfkflfR S H mfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N ( ydzdAdBdCdDdEdFdGdHdIdJdcbdbebfbWbXbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eYbZbMfNf0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cOfPf!c|eQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~etd9f!f#f$c$f%f= {c'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgZhlbkhmbxd^c_c`cPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
523 if arg is None: 2X kdy x @ z U *c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3e|c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` afedfdbf{ gdhdcfdf| } qbrbsbtbubefffgfhfifjfkflfR S H mfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N ( ydzdAdBdCdDdEdFdGdHdIdJdcbdbebfbWbXbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eYbZbMfNf0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cOfPf!c|eQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~etd9f!f#f$c$f%f= {c'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOgZhlbkhmbxd^c_c`cPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
524 raise TypeError( 2Zh
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): 2X kdy x @ z U *c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3e|c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 +c,c-cnbobpbG 7 ; mdndodpdddw _ ` afedfdbf{ gdhdcfdf| } qbrbsbtbubefffgfhfifjfkflfR S H mfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N ( ydzdAdBdCdDdEdFdGdHdIdJdcbdbebfbWbXbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eYbZbMfNf0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cOfPf!c|eQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~etd9f!f#f$c$f%f= {c'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOglbkhmbxd^c_c`cPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
529 return <Stream>(arg) 2X @ U [ a b c d e f g h i j k l m n o p B q r s t u C D E F ) * + , - . / : 3e|c}c~cadbdcdY ] Z 0 1 ^ 2 3 4 5 6 nbobpbG 7 ; _ ` afedfdbf{ gdhdcfdf| } qbrbsbtbubefffgfhfifjfkflfR S H mfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfvbwbxbybzbAbBbCbGfHfIfJfDbEbFbGbHbIbKfLfM N ( ydzdAdBdCdDdEdFdGdHdIdJdcbdbebfbWbXbgbA 4e5e6e7e8e9e!e#e$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eYbZbMfNf0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cOfPf!c|eQfRf#cSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f~etd9f!f#f$c$f%f= {c'f(f)f*fhb+f,f-f.f/f:f;f=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfgggkbhgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBgCgDgEgibFgGgHgIgJgKgLgMgNgOglbmbxd^c_c`cPgQgRgSgTgUgVgWgXgYgZg0g1g2g}e3g4g5g6g7g8g9g!g#g$g%g'g(g)g*g+g,g-g.g/g:g;g=g?g@g[g]g^g_g`g{g|g}g~gahbhchdhehfhgh?
530 elif isinstance(arg, GraphBuilder): 2X kdy x @ z U *c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F |c}c~cadbdcdY Z 0 1 2 3 4 5 6 +c,c-cnbobpbG 7 mdndodpdddw A lbkh
531 return <Stream>(arg.stream) 2X kdy x @ z U *c[ lda b c d e f g h i j k l m n o p B q r s t u C D E F |c}c~cadbdcdY Z 0 1 2 3 4 5 6 +c,c-cnbobpbG 7 mdndodpdddw lb
532 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 2A kh
533 stream = Stream._init(arg) 1A
534 warnings.warn( 1A
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, 1A
540 )
541 return <Stream>(stream) 1A
542 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}") 2kh