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