1 #include "clang/Basic/Cuda.h"
3 #include "llvm/ADT/StringRef.h"
4 #include "llvm/ADT/StringSwitch.h"
5 #include "llvm/Support/ErrorHandling.h"
6 #include "llvm/Support/VersionTuple.h"
10 const char *CudaVersionToString(CudaVersion V) {
12 case CudaVersion::UNKNOWN:
14 case CudaVersion::CUDA_70:
16 case CudaVersion::CUDA_75:
18 case CudaVersion::CUDA_80:
20 case CudaVersion::CUDA_90:
22 case CudaVersion::CUDA_91:
24 case CudaVersion::CUDA_92:
26 case CudaVersion::CUDA_100:
28 case CudaVersion::CUDA_101:
31 llvm_unreachable("invalid enum");
34 CudaVersion CudaStringToVersion(llvm::StringRef S) {
35 return llvm::StringSwitch<CudaVersion>(S)
36 .Case("7.0", CudaVersion::CUDA_70)
37 .Case("7.5", CudaVersion::CUDA_75)
38 .Case("8.0", CudaVersion::CUDA_80)
39 .Case("9.0", CudaVersion::CUDA_90)
40 .Case("9.1", CudaVersion::CUDA_91)
41 .Case("9.2", CudaVersion::CUDA_92)
42 .Case("10.0", CudaVersion::CUDA_100)
43 .Case("10.1", CudaVersion::CUDA_101);
46 const char *CudaArchToString(CudaArch A) {
50 case CudaArch::UNKNOWN:
82 case CudaArch::GFX600: // tahiti
84 case CudaArch::GFX601: // pitcairn, verde, oland,hainan
86 case CudaArch::GFX700: // kaveri
88 case CudaArch::GFX701: // hawaii
90 case CudaArch::GFX702: // 290,290x,R390,R390x
92 case CudaArch::GFX703: // kabini mullins
94 case CudaArch::GFX704: // bonaire
96 case CudaArch::GFX801: // carrizo
98 case CudaArch::GFX802: // tonga,iceland
100 case CudaArch::GFX803: // fiji,polaris10
102 case CudaArch::GFX810: // stoney
104 case CudaArch::GFX900: // vega, instinct
106 case CudaArch::GFX902: // TBA
108 case CudaArch::GFX904: // TBA
110 case CudaArch::GFX906: // TBA
112 case CudaArch::GFX908: // TBA
114 case CudaArch::GFX909: // TBA
116 case CudaArch::GFX1010: // TBA
118 case CudaArch::GFX1011: // TBA
120 case CudaArch::GFX1012: // TBA
123 llvm_unreachable("invalid enum");
126 CudaArch StringToCudaArch(llvm::StringRef S) {
127 return llvm::StringSwitch<CudaArch>(S)
128 .Case("sm_20", CudaArch::SM_20)
129 .Case("sm_21", CudaArch::SM_21)
130 .Case("sm_30", CudaArch::SM_30)
131 .Case("sm_32", CudaArch::SM_32)
132 .Case("sm_35", CudaArch::SM_35)
133 .Case("sm_37", CudaArch::SM_37)
134 .Case("sm_50", CudaArch::SM_50)
135 .Case("sm_52", CudaArch::SM_52)
136 .Case("sm_53", CudaArch::SM_53)
137 .Case("sm_60", CudaArch::SM_60)
138 .Case("sm_61", CudaArch::SM_61)
139 .Case("sm_62", CudaArch::SM_62)
140 .Case("sm_70", CudaArch::SM_70)
141 .Case("sm_72", CudaArch::SM_72)
142 .Case("sm_75", CudaArch::SM_75)
143 .Case("gfx600", CudaArch::GFX600)
144 .Case("gfx601", CudaArch::GFX601)
145 .Case("gfx700", CudaArch::GFX700)
146 .Case("gfx701", CudaArch::GFX701)
147 .Case("gfx702", CudaArch::GFX702)
148 .Case("gfx703", CudaArch::GFX703)
149 .Case("gfx704", CudaArch::GFX704)
150 .Case("gfx801", CudaArch::GFX801)
151 .Case("gfx802", CudaArch::GFX802)
152 .Case("gfx803", CudaArch::GFX803)
153 .Case("gfx810", CudaArch::GFX810)
154 .Case("gfx900", CudaArch::GFX900)
155 .Case("gfx902", CudaArch::GFX902)
156 .Case("gfx904", CudaArch::GFX904)
157 .Case("gfx906", CudaArch::GFX906)
158 .Case("gfx908", CudaArch::GFX908)
159 .Case("gfx909", CudaArch::GFX909)
160 .Case("gfx1010", CudaArch::GFX1010)
161 .Case("gfx1011", CudaArch::GFX1011)
162 .Case("gfx1012", CudaArch::GFX1012)
163 .Default(CudaArch::UNKNOWN);
166 const char *CudaVirtualArchToString(CudaVirtualArch A) {
168 case CudaVirtualArch::UNKNOWN:
170 case CudaVirtualArch::COMPUTE_20:
172 case CudaVirtualArch::COMPUTE_30:
174 case CudaVirtualArch::COMPUTE_32:
176 case CudaVirtualArch::COMPUTE_35:
178 case CudaVirtualArch::COMPUTE_37:
180 case CudaVirtualArch::COMPUTE_50:
182 case CudaVirtualArch::COMPUTE_52:
184 case CudaVirtualArch::COMPUTE_53:
186 case CudaVirtualArch::COMPUTE_60:
188 case CudaVirtualArch::COMPUTE_61:
190 case CudaVirtualArch::COMPUTE_62:
192 case CudaVirtualArch::COMPUTE_70:
194 case CudaVirtualArch::COMPUTE_72:
196 case CudaVirtualArch::COMPUTE_75:
198 case CudaVirtualArch::COMPUTE_AMDGCN:
199 return "compute_amdgcn";
201 llvm_unreachable("invalid enum");
204 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
205 return llvm::StringSwitch<CudaVirtualArch>(S)
206 .Case("compute_20", CudaVirtualArch::COMPUTE_20)
207 .Case("compute_30", CudaVirtualArch::COMPUTE_30)
208 .Case("compute_32", CudaVirtualArch::COMPUTE_32)
209 .Case("compute_35", CudaVirtualArch::COMPUTE_35)
210 .Case("compute_37", CudaVirtualArch::COMPUTE_37)
211 .Case("compute_50", CudaVirtualArch::COMPUTE_50)
212 .Case("compute_52", CudaVirtualArch::COMPUTE_52)
213 .Case("compute_53", CudaVirtualArch::COMPUTE_53)
214 .Case("compute_60", CudaVirtualArch::COMPUTE_60)
215 .Case("compute_61", CudaVirtualArch::COMPUTE_61)
216 .Case("compute_62", CudaVirtualArch::COMPUTE_62)
217 .Case("compute_70", CudaVirtualArch::COMPUTE_70)
218 .Case("compute_72", CudaVirtualArch::COMPUTE_72)
219 .Case("compute_75", CudaVirtualArch::COMPUTE_75)
220 .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN)
221 .Default(CudaVirtualArch::UNKNOWN);
224 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
228 case CudaArch::UNKNOWN:
229 return CudaVirtualArch::UNKNOWN;
230 case CudaArch::SM_20:
231 case CudaArch::SM_21:
232 return CudaVirtualArch::COMPUTE_20;
233 case CudaArch::SM_30:
234 return CudaVirtualArch::COMPUTE_30;
235 case CudaArch::SM_32:
236 return CudaVirtualArch::COMPUTE_32;
237 case CudaArch::SM_35:
238 return CudaVirtualArch::COMPUTE_35;
239 case CudaArch::SM_37:
240 return CudaVirtualArch::COMPUTE_37;
241 case CudaArch::SM_50:
242 return CudaVirtualArch::COMPUTE_50;
243 case CudaArch::SM_52:
244 return CudaVirtualArch::COMPUTE_52;
245 case CudaArch::SM_53:
246 return CudaVirtualArch::COMPUTE_53;
247 case CudaArch::SM_60:
248 return CudaVirtualArch::COMPUTE_60;
249 case CudaArch::SM_61:
250 return CudaVirtualArch::COMPUTE_61;
251 case CudaArch::SM_62:
252 return CudaVirtualArch::COMPUTE_62;
253 case CudaArch::SM_70:
254 return CudaVirtualArch::COMPUTE_70;
255 case CudaArch::SM_72:
256 return CudaVirtualArch::COMPUTE_72;
257 case CudaArch::SM_75:
258 return CudaVirtualArch::COMPUTE_75;
259 case CudaArch::GFX600:
260 case CudaArch::GFX601:
261 case CudaArch::GFX700:
262 case CudaArch::GFX701:
263 case CudaArch::GFX702:
264 case CudaArch::GFX703:
265 case CudaArch::GFX704:
266 case CudaArch::GFX801:
267 case CudaArch::GFX802:
268 case CudaArch::GFX803:
269 case CudaArch::GFX810:
270 case CudaArch::GFX900:
271 case CudaArch::GFX902:
272 case CudaArch::GFX904:
273 case CudaArch::GFX906:
274 case CudaArch::GFX908:
275 case CudaArch::GFX909:
276 case CudaArch::GFX1010:
277 case CudaArch::GFX1011:
278 case CudaArch::GFX1012:
279 return CudaVirtualArch::COMPUTE_AMDGCN;
281 llvm_unreachable("invalid enum");
284 CudaVersion MinVersionForCudaArch(CudaArch A) {
288 case CudaArch::UNKNOWN:
289 return CudaVersion::UNKNOWN;
290 case CudaArch::SM_20:
291 case CudaArch::SM_21:
292 case CudaArch::SM_30:
293 case CudaArch::SM_32:
294 case CudaArch::SM_35:
295 case CudaArch::SM_37:
296 case CudaArch::SM_50:
297 case CudaArch::SM_52:
298 case CudaArch::SM_53:
299 return CudaVersion::CUDA_70;
300 case CudaArch::SM_60:
301 case CudaArch::SM_61:
302 case CudaArch::SM_62:
303 return CudaVersion::CUDA_80;
304 case CudaArch::SM_70:
305 return CudaVersion::CUDA_90;
306 case CudaArch::SM_72:
307 return CudaVersion::CUDA_91;
308 case CudaArch::SM_75:
309 return CudaVersion::CUDA_100;
310 case CudaArch::GFX600:
311 case CudaArch::GFX601:
312 case CudaArch::GFX700:
313 case CudaArch::GFX701:
314 case CudaArch::GFX702:
315 case CudaArch::GFX703:
316 case CudaArch::GFX704:
317 case CudaArch::GFX801:
318 case CudaArch::GFX802:
319 case CudaArch::GFX803:
320 case CudaArch::GFX810:
321 case CudaArch::GFX900:
322 case CudaArch::GFX902:
323 case CudaArch::GFX904:
324 case CudaArch::GFX906:
325 case CudaArch::GFX908:
326 case CudaArch::GFX909:
327 case CudaArch::GFX1010:
328 case CudaArch::GFX1011:
329 case CudaArch::GFX1012:
330 return CudaVersion::CUDA_70;
332 llvm_unreachable("invalid enum");
335 CudaVersion MaxVersionForCudaArch(CudaArch A) {
337 case CudaArch::UNKNOWN:
338 return CudaVersion::UNKNOWN;
339 case CudaArch::SM_20:
340 case CudaArch::SM_21:
341 case CudaArch::GFX600:
342 case CudaArch::GFX601:
343 case CudaArch::GFX700:
344 case CudaArch::GFX701:
345 case CudaArch::GFX702:
346 case CudaArch::GFX703:
347 case CudaArch::GFX704:
348 case CudaArch::GFX801:
349 case CudaArch::GFX802:
350 case CudaArch::GFX803:
351 case CudaArch::GFX810:
352 case CudaArch::GFX900:
353 case CudaArch::GFX902:
354 case CudaArch::GFX1010:
355 case CudaArch::GFX1011:
356 case CudaArch::GFX1012:
357 return CudaVersion::CUDA_80;
359 return CudaVersion::LATEST;
363 static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
365 Version.getMajor() * 10 + Version.getMinor().getValueOr(0);
368 return CudaVersion::CUDA_70;
370 return CudaVersion::CUDA_75;
372 return CudaVersion::CUDA_80;
374 return CudaVersion::CUDA_90;
376 return CudaVersion::CUDA_91;
378 return CudaVersion::CUDA_92;
380 return CudaVersion::CUDA_100;
382 return CudaVersion::CUDA_101;
384 return CudaVersion::UNKNOWN;
388 bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) {
389 return CudaFeatureEnabled(ToCudaVersion(Version), Feature);
392 bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) {
394 case CudaFeature::CUDA_USES_NEW_LAUNCH:
395 return Version >= CudaVersion::CUDA_92;
396 case CudaFeature::CUDA_USES_FATBIN_REGISTER_END:
397 return Version >= CudaVersion::CUDA_101;
399 llvm_unreachable("Unknown CUDA feature.");