Coverage for cuda / core / _stream.pyx: 87.98%
183 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-29 01:27 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from __future__ import annotations
7from libc.stdint cimport uintptr_t, INT32_MIN
8from libc.stdlib cimport strtol, getenv
10from cuda.bindings cimport cydriver
12from cuda.core._event cimport Event as cyEvent
13from cuda.core._utils.cuda_utils cimport (
14 check_or_create_options,
15 HANDLE_RETURN,
16)
18import cython
19import warnings
20from dataclasses import dataclass
21from typing import Protocol
23from cuda.core._context cimport Context
24from cuda.core._event import Event, EventOptions
25from cuda.core._resource_handles cimport (
26 ContextHandle,
27 EventHandle,
28 StreamHandle,
29 create_context_handle_ref,
30 create_event_handle_noctx,
31 create_stream_handle,
32 create_stream_handle_with_owner,
33 get_current_context,
34 get_legacy_stream,
35 get_per_thread_stream,
36 as_intptr,
37 as_cu,
38 as_py,
39)
43@dataclass
44cdef class StreamOptions:
45 """Customizable :obj:`~_stream.Stream` options.
47 Attributes
48 ----------
49 nonblocking : bool, optional
50 Stream does not synchronize with the NULL stream. (Default to True)
51 priority : int, optional
52 Stream priority where lower number represents a
53 higher priority. (Default to lowest priority)
55 """
57 nonblocking : cython.bint = True
58 priority: int | None = None
61class IsStreamT(Protocol):
62 def __cuda_stream__(self) -> tuple[int, int]:
63 """
64 For any Python object that is meant to be interpreted as a CUDA stream, the intent
65 can be communicated by implementing this protocol that returns a 2-tuple: The protocol
66 version number (currently ``0``) and the address of ``cudaStream_t``. Both values
67 should be Python `int`.
68 """
69 ...
72cdef class Stream:
73 """Represent a queue of GPU operations that are executed in a specific order.
75 Applications use streams to control the order of execution for
76 GPU work. Work within a single stream are executed sequentially.
77 Whereas work across multiple streams can be further controlled
78 using stream priorities and :obj:`~_event.Event` managements.
80 Advanced users can utilize default streams for enforce complex
81 implicit synchronization behaviors.
83 Directly creating a :obj:`~_stream.Stream` is not supported due to ambiguity.
84 New streams should instead be created through a :obj:`~_device.Device`
85 object, or created directly through using an existing handle
86 using Stream.from_handle().
87 """
88 def __init__(self, *args, **kwargs):
89 raise RuntimeError( 2Cg
90 "Stream objects cannot be instantiated directly. "
91 "Please use Device APIs (create_stream) or other Stream APIs (from_handle)."
92 )
94 @staticmethod
95 cdef Stream _from_handle(type cls, StreamHandle h_stream):
96 """Create a Stream from an existing StreamHandle (cdef-only factory)."""
97 cdef Stream s = cls.__new__(cls) 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
98 s._h_stream = h_stream 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
99 # _h_context is default-initialized to empty ContextHandle by C++
100 s._device_id = -1 # lazy init'd (invalid sentinel) 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
101 s._nonblocking = -1 # lazy init'd 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
102 s._priority = INT32_MIN # lazy init'd 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
103 return s 20 0b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dQeM Re!bjbJ ke#d$dX Y
105 @classmethod
106 def _legacy_default(cls):
107 """Return the legacy default stream (supports subclassing)."""
108 return Stream._from_handle(cls, get_legacy_stream()) 20 Qe
110 @classmethod
111 def _per_thread_default(cls):
112 """Return the per-thread default stream (supports subclassing)."""
113 return Stream._from_handle(cls, get_per_thread_stream()) 20 Re
115 @classmethod
116 def _init(cls, obj: IsStreamT | None = None, options=None, device_id: int = None,
117 ctx: Context = None):
118 cdef StreamHandle h_stream
119 cdef cydriver.CUstream borrowed
120 cdef ContextHandle h_context
121 cdef Stream self
123 # Extract context handle if provided
124 if ctx is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y
125 h_context = (<Context>ctx)._h_context 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ #d$dX Y
127 if obj is not None and options is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y
128 raise ValueError("obj and options cannot be both specified")
129 if obj is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u jeeefeI Hd9d7b!dM !bjbJ ke#d$dX Y
130 # Borrowed stream from foreign object
131 # C++ handle prevents owner from being GC'd until handle is released
132 # Owner is responsible for keeping the stream's context alive
133 borrowed = _handle_from_stream_protocol(obj) 20 D G H K L u jeI M J Y
134 h_stream = create_stream_handle_with_owner(borrowed, obj) 2D G H K L u jeI M J
135 return Stream._from_handle(cls, h_stream) 2D G H K L u jeI M J
137 cdef StreamOptions opts = check_or_create_options(StreamOptions, options, "Stream options") 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
138 nonblocking = opts.nonblocking 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
139 priority = opts.priority 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
141 cdef unsigned int flags = (cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING if nonblocking 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
142 else cydriver.CUstream_flags.CU_STREAM_DEFAULT)
143 # TODO: we might want to consider memoizing high/low per CUDA context and avoid this call
144 cdef int high, low
145 with nogil: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
146 HANDLE_RETURN(cydriver.cuCtxGetStreamPriorityRange(&high, &low)) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
147 cdef int prio
148 if priority is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
149 prio = priority 27b!b
150 if not (low <= prio <= high): 27b!b
151 raise ValueError(f"{priority=} is out of range {[low, high]}") 2!b
152 else:
153 prio = high 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d!dM jbJ ke#d$dX Y
155 # C++ creates the stream and returns owning handle with context dependency
156 h_stream = create_stream_handle(h_context, flags, prio) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
157 if not h_stream: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
158 raise RuntimeError("Failed to create CUDA stream")
159 self = Stream._from_handle(cls, h_stream) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
160 self._nonblocking = int(nonblocking) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
161 self._priority = prio 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
162 if device_id is not None: 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
163 self._device_id = device_id 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
164 return self 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv E F P Q R S T U V W 5 4b5bvbwbxbybzbAbBbCbDbEbFbGbHbIb8 9 ! # $ % %d6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 fcgchcicgejckclcmcncocpcqc' rcsc( D tcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb) gb9bG 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebeKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6dhbibTb7dcedeFdGdheie* 6bH 8dK L u eefeI Hd9d7b!dM !bjbJ ke#d$dX Y
166 cpdef close(self):
167 """Destroy the stream.
169 Releases the stream handle. For owned streams, this destroys the
170 underlying CUDA stream. For borrowed streams, this releases the
171 reference and allows the Python owner to be GC'd.
172 """
173 self._h_stream.reset() 2Id1 w Jdx kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv
175 def __cuda_stream__(self) -> tuple[int, int]:
176 """Return an instance of a __cuda_stream__ protocol."""
177 return (0, as_intptr(self._h_stream)) 1Du
179 def __hash__(self) -> int:
180 return hash(as_intptr(self._h_stream)) 2G 'd(d)dZb*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeFdGdDgPeH u feI HdJ
182 def __eq__(self, other) -> bool:
183 if not isinstance(other, Stream): 29bG KdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7dFdGdPeH 8dK L u I Hd9dM J $d
184 return NotImplemented 29bKdLdSbMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d$d
185 return as_intptr(self._h_stream) == as_intptr((<Stream>other)._h_stream) 29bG 7dFdGdPeH 8dK L u I Hd9dM J
187 def __repr__(self) -> str:
188 Stream_ensure_ctx(self) 2E F P Q R S T U V W Tb
189 return f"<Stream handle={as_intptr(self._h_stream):#x} context={as_intptr(self._h_context):#x}>" 2E F P Q R S T U V W Tb
191 @property
192 def handle(self) -> cuda.bindings.driver.CUstream:
193 """Return the underlying ``CUstream`` object.
195 .. caution::
197 This handle is a Python object. To get the memory address of the underlying C
198 handle, call ``int(Stream.handle)``.
199 """
200 return as_py(self._h_stream) 20b1bId1 w Jdx Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqbMbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 ubUbVbWbXbYbv %d8b9bG H K L eeI M J
202 @property
203 def is_nonblocking(self) -> bool:
204 """Return True if this is a nonblocking stream, otherwise False."""
205 cdef unsigned int flags
206 if self._nonblocking == -1: 27b!d
207 with nogil:
208 HANDLE_RETURN(cydriver.cuStreamGetFlags(as_cu(self._h_stream), &flags))
209 self._nonblocking = flags & cydriver.CUstream_flags.CU_STREAM_NON_BLOCKING
210 return bool(self._nonblocking) 27b!d
212 @property
213 def priority(self) -> int:
214 """Return the stream priority."""
215 cdef int prio
216 if self._priority == INT32_MIN: 27b!b
217 with nogil:
218 HANDLE_RETURN(cydriver.cuStreamGetPriority(as_cu(self._h_stream), &prio))
219 self._priority = prio
220 return self._priority 27b!b
222 def sync(self):
223 """Synchronize the stream."""
224 with nogil: 20b1b1 w Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ub6 7 ' ( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe) #dX
225 HANDLE_RETURN(cydriver.cuStreamSynchronize(as_cu(self._h_stream))) 20b1b1 w Z kb4 a b c d e f g h i j k l m n o p q r s t y z A 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~bacbcccdceclbmbnbobpbqb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 ub6 7 ' ( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe) #dX
227 def record(self, event: Event = None, options: EventOptions = None) -> Event:
228 """Record an event onto the stream.
230 Creates an Event object (or reuses the given one) by
231 recording on the stream.
233 Parameters
234 ----------
235 event : :obj:`~_event.Event`, optional
236 Optional event object to be reused for recording.
237 options : :obj:`EventOptions`, optional
238 Customizable dataclass for event creation options.
240 Returns
241 -------
242 :obj:`~_event.Event`
243 Newly created event object.
245 """
246 # Create an Event object (or reusing the given one) by recording
247 # on the stream. Event flags such as disabling timing, nonblocking,
248 # and CU_EVENT_RECORD_EXTERNAL, can be set in EventOptions.
249 if event is None: 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
250 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
251 event = cyEvent._init(cyEvent, self._device_id, self._h_context, options, False) 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 4b5b6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
252 elif event.is_ipc_enabled: 15
253 raise TypeError( 15
254 "IPC-enabled events should not be re-recorded, instead create a "
255 "new event by supplying options."
256 )
258 cdef cydriver.CUevent e = as_cu((<cyEvent?>(event))._h_event) 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
259 with nogil: 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
260 HANDLE_RETURN(cydriver.cuEventRecord(e, as_cu(self._h_stream))) 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
261 return event 2w x a b c d e f g h i j k l m n o p q r s t v E F P Q R S T U V W 5 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 gbhbibjbX
263 def wait(self, event_or_stream: Event | Stream):
264 """Wait for a CUDA event or a CUDA stream.
266 Waiting for an event or a stream establishes a stream order.
268 If a :obj:`~_stream.Stream` is provided, then wait until the stream's
269 work is completed. This is done by recording a new :obj:`~_event.Event`
270 on the stream and then waiting on it.
272 """
273 cdef Stream stream
274 cdef EventHandle h_event
276 # Handle Event directly
277 if isinstance(event_or_stream, Event): 1wxabcdefghijklmnopqrstvXY
278 with nogil: 1wxabcdefghijklmnopqrstvX
279 # TODO: support flags other than 0?
280 HANDLE_RETURN(cydriver.cuStreamWaitEvent( 1wxabcdefghijklmnopqrstvX
281 as_cu(self._h_stream), as_cu((<cyEvent>event_or_stream)._h_event), 0))
282 return 1wxabcdefghijklmnopqrstvX
284 # Convert to Stream if needed
285 if isinstance(event_or_stream, Stream): 1wxabcdefghijklmnopqrstvY
286 stream = <Stream>event_or_stream 1wxabcdefghijklmnopqrstv
287 else:
288 try: 1Y
289 stream = Stream._init(obj=event_or_stream) 1Y
290 except Exception as e: 1Y
291 raise ValueError( 1Y
292 "only an Event, Stream, or object supporting __cuda_stream__ can be waited," 1Y
293 f" got {type(event_or_stream)}" 1Y
294 ) from e 1Y
296 # Wait on stream via temporary event
297 with nogil: 1wxabcdefghijklmnopqrstv
298 h_event = create_event_handle_noctx(cydriver.CUevent_flags.CU_EVENT_DISABLE_TIMING) 1wxabcdefghijklmnopqrstv
299 HANDLE_RETURN(cydriver.cuEventRecord(as_cu(h_event), as_cu(stream._h_stream))) 1wxabcdefghijklmnopqrstv
300 # TODO: support flags other than 0?
301 HANDLE_RETURN(cydriver.cuStreamWaitEvent(as_cu(self._h_stream), as_cu(h_event), 0)) 1wxabcdefghijklmnopqrstv
303 @property
304 def device(self) -> Device:
305 """Return the :obj:`~_device.Device` singleton associated with this stream.
307 Note
308 ----
309 The current context on the device may differ from this
310 stream's context. This case occurs when a different CUDA
311 context is set current after a stream is created.
313 """
314 from cuda.core._device import Device # avoid circular import 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v ( 6bu
315 Stream_ensure_ctx_device(self) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v ( 6bu
316 return Device(self._device_id) 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v ( 6bu
318 @property
319 def context(self) -> Context:
320 """Return the :obj:`~_context.Context` associated with this stream."""
321 Stream_ensure_ctx(self) 1abcdefghijklmnopqrstyzABCv89!#$%*u
322 Stream_ensure_ctx_device(self) 1abcdefghijklmnopqrstyzABCv89!#$%*u
323 return Context._from_handle(Context, self._h_context, self._device_id) 1abcdefghijklmnopqrstyzABCv89!#$%*u
325 @staticmethod
326 def from_handle(handle: int) -> Stream:
327 """Create a new :obj:`~_stream.Stream` object from a foreign stream handle.
329 Uses a cudaStream_t pointer address represented as a Python int
330 to create a new :obj:`~_stream.Stream` object.
332 Note
333 ----
334 Stream lifetime is not managed, foreign object must remain
335 alive while this steam is active.
337 Parameters
338 ----------
339 handle : int
340 Stream handle representing the address of a foreign
341 stream object.
343 Returns
344 -------
345 :obj:`~_stream.Stream`
346 Newly created stream object.
348 """
350 class _stream_holder: 2G H K L jeI M J
351 def __cuda_stream__(self): 2G H K L jeI M J
352 return (0, handle) 2G H K L jeI M J
354 return Stream._init(obj=_stream_holder()) 2G H K L jeI M J
356 def create_graph_builder(self) -> "GraphBuilder":
357 """Create a new :obj:`~graph.GraphBuilder` object.
359 The new graph builder will be associated with this stream.
361 Returns
362 -------
363 :obj:`~graph.GraphBuilder`
364 Newly created graph builder object.
366 """
367 from cuda.core.graph._graph_builder import GraphBuilder 20b1bZ 4
369 return GraphBuilder._init(stream=self, is_stream_owner=False) 20b1bZ 4
372# c-only python objects, not public
373cdef Stream C_LEGACY_DEFAULT_STREAM = Stream._legacy_default()
374cdef Stream C_PER_THREAD_DEFAULT_STREAM = Stream._per_thread_default()
376# standard python objects, public
377LEGACY_DEFAULT_STREAM = C_LEGACY_DEFAULT_STREAM
378PER_THREAD_DEFAULT_STREAM = C_PER_THREAD_DEFAULT_STREAM
381cpdef Stream default_stream():
382 """Return the default CUDA :obj:`~_stream.Stream`.
384 The type of default stream returned depends on if the environment
385 variable CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM is set.
387 If set, returns a per-thread default stream. Otherwise returns
388 the legacy stream.
390 """
391 # TODO: flip the default
392 cdef const char* use_ptds_raw = getenv("CUDA_PYTHON_CUDA_PER_THREAD_DEFAULT_STREAM") 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg
394 cdef int use_ptds = 0 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg
395 if use_ptds_raw != NULL: 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg
396 use_ptds = strtol(use_ptds_raw, NULL, 10)
398 # value is non-zero, including for weird stuff like 123foo
399 if use_ptds: 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg
400 return C_PER_THREAD_DEFAULT_STREAM
401 else:
402 return C_LEGACY_DEFAULT_STREAM 21 Z a b c d e f g h i j k l m n o p q r s t y z A B lbmbnbobpbqbSeC 2 ubTeUeVeWeXeYeE F Ze0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e+evbwbxbybzbAbBbCb,e-e.e/eDbEbFbGbHbIb:e;eN O =e' lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOe?e@e[e]eJb^e_eKb`e{e|e}e~eafbfcfdfefffgfhfifjfkflfmfnfofLbpfqf) rfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfZbRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'fSb(f)f*f+f,f-f.f/f:f;fPe=f?f@f[f]f^f_f`f{f|f}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzgAgBg
405cdef inline int Stream_ensure_ctx(Stream self) except?-1 nogil:
406 """Ensure the stream's context handle is populated."""
407 cdef cydriver.CUcontext ctx
408 if not self._h_context: 2a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 8 9 ! # $ % Tb* u
409 HANDLE_RETURN(cydriver.cuStreamGetCtx(as_cu(self._h_stream), &ctx)) 2a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 8 9 ! # $ % Tb* u
410 with gil: 2a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 8 9 ! # $ % Tb* u
411 self._h_context = create_context_handle_ref(ctx) 2a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 8 9 ! # $ % Tb* u
412 return 0 2a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 8 9 ! # $ % Tb* u
415cdef inline int Stream_ensure_ctx_device(Stream self) except?-1:
416 """Ensure the stream's context and device_id are populated."""
417 cdef cydriver.CUcontext ctx
418 cdef cydriver.CUdevice target_dev
419 cdef bint switch_context
421 if self._device_id < 0: 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 5 4b5b8 9 ! # $ % 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 ( gbhbib* 6bu jbX
422 with nogil: 1u
423 # Get device ID from context, switching context temporarily if needed
424 Stream_ensure_ctx(self) 1u
425 switch_context = (get_current_context() != self._h_context) 1u
426 if switch_context: 1u
427 HANDLE_RETURN(cydriver.cuCtxPushCurrent(as_cu(self._h_context))) 1u
428 HANDLE_RETURN(cydriver.cuCtxGetDevice(&target_dev)) 1u
429 if switch_context: 1u
430 HANDLE_RETURN(cydriver.cuCtxPopCurrent(&ctx)) 1u
431 self._device_id = <int>target_dev 1u
432 return 0 2w x a b c d e f g h i j k l m n o p q r s t y z A B C v E F P Q R S T U V W 5 4b5b8 9 ! # $ % 6 N 7 ^ _ ` { | } O ~ abbbcbdbebfb3 ( gbhbib* 6bu jbX
435cdef cydriver.CUstream _handle_from_stream_protocol(obj) except*:
436 if isinstance(obj, Stream): 2D G H K L u jeI M J Y
437 return <cydriver.CUstream><uintptr_t>(obj.handle)
439 try: 2D G H K L u jeI M J Y
440 cuda_stream_attr = obj.__cuda_stream__ 2D G H K L u jeI M J Y
441 except AttributeError: 1Y
442 raise TypeError(f"{type(obj)} object does not have a '__cuda_stream__' attribute") from None 1Y
444 if callable(cuda_stream_attr): 2D G H K L u jeI M J
445 info = cuda_stream_attr() 2D G H K L u jeI M J
446 else:
447 info = cuda_stream_attr
448 warnings.simplefilter("once", DeprecationWarning)
449 warnings.warn(
450 "Implementing __cuda_stream__ as an attribute is deprecated; it must be implemented as a method",
451 stacklevel=3,
452 category=DeprecationWarning,
453 )
455 try: 2D G H K L u jeI M J
456 len_info = len(info) 2D G H K L u jeI M J
457 except TypeError as e:
458 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {type(info)}") from e
459 if len_info != 2: 2D G H K L u jeI M J
460 raise RuntimeError(f"obj.__cuda_stream__ must return a sequence with 2 elements, got {len_info} elements")
461 if info[0] != 0: 2D G H K L u jeI M J
462 raise RuntimeError(
463 f"The first element of the sequence returned by obj.__cuda_stream__ must be 0, got {repr(info[0])}"
464 )
465 return <cydriver.CUstream><uintptr_t>(info[1]) 2D G H K L u jeI M J
467# Helper for API functions that accept either Stream or GraphBuilder. Performs
468# needed checks and returns the relevant stream.
469cdef Stream Stream_accept(arg, bint allow_stream_protocol=False):
470 from cuda.core.graph._graph_builder import GraphBuilder 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)
472 if isinstance(arg, Stream): 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)
473 return <Stream>(arg) 24 MbNbObPbQbRb+ 2b, - . 3b/ : ; = ? @ [ ] E F vbwbxbybzbAbBbCbDbEbFbGbHbIbN O 3 fcgchcicjckclcmcncocpcqc' rcsc( D lemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOetcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdJbKb8bLb)
474 elif isinstance(arg, GraphBuilder): 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv D
475 return <Stream>(arg.stream) 21 w x Z kb4 a b c d e f g h i j k l m n o p q r s t y z A B MbNbObPbQbRb+ , - . / : ; = ? rbsbtb@ [ ] C 2 UbVbWbXbYbv
476 elif allow_stream_protocol and hasattr(arg, "__cuda_stream__"): 1D
477 stream = Stream._init(arg) 1D
478 warnings.warn( 1D
479 "Passing foreign stream objects to this function via the "
480 "stream protocol is deprecated. Convert the object explicitly "
481 "using Stream(obj) instead.",
482 stacklevel=2,
483 category=DeprecationWarning, 1D
484 )
485 return <Stream>(stream) 1D
486 raise TypeError(f"Stream or GraphBuilder expected, got {type(arg).__name__}")