Coverage for cuda/core/_launch_config.pyx: 92.77%
83 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +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 import (
11 CUDAError,
12 cast_to_3_tuple,
13 driver,
14)
16_LAUNCH_CONFIG_ATTRS = (
17 'grid',
18 'cluster',
19 'block',
20 'shmem_size',
21 'is_cooperative',
22 'programmatic_stream_serialization',
23)
25__all__ = ['LaunchConfig']
28cdef class LaunchConfig:
29 """Customizable launch options.
31 Note
32 ----
33 When cluster is specified, the grid parameter represents the number of
34 clusters (not blocks). The hierarchy is: grid (clusters) -> cluster (blocks) ->
35 block (threads). Each dimension in grid specifies clusters in the grid, each dimension in
36 cluster specifies blocks per cluster, and each dimension in block specifies
37 threads per block.
39 Attributes
40 ----------
41 grid : tuple | int
42 Collection of threads that will execute a kernel function. When cluster
43 is not specified, this represents the number of blocks, otherwise
44 this represents the number of clusters.
45 cluster : tuple | int
46 Group of blocks (Thread Block Cluster) that will execute on the same
47 GPU Processing Cluster (GPC). Blocks within a cluster have access to
48 distributed shared memory and can be explicitly synchronized.
49 block : tuple | int
50 Group of threads (Thread Block) that will execute on the same
51 streaming multiprocessor (SM). Threads within a thread blocks have
52 access to shared memory and can be explicitly synchronized.
53 shmem_size : int, optional
54 Dynamic shared-memory size per thread block in bytes.
55 (Default to size 0)
56 is_cooperative : bool, optional
57 Whether this config can be used to launch a cooperative kernel.
58 programmatic_stream_serialization : bool, optional
59 Whether to allow programmatic stream serialization (PDL). When True,
60 the kernel may overlap with a previous kernel in the same stream that
61 signals completion via programmatic means.
62 """
64 # TODO: expand LaunchConfig to include other attributes
65 # Note: attributes are declared in _launch_config.pxd
67 def __init__(
68 self,
69 grid: int | tuple[int, ...] | None = None,
70 cluster: int | tuple[int, ...] | None = None,
71 block: int | tuple[int, ...] | None = None,
72 shmem_size: int | None = None,
73 is_cooperative: bool = False,
74 programmatic_stream_serialization: bool = False,
75 ) -> None:
76 """Initialize LaunchConfig with validation.
78 Parameters
79 ----------
80 grid : tuple | int, optional
81 Grid dimensions (number of blocks or clusters if cluster is specified)
82 cluster : tuple | int, optional
83 Cluster dimensions (Thread Block Cluster)
84 block : tuple | int, optional
85 Block dimensions (threads per block)
86 shmem_size : int, optional
87 Dynamic shared memory size in bytes (default: 0)
88 is_cooperative : bool, optional
89 Whether to launch as cooperative kernel (default: False)
90 programmatic_stream_serialization : bool, optional
91 Whether to allow programmatic stream serialization / PDL (default: False)
92 """
93 # Convert and validate grid and block dimensions
94 self.grid = cast_to_3_tuple("LaunchConfig.grid", grid) 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbjekeZbpcqele0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
95 self.block = cast_to_3_tuple("LaunchConfig.block", block) 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbjekeZbpcqele0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
97 # FIXME: Calling Device() strictly speaking is not quite right; we should instead
98 # look up the device from stream. We probably need to defer the checks related to
99 # device compute capability or attributes.
100 # thread block clusters are supported starting H100
101 if cluster is not None: 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbjekeZbpcle0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
102 cc = Device().compute_capability 2Ybjekele
103 if cc < (9, 0): 2Ybjekele
104 raise CUDAError( 2jekele
105 f"thread block clusters are not supported on devices with compute capability < 9.0 (got {cc})" 2jekele
106 )
107 self.cluster = cast_to_3_tuple("LaunchConfig.cluster", cluster) 2Yb
108 else:
109 self.cluster = None 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e Zbpc0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
111 # Handle shmem_size default
112 if shmem_size is None: 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbZbpc0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
113 self.shmem_size = 0 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!b$b'b)b+b-b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbZb0b? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b c IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
114 else:
115 self.shmem_size = shmem_size 2Ub#bVb%b(b*b,b.bLbMbNbObPbQbRbSbTbpc0b= Hb
117 self.is_cooperative = is_cooperative 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbZbpc0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
118 self.programmatic_stream_serialization = programmatic_stream_serialization 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbZbpc0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
120 if self.is_cooperative and not Device().properties.cooperative_launch: 2f g h i j k l m n o p q r s t u v d w x y z A B C D E F G H I J K L M N O P Q R S T U V 2b3b4b5b6b7b8b9b!bUb#b$bVb%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccdcW X Y Z 0 1 2 3 4 5 6 WbLbMbNbecfcgchcicjckcObPbQblcRbSbTbXbmcnc7 8 oc9 ! # $ % ' ( ) * + , - . / : ; e YbZbpc0b= ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGba b Hbc IbJbKbqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c!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~daebecedeeefegeheie
121 raise CUDAError("cooperative kernels are not supported on this device") 2Zb
123 def _identity(self) -> tuple[Any, ...]:
124 return tuple(getattr(self, attr) for attr in _LAUNCH_CONFIG_ATTRS) 2UbVbLbMbNbObPbQbRbSbTbmereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQepeReSeneoe
126 def __repr__(self) -> str:
127 """Return string representation of LaunchConfig."""
128 parts = ', '.join(f'{attr}={getattr(self, attr)!r}' for attr in _LAUNCH_CONFIG_ATTRS) 2WbXbTe
129 return f"LaunchConfig({parts})" 2WbXbTe
131 def __eq__(self, other: object) -> bool:
132 if not isinstance(other, LaunchConfig): 2UbVbLbMbNbObPbQbRbSbTbmeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*epeneoe
133 return NotImplemented 2meUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*e
134 return self._identity() == (<LaunchConfig>other)._identity() 2UbVbLbMbNbObPbQbRbSbTbmepeneoe
136 def __hash__(self) -> int:
137 return hash(self._identity()) 2reseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeneoe
139 cdef cydriver.CUlaunchConfig _to_native_launch_config(self):
140 cdef cydriver.CUlaunchConfig drv_cfg
141 cdef cydriver.CUlaunchAttribute attr
142 memset(&drv_cfg, 0, sizeof(drv_cfg)) 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
143 self._attrs.resize(0) 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
145 # Handle grid dimensions and cluster configuration
146 if self.cluster is not None: 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
147 # Convert grid from cluster units to block units
148 drv_cfg.gridDimX = self.grid[0] * self.cluster[0]
149 drv_cfg.gridDimY = self.grid[1] * self.cluster[1]
150 drv_cfg.gridDimZ = self.grid[2] * self.cluster[2]
152 # Set up cluster attribute
153 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION
154 attr.value.clusterDim.x, attr.value.clusterDim.y, attr.value.clusterDim.z = self.cluster
155 self._attrs.push_back(attr)
156 else:
157 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = self.grid 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
159 drv_cfg.blockDimX, drv_cfg.blockDimY, drv_cfg.blockDimZ = self.block 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
160 drv_cfg.sharedMemBytes = self.shmem_size 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
162 if self.is_cooperative: 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
163 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_COOPERATIVE 1e
164 attr.value.cooperative = 1 1e
165 self._attrs.push_back(attr) 1e
167 if self.programmatic_stream_serialization: 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
168 attr.id = cydriver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION 1d
169 attr.value.programmaticStreamSerializationAllowed = 1 1d
170 self._attrs.push_back(attr) 1d
172 drv_cfg.numAttrs = self._attrs.size() 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
173 drv_cfg.attrs = self._attrs.data() 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
175 return drv_cfg 2f g h i j k l m n o p q r s t u v d w x 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 ! # $ % ' ( ) * + , - . / : ; e = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbIbJbKb
178# TODO: once all modules are cythonized, this function can be dropped in favor of the cdef method above
179cpdef object _to_native_launch_config(LaunchConfig config):
180 """Convert LaunchConfig to native driver CUlaunchConfig.
182 Parameters
183 ----------
184 config : LaunchConfig
185 High-level launch configuration
187 Returns
188 -------
189 driver.CUlaunchConfig
190 Native CUDA driver launch configuration
191 """
192 cdef object drv_cfg = driver.CUlaunchConfig() 2a b Hbc
193 cdef list attrs
194 cdef object attr
195 cdef object dim
196 cdef tuple grid_blocks
198 # Handle grid dimensions and cluster configuration
199 if config.cluster is not None: 2a b Hbc
200 # Convert grid from cluster units to block units
201 grid_blocks = (
202 config.grid[0] * config.cluster[0], 1a
203 config.grid[1] * config.cluster[1], 1a
204 config.grid[2] * config.cluster[2], 1a
205 )
206 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = grid_blocks 1a
208 # Set up cluster attribute
209 attr = driver.CUlaunchAttribute() 1a
210 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION 1a
211 dim = attr.value.clusterDim 1a
212 dim.x, dim.y, dim.z = config.cluster 1a
213 attrs = [attr] 1a
214 else:
215 drv_cfg.gridDimX, drv_cfg.gridDimY, drv_cfg.gridDimZ = config.grid 2b Hbc
216 attrs = [] 2b Hbc
218 drv_cfg.blockDimX, drv_cfg.blockDimY, drv_cfg.blockDimZ = config.block 2a b Hbc
219 drv_cfg.sharedMemBytes = config.shmem_size 2a b Hbc
221 if config.is_cooperative: 2a b Hbc
222 attr = driver.CUlaunchAttribute() 1b
223 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_COOPERATIVE 1b
224 attr.value.cooperative = 1 1b
225 attrs.append(attr) 1b
227 if config.programmatic_stream_serialization: 2a b Hbc
228 attr = driver.CUlaunchAttribute() 1c
229 attr.id = driver.CUlaunchAttributeID.CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION 1c
230 attr.value.programmaticStreamSerializationAllowed = 1 1c
231 attrs.append(attr) 1c
233 drv_cfg.numAttrs = len(attrs) 2a b Hbc
234 drv_cfg.attrs = attrs 2a b Hbc
236 return drv_cfg 2a b Hbc