Coverage for cuda/core/_launch_config.pyx: 87.38%
103 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-10 02:27 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
5from libc.string cimport memset
7from typing import Any
9from cuda.core._device import Device
10from cuda.core._utils.cuda_utils cimport HANDLE_RETURN
11from cuda.core._utils.cuda_utils import (
12 CUDAError,
13 cast_to_3_tuple,
14 driver,
15)
17_LAUNCH_CONFIG_ATTRS = (
18 'grid',
19 'cluster',
20 'block',
21 'shmem_size',
22 'is_cooperative',
23 'programmatic_stream_serialization',
24 'priority',
25)
27__all__ = ['LaunchConfig']
30cdef class LaunchConfig:
31 """Customizable launch options.
33 Note
34 ----
35 When cluster is specified, the grid parameter represents the number of
36 clusters (not blocks). The hierarchy is: grid (clusters) -> cluster (blocks) ->
37 block (threads). Each dimension in grid specifies clusters in the grid, each dimension in
38 cluster specifies blocks per cluster, and each dimension in block specifies
39 threads per block.
41 Attributes
42 ----------
43 grid : tuple | int
44 Collection of threads that will execute a kernel function. When cluster
45 is not specified, this represents the number of blocks, otherwise
46 this represents the number of clusters.
47 cluster : tuple | int
48 Group of blocks (Thread Block Cluster) that will execute on the same
49 GPU Processing Cluster (GPC). Blocks within a cluster have access to
50 distributed shared memory and can be explicitly synchronized.
51 block : tuple | int
52 Group of threads (Thread Block) that will execute on the same
53 streaming multiprocessor (SM). Threads within a thread blocks have
54 access to shared memory and can be explicitly synchronized.
55 shmem_size : int, optional
56 Dynamic shared-memory size per thread block in bytes.
57 (Default to size 0)
58 is_cooperative : bool, optional
59 Whether this config can be used to launch a cooperative kernel.
60 programmatic_stream_serialization : bool, optional
61 Whether to allow programmatic stream serialization (PDL). When True,
62 the kernel may overlap with a previous kernel in the same stream that
63 signals completion via programmatic means.
64 priority : int, optional
65 Execution priority of the kernel. Lower numbers represent higher
66 priorities. The meaningful range of values is device-specific,
67 given by ``[greatestPriority, leastPriority]`` as returned by
68 ``cuCtxGetStreamPriorityRange`` (the same range used by
69 :attr:`~cuda.core.StreamOptions.priority`); both bounds are 0 on
70 a device that does not support multiple stream priorities. A
71 nonzero value outside this range raises :class:`ValueError`.
72 When omitted (or 0), the launch uses the stream's priority.
73 """
75 # TODO: expand LaunchConfig to include other attributes
76 # Note: attributes are declared in _launch_config.pxd
78 def __init__(
79 self,
80 grid: int | tuple[int, ...] | None = None,
81 cluster: int | tuple[int, ...] | None = None,
82 block: int | tuple[int, ...] | None = None,
83 shmem_size: int | None = None,
84 is_cooperative: bool = False,
85 programmatic_stream_serialization: bool = False,
86 priority: int | None = None,
87 ) -> None:
88 """Initialize LaunchConfig with validation.
90 Parameters
91 ----------
92 grid : tuple | int, optional
93 Grid dimensions (number of blocks or clusters if cluster is specified)
94 cluster : tuple | int, optional
95 Cluster dimensions (Thread Block Cluster)
96 block : tuple | int, optional
97 Block dimensions (threads per block)
98 shmem_size : int, optional
99 Dynamic shared memory size in bytes (default: 0)
100 is_cooperative : bool, optional
101 Whether to launch as cooperative kernel (default: False)
102 programmatic_stream_serialization : bool, optional
103 Whether to allow programmatic stream serialization / PDL (default: False)
104 priority : int, optional
105 Execution priority of the kernel. Lower numbers represent higher
106 priorities. The meaningful range of values is device-specific,
107 given by ``[greatestPriority, leastPriority]`` as returned by
108 ``cuCtxGetStreamPriorityRange`` (the same range used by
109 :attr:`~cuda.core.StreamOptions.priority`); both bounds are 0 on
110 a device that does not support multiple stream priorities. A
111 nonzero value outside this range raises :class:`ValueError`.
112 When omitted (or 0), the launch uses the stream's priority.
113 """
114 # Convert and validate grid and block dimensions
115 self.grid = cast_to_3_tuple("LaunchConfig.grid", grid) 2,bg h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +bIeJe-bMcPeKeNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
116 self.block = cast_to_3_tuple("LaunchConfig.block", block) 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +bIeJe-bMcPeKeNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
118 # FIXME: Calling Device() strictly speaking is not quite right; we should instead
119 # look up the device from stream. We probably need to defer the checks related to
120 # device compute capability or attributes.
121 # thread block clusters are supported starting H100
122 if cluster is not None: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +bIeJe-bMcKeNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
123 cc = Device().compute_capability 2+bIeJeKe
124 if cc < (9, 0): 2+bIeJeKe
125 raise CUDAError( 2IeJeKe
126 f"thread block clusters are not supported on devices with compute capability < 9.0 (got {cc})" 2IeJeKe
127 )
128 self.cluster = cast_to_3_tuple("LaunchConfig.cluster", cluster) 2+b
129 else:
130 self.cluster = None 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f -bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
132 # Handle shmem_size default
133 if shmem_size is None: 2,bg h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
134 self.shmem_size = 0 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b`b|b~bbcdcfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bNcOc4b.b@ [ ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c d Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
135 else:
136 self.shmem_size = shmem_size 2'b_b(b{b}bacccec5b6b7b8b9b!b#b$b%bMc.b] Yb
138 self.is_cooperative = is_cooperative 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
139 self.programmatic_stream_serialization = programmatic_stream_serialization 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
141 # priority=0 is treated the same as an unset priority (see
142 # _to_native_launch_config), so only nonzero values need validating
143 # against the device's stream priority range.
144 cdef int high, low
145 cdef cydriver.CUresult res_code
146 cdef int prio
147 if priority: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
148 with nogil: 24ba
149 res_code = cydriver.cuCtxGetStreamPriorityRange(&high, &low) 24ba
150 if res_code != cydriver.CUresult.CUDA_SUCCESS: 24ba
151 if res_code == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT:
152 raise RuntimeError(
153 "No current CUDA context. Call dev.set_current() before creating a LaunchConfig with a priority."
154 )
155 HANDLE_RETURN(res_code)
156 prio = priority 24ba
157 if not (low <= prio <= high): 24ba
158 raise ValueError(f"{priority=} is out of range {[low, high]}")
159 self.priority = prio 24ba
161 if self.is_cooperative and not Device().properties.cooperative_launch: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X /b:b;b=b?b@b[b]b^b'b_b`b(b{b|b}b~bacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcY Z 0 1 2 3 4 5 6 7 8 )b5b6b7byczcAcBcCcDcEcFcGcHc8b9b!bIc#b$b%b*bJcKc9 ! Lc# $ % ' ( ) * + , - . / : ; = ? f +b-bMcNcOc4b.b@ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbb c Ybd Zba 0b1b2b3bPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecedeeefegeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHe
162 raise CUDAError("cooperative kernels are not supported on this device") 2-b
164 def _identity(self) -> tuple[Any, ...]:
165 return tuple(getattr(self, attr) for attr in _LAUNCH_CONFIG_ATTRS) 2'b(b5b6b7b8b9b!b#b$b%bLeQeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(eOe)e*eMeNe
167 def __repr__(self) -> str:
168 """Return string representation of LaunchConfig."""
169 parts = ', '.join(f'{attr}={getattr(self, attr)!r}' for attr in _LAUNCH_CONFIG_ATTRS) 2)b*b+e
170 return f"LaunchConfig({parts})" 2)b*b+e
172 def __eq__(self, other: object) -> bool:
173 if not isinstance(other, LaunchConfig): 2'b(b5b6b7b8b9b!b#b$b%bLe,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffOeMeNe
174 return NotImplemented 2Le,e-e.e/e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefff
175 return self._identity() == (<LaunchConfig>other)._identity() 2'b(b5b6b7b8b9b!b#b$b%bLeOeMeNe
177 def __hash__(self) -> int:
178 return hash(self._identity()) 2QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eMeNe
180 cdef cydriver.CUlaunchConfig _to_native_launch_config(self):
181 cdef cydriver.CUlaunchConfig drv_cfg
182 cdef cydriver.CUlaunchAttribute attr
183 memset(&drv_cfg, 0, sizeof(drv_cfg)) 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
184 self._attrs.resize(0) 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
186 # Handle grid dimensions and cluster configuration
187 if self.cluster is not None: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
188 # Convert grid from cluster units to block units
189 drv_cfg.gridDimX = self.grid[0] * self.cluster[0]
190 drv_cfg.gridDimY = self.grid[1] * self.cluster[1]
191 drv_cfg.gridDimZ = self.grid[2] * self.cluster[2]
193 # Set up cluster attribute
194 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION
195 attr.value.clusterDim.x, attr.value.clusterDim.y, attr.value.clusterDim.z = self.cluster
196 self._attrs.push_back(attr)
197 else:
198 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = self.grid 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
200 drv_cfg.blockDimX, drv_cfg.blockDimY, drv_cfg.blockDimZ = self.block 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
201 drv_cfg.sharedMemBytes = self.shmem_size 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
203 if self.is_cooperative: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
204 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_COOPERATIVE 1f
205 attr.value.cooperative = 1 1f
206 self._attrs.push_back(attr) 1f
208 if self.programmatic_stream_serialization: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
209 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION 1e
210 attr.value.programmaticStreamSerializationAllowed = 1 1e
211 self._attrs.push_back(attr) 1e
213 if self.priority: 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
214 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PRIORITY
215 attr.value.priority = self.priority
216 self._attrs.push_back(attr)
218 drv_cfg.numAttrs = self._attrs.size() 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
219 drv_cfg.attrs = self._attrs.data() 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
221 return drv_cfg 2g h i j k l m n o p q r s t u v w x e y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? f @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXb1b2b3b
224# TODO: once all modules are cythonized, this function can be dropped in favor of the cdef method above
225cpdef object _to_native_launch_config(LaunchConfig config):
226 """Convert LaunchConfig to native driver CUlaunchConfig.
228 Parameters
229 ----------
230 config : LaunchConfig
231 High-level launch configuration
233 Returns
234 -------
235 driver.CUlaunchConfig
236 Native CUDA driver launch configuration
237 """
238 cdef object drv_cfg = driver.CUlaunchConfig() 2b c Ybd Zba 0b
239 cdef list attrs
240 cdef object attr
241 cdef object dim
242 cdef tuple grid_blocks
244 # Handle grid dimensions and cluster configuration
245 if config.cluster is not None: 2b c Ybd Zba 0b
246 # Convert grid from cluster units to block units
247 grid_blocks = (
248 config.grid[0] * config.cluster[0], 1b
249 config.grid[1] * config.cluster[1], 1b
250 config.grid[2] * config.cluster[2], 1b
251 )
252 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = grid_blocks 1b
254 # Set up cluster attribute
255 attr = driver.CUlaunchAttribute() 1b
256 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION 1b
257 dim = attr.value.clusterDim 1b
258 dim.x, dim.y, dim.z = config.cluster 1b
259 attrs = [attr] 1b
260 else:
261 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = config.grid 2c Ybd Zba 0b
262 attrs = [] 2c Ybd Zba 0b
264 drv_cfg.blockDimX, drv_cfg.blockDimY, drv_cfg.blockDimZ = config.block 2b c Ybd Zba 0b
265 drv_cfg.sharedMemBytes = config.shmem_size 2b c Ybd Zba 0b
267 if config.is_cooperative: 2b c Ybd Zba 0b
268 attr = driver.CUlaunchAttribute() 1c
269 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_COOPERATIVE 1c
270 attr.value.cooperative = 1 1c
271 attrs.append(attr) 1c
273 if config.programmatic_stream_serialization: 2b c Ybd Zba 0b
274 attr = driver.CUlaunchAttribute() 1d
275 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION 1d
276 attr.value.programmaticStreamSerializationAllowed = 1 1d
277 attrs.append(attr) 1d
279 if config.priority: 2b c Ybd Zba 0b
280 attr = driver.CUlaunchAttribute() 1a
281 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PRIORITY 1a
282 attr.value.priority = config.priority 1a
283 attrs.append(attr) 1a
285 drv_cfg.numAttrs = len(attrs) 2b c Ybd Zba 0b
286 drv_cfg.attrs = attrs 2b c Ybd Zba 0b
288 return drv_cfg 2b c Ybd Zba 0b