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

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 cimport HANDLE_RETURN 

11from cuda.core._utils.cuda_utils import ( 

12 CUDAError, 

13 cast_to_3_tuple, 

14 driver, 

15) 

16  

17_LAUNCH_CONFIG_ATTRS = ( 

18 'grid', 

19 'cluster', 

20 'block', 

21 'shmem_size', 

22 'is_cooperative', 

23 'programmatic_stream_serialization', 

24 'priority', 

25) 

26  

27__all__ = ['LaunchConfig'] 

28  

29  

30cdef class LaunchConfig: 

31 """Customizable launch options. 

32  

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. 

40  

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

74  

75 # TODO: expand LaunchConfig to include other attributes 

76 # Note: attributes are declared in _launch_config.pxd 

77  

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. 

89  

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

117  

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

131  

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

137  

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

140  

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

160  

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

163  

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

166  

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

171  

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

176  

177 def __hash__(self) -> int: 

178 return hash(self._identity()) 2QeReSeTeUeVeWeXeYeZe0e1e2e3e4e5e6e7e8e9e!e#e$e%e'e(e)e*eMeNe

179  

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

185  

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] 

192  

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

199  

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

202  

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

207  

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

212  

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) 

217  

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

220  

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

222  

223  

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. 

227  

228 Parameters 

229 ---------- 

230 config : LaunchConfig 

231 High-level launch configuration 

232  

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 

243  

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

253  

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

263  

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

266  

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

272  

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

278  

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

284  

285 drv_cfg.numAttrs = len(attrs) 2b c Ybd Zba 0b

286 drv_cfg.attrs = attrs 2b c Ybd Zba 0b

287  

288 return drv_cfg 2b c Ybd Zba 0b