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

1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from libc.string cimport memset 

6  

7from typing import Any 

8  

9from cuda.core._device import Device 

10from cuda.core._utils.cuda_utils import ( 

11 CUDAError, 

12 cast_to_3_tuple, 

13 driver, 

14) 

15  

16_LAUNCH_CONFIG_ATTRS = ( 

17 'grid', 

18 'cluster', 

19 'block', 

20 'shmem_size', 

21 'is_cooperative', 

22 'programmatic_stream_serialization', 

23) 

24  

25__all__ = ['LaunchConfig'] 

26  

27  

28cdef class LaunchConfig: 

29 """Customizable launch options. 

30  

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. 

38  

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 """ 

63  

64 # TODO: expand LaunchConfig to include other attributes 

65 # Note: attributes are declared in _launch_config.pxd 

66  

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. 

77  

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

96  

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

110  

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

116  

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

119  

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

122  

123 def _identity(self) -> tuple[Any, ...]: 

124 return tuple(getattr(self, attr) for attr in _LAUNCH_CONFIG_ATTRS) 2UbVbLbMbNbObPbQbRbSbTbmereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQepeReSeneoe

125  

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

130  

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

135  

136 def __hash__(self) -> int: 

137 return hash(self._identity()) 2reseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeneoe

138  

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

144  

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] 

151  

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

158  

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

161  

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

166  

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

171  

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

174  

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

176  

177  

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. 

181  

182 Parameters 

183 ---------- 

184 config : LaunchConfig 

185 High-level launch configuration 

186  

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 

197  

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

207  

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

217  

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

220  

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

226  

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

232  

233 drv_cfg.numAttrs = len(attrs) 2a b Hbc

234 drv_cfg.attrs = attrs 2a b Hbc

235  

236 return drv_cfg 2a b Hbc