blob: 970c060c0be35f5d00bcbd9d0a1cb9932f2afbf3 [file] [log] [blame]
Justin Lebar62907612016-07-06 21:21:39 +00001#include "clang/Basic/Cuda.h"
2
3#include "llvm/ADT/StringRef.h"
4#include "llvm/ADT/StringSwitch.h"
Justin Lebard9bc4852016-07-07 01:06:59 +00005#include "llvm/Support/ErrorHandling.h"
Justin Lebar62907612016-07-06 21:21:39 +00006
7namespace clang {
8
9const char *CudaVersionToString(CudaVersion V) {
10 switch (V) {
11 case CudaVersion::UNKNOWN:
12 return "unknown";
13 case CudaVersion::CUDA_70:
14 return "7.0";
15 case CudaVersion::CUDA_75:
16 return "7.5";
17 case CudaVersion::CUDA_80:
18 return "8.0";
Artem Belevich8af4e232017-09-07 18:14:32 +000019 case CudaVersion::CUDA_90:
20 return "9.0";
Artem Belevichfbc56a92018-01-30 00:00:12 +000021 case CudaVersion::CUDA_91:
22 return "9.1";
Justin Lebar62907612016-07-06 21:21:39 +000023 }
Justin Lebard9bc4852016-07-07 01:06:59 +000024 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +000025}
26
27const char *CudaArchToString(CudaArch A) {
28 switch (A) {
Erich Keaned45879d2018-02-08 23:16:00 +000029 case CudaArch::LAST:
30 break;
Justin Lebar62907612016-07-06 21:21:39 +000031 case CudaArch::UNKNOWN:
32 return "unknown";
33 case CudaArch::SM_20:
34 return "sm_20";
35 case CudaArch::SM_21:
36 return "sm_21";
37 case CudaArch::SM_30:
38 return "sm_30";
39 case CudaArch::SM_32:
40 return "sm_32";
41 case CudaArch::SM_35:
42 return "sm_35";
43 case CudaArch::SM_37:
44 return "sm_37";
45 case CudaArch::SM_50:
46 return "sm_50";
47 case CudaArch::SM_52:
48 return "sm_52";
49 case CudaArch::SM_53:
50 return "sm_53";
51 case CudaArch::SM_60:
52 return "sm_60";
53 case CudaArch::SM_61:
54 return "sm_61";
55 case CudaArch::SM_62:
56 return "sm_62";
Artem Belevich8af4e232017-09-07 18:14:32 +000057 case CudaArch::SM_70:
58 return "sm_70";
Artem Belevichfbc56a92018-01-30 00:00:12 +000059 case CudaArch::SM_72:
60 return "sm_72";
Yaxun Liu8a5fc152018-04-04 21:19:27 +000061 case CudaArch::GFX600: // tahiti
62 return "gfx600";
63 case CudaArch::GFX601: // pitcairn, verde, oland,hainan
64 return "gfx601";
65 case CudaArch::GFX700: // kaveri
66 return "gfx700";
67 case CudaArch::GFX701: // hawaii
68 return "gfx701";
69 case CudaArch::GFX702: // 290,290x,R390,R390x
70 return "gfx702";
71 case CudaArch::GFX703: // kabini mullins
72 return "gfx703";
73 case CudaArch::GFX704: // bonaire
74 return "gfx704";
75 case CudaArch::GFX801: // carrizo
76 return "gfx801";
77 case CudaArch::GFX802: // tonga,iceland
78 return "gfx802";
79 case CudaArch::GFX803: // fiji,polaris10
80 return "gfx803";
81 case CudaArch::GFX810: // stoney
82 return "gfx810";
83 case CudaArch::GFX900: // vega, instinct
84 return "gfx900";
85 case CudaArch::GFX902: // TBA
86 return "gfx902";
Justin Lebar62907612016-07-06 21:21:39 +000087 }
Justin Lebard9bc4852016-07-07 01:06:59 +000088 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +000089}
90
91CudaArch StringToCudaArch(llvm::StringRef S) {
92 return llvm::StringSwitch<CudaArch>(S)
93 .Case("sm_20", CudaArch::SM_20)
94 .Case("sm_21", CudaArch::SM_21)
95 .Case("sm_30", CudaArch::SM_30)
96 .Case("sm_32", CudaArch::SM_32)
97 .Case("sm_35", CudaArch::SM_35)
98 .Case("sm_37", CudaArch::SM_37)
99 .Case("sm_50", CudaArch::SM_50)
100 .Case("sm_52", CudaArch::SM_52)
101 .Case("sm_53", CudaArch::SM_53)
102 .Case("sm_60", CudaArch::SM_60)
103 .Case("sm_61", CudaArch::SM_61)
104 .Case("sm_62", CudaArch::SM_62)
Artem Belevich8af4e232017-09-07 18:14:32 +0000105 .Case("sm_70", CudaArch::SM_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +0000106 .Case("sm_72", CudaArch::SM_72)
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000107 .Case("gfx600", CudaArch::GFX600)
108 .Case("gfx601", CudaArch::GFX601)
109 .Case("gfx700", CudaArch::GFX700)
110 .Case("gfx701", CudaArch::GFX701)
111 .Case("gfx702", CudaArch::GFX702)
112 .Case("gfx703", CudaArch::GFX703)
113 .Case("gfx704", CudaArch::GFX704)
114 .Case("gfx801", CudaArch::GFX801)
115 .Case("gfx802", CudaArch::GFX802)
116 .Case("gfx803", CudaArch::GFX803)
117 .Case("gfx810", CudaArch::GFX810)
118 .Case("gfx900", CudaArch::GFX900)
119 .Case("gfx902", CudaArch::GFX902)
Justin Lebar62907612016-07-06 21:21:39 +0000120 .Default(CudaArch::UNKNOWN);
121}
122
123const char *CudaVirtualArchToString(CudaVirtualArch A) {
124 switch (A) {
125 case CudaVirtualArch::UNKNOWN:
126 return "unknown";
127 case CudaVirtualArch::COMPUTE_20:
128 return "compute_20";
129 case CudaVirtualArch::COMPUTE_30:
130 return "compute_30";
131 case CudaVirtualArch::COMPUTE_32:
132 return "compute_32";
133 case CudaVirtualArch::COMPUTE_35:
134 return "compute_35";
135 case CudaVirtualArch::COMPUTE_37:
136 return "compute_37";
137 case CudaVirtualArch::COMPUTE_50:
138 return "compute_50";
139 case CudaVirtualArch::COMPUTE_52:
140 return "compute_52";
141 case CudaVirtualArch::COMPUTE_53:
142 return "compute_53";
143 case CudaVirtualArch::COMPUTE_60:
144 return "compute_60";
145 case CudaVirtualArch::COMPUTE_61:
146 return "compute_61";
147 case CudaVirtualArch::COMPUTE_62:
148 return "compute_62";
Artem Belevich8af4e232017-09-07 18:14:32 +0000149 case CudaVirtualArch::COMPUTE_70:
150 return "compute_70";
Artem Belevichfbc56a92018-01-30 00:00:12 +0000151 case CudaVirtualArch::COMPUTE_72:
152 return "compute_72";
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000153 case CudaVirtualArch::COMPUTE_AMDGCN:
154 return "compute_amdgcn";
Justin Lebar62907612016-07-06 21:21:39 +0000155 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000156 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000157}
158
159CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
160 return llvm::StringSwitch<CudaVirtualArch>(S)
161 .Case("compute_20", CudaVirtualArch::COMPUTE_20)
162 .Case("compute_30", CudaVirtualArch::COMPUTE_30)
163 .Case("compute_32", CudaVirtualArch::COMPUTE_32)
164 .Case("compute_35", CudaVirtualArch::COMPUTE_35)
165 .Case("compute_37", CudaVirtualArch::COMPUTE_37)
166 .Case("compute_50", CudaVirtualArch::COMPUTE_50)
167 .Case("compute_52", CudaVirtualArch::COMPUTE_52)
168 .Case("compute_53", CudaVirtualArch::COMPUTE_53)
169 .Case("compute_60", CudaVirtualArch::COMPUTE_60)
170 .Case("compute_61", CudaVirtualArch::COMPUTE_61)
171 .Case("compute_62", CudaVirtualArch::COMPUTE_62)
Artem Belevich8af4e232017-09-07 18:14:32 +0000172 .Case("compute_70", CudaVirtualArch::COMPUTE_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +0000173 .Case("compute_72", CudaVirtualArch::COMPUTE_72)
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000174 .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN)
Justin Lebar62907612016-07-06 21:21:39 +0000175 .Default(CudaVirtualArch::UNKNOWN);
176}
177
178CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
179 switch (A) {
Erich Keaned45879d2018-02-08 23:16:00 +0000180 case CudaArch::LAST:
181 break;
Justin Lebar62907612016-07-06 21:21:39 +0000182 case CudaArch::UNKNOWN:
183 return CudaVirtualArch::UNKNOWN;
184 case CudaArch::SM_20:
185 case CudaArch::SM_21:
186 return CudaVirtualArch::COMPUTE_20;
187 case CudaArch::SM_30:
188 return CudaVirtualArch::COMPUTE_30;
189 case CudaArch::SM_32:
190 return CudaVirtualArch::COMPUTE_32;
191 case CudaArch::SM_35:
192 return CudaVirtualArch::COMPUTE_35;
193 case CudaArch::SM_37:
194 return CudaVirtualArch::COMPUTE_37;
195 case CudaArch::SM_50:
196 return CudaVirtualArch::COMPUTE_50;
197 case CudaArch::SM_52:
198 return CudaVirtualArch::COMPUTE_52;
199 case CudaArch::SM_53:
200 return CudaVirtualArch::COMPUTE_53;
201 case CudaArch::SM_60:
202 return CudaVirtualArch::COMPUTE_60;
203 case CudaArch::SM_61:
204 return CudaVirtualArch::COMPUTE_61;
205 case CudaArch::SM_62:
206 return CudaVirtualArch::COMPUTE_62;
Artem Belevich8af4e232017-09-07 18:14:32 +0000207 case CudaArch::SM_70:
208 return CudaVirtualArch::COMPUTE_70;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000209 case CudaArch::SM_72:
210 return CudaVirtualArch::COMPUTE_72;
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000211 case CudaArch::GFX600:
212 case CudaArch::GFX601:
213 case CudaArch::GFX700:
214 case CudaArch::GFX701:
215 case CudaArch::GFX702:
216 case CudaArch::GFX703:
217 case CudaArch::GFX704:
218 case CudaArch::GFX801:
219 case CudaArch::GFX802:
220 case CudaArch::GFX803:
221 case CudaArch::GFX810:
222 case CudaArch::GFX900:
223 case CudaArch::GFX902:
224 return CudaVirtualArch::COMPUTE_AMDGCN;
Justin Lebar62907612016-07-06 21:21:39 +0000225 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000226 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000227}
228
229CudaVersion MinVersionForCudaArch(CudaArch A) {
230 switch (A) {
Erich Keaned45879d2018-02-08 23:16:00 +0000231 case CudaArch::LAST:
232 break;
Justin Lebar62907612016-07-06 21:21:39 +0000233 case CudaArch::UNKNOWN:
234 return CudaVersion::UNKNOWN;
235 case CudaArch::SM_20:
236 case CudaArch::SM_21:
237 case CudaArch::SM_30:
238 case CudaArch::SM_32:
239 case CudaArch::SM_35:
240 case CudaArch::SM_37:
241 case CudaArch::SM_50:
242 case CudaArch::SM_52:
243 case CudaArch::SM_53:
244 return CudaVersion::CUDA_70;
245 case CudaArch::SM_60:
246 case CudaArch::SM_61:
247 case CudaArch::SM_62:
248 return CudaVersion::CUDA_80;
Artem Belevich8af4e232017-09-07 18:14:32 +0000249 case CudaArch::SM_70:
250 return CudaVersion::CUDA_90;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000251 case CudaArch::SM_72:
252 return CudaVersion::CUDA_91;
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000253 case CudaArch::GFX600:
254 case CudaArch::GFX601:
255 case CudaArch::GFX700:
256 case CudaArch::GFX701:
257 case CudaArch::GFX702:
258 case CudaArch::GFX703:
259 case CudaArch::GFX704:
260 case CudaArch::GFX801:
261 case CudaArch::GFX802:
262 case CudaArch::GFX803:
263 case CudaArch::GFX810:
264 case CudaArch::GFX900:
265 case CudaArch::GFX902:
266 return CudaVersion::CUDA_70;
Justin Lebar62907612016-07-06 21:21:39 +0000267 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000268 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000269}
270
Justin Lebar066494d2017-10-25 21:32:06 +0000271CudaVersion MaxVersionForCudaArch(CudaArch A) {
272 switch (A) {
273 case CudaArch::UNKNOWN:
274 return CudaVersion::UNKNOWN;
275 case CudaArch::SM_20:
276 case CudaArch::SM_21:
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000277 case CudaArch::GFX600:
278 case CudaArch::GFX601:
279 case CudaArch::GFX700:
280 case CudaArch::GFX701:
281 case CudaArch::GFX702:
282 case CudaArch::GFX703:
283 case CudaArch::GFX704:
284 case CudaArch::GFX801:
285 case CudaArch::GFX802:
286 case CudaArch::GFX803:
287 case CudaArch::GFX810:
288 case CudaArch::GFX900:
289 case CudaArch::GFX902:
Justin Lebar066494d2017-10-25 21:32:06 +0000290 return CudaVersion::CUDA_80;
291 default:
292 return CudaVersion::LATEST;
293 }
294}
295
Justin Lebar62907612016-07-06 21:21:39 +0000296} // namespace clang