blob: b7e04bf3f9609026bc6e68522c83a3cbef972b04 [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";
Justin Lebar62907612016-07-06 21:21:39 +000061 }
Justin Lebard9bc4852016-07-07 01:06:59 +000062 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +000063}
64
65CudaArch StringToCudaArch(llvm::StringRef S) {
66 return llvm::StringSwitch<CudaArch>(S)
67 .Case("sm_20", CudaArch::SM_20)
68 .Case("sm_21", CudaArch::SM_21)
69 .Case("sm_30", CudaArch::SM_30)
70 .Case("sm_32", CudaArch::SM_32)
71 .Case("sm_35", CudaArch::SM_35)
72 .Case("sm_37", CudaArch::SM_37)
73 .Case("sm_50", CudaArch::SM_50)
74 .Case("sm_52", CudaArch::SM_52)
75 .Case("sm_53", CudaArch::SM_53)
76 .Case("sm_60", CudaArch::SM_60)
77 .Case("sm_61", CudaArch::SM_61)
78 .Case("sm_62", CudaArch::SM_62)
Artem Belevich8af4e232017-09-07 18:14:32 +000079 .Case("sm_70", CudaArch::SM_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +000080 .Case("sm_72", CudaArch::SM_72)
Justin Lebar62907612016-07-06 21:21:39 +000081 .Default(CudaArch::UNKNOWN);
82}
83
84const char *CudaVirtualArchToString(CudaVirtualArch A) {
85 switch (A) {
86 case CudaVirtualArch::UNKNOWN:
87 return "unknown";
88 case CudaVirtualArch::COMPUTE_20:
89 return "compute_20";
90 case CudaVirtualArch::COMPUTE_30:
91 return "compute_30";
92 case CudaVirtualArch::COMPUTE_32:
93 return "compute_32";
94 case CudaVirtualArch::COMPUTE_35:
95 return "compute_35";
96 case CudaVirtualArch::COMPUTE_37:
97 return "compute_37";
98 case CudaVirtualArch::COMPUTE_50:
99 return "compute_50";
100 case CudaVirtualArch::COMPUTE_52:
101 return "compute_52";
102 case CudaVirtualArch::COMPUTE_53:
103 return "compute_53";
104 case CudaVirtualArch::COMPUTE_60:
105 return "compute_60";
106 case CudaVirtualArch::COMPUTE_61:
107 return "compute_61";
108 case CudaVirtualArch::COMPUTE_62:
109 return "compute_62";
Artem Belevich8af4e232017-09-07 18:14:32 +0000110 case CudaVirtualArch::COMPUTE_70:
111 return "compute_70";
Artem Belevichfbc56a92018-01-30 00:00:12 +0000112 case CudaVirtualArch::COMPUTE_72:
113 return "compute_72";
Justin Lebar62907612016-07-06 21:21:39 +0000114 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000115 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000116}
117
118CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
119 return llvm::StringSwitch<CudaVirtualArch>(S)
120 .Case("compute_20", CudaVirtualArch::COMPUTE_20)
121 .Case("compute_30", CudaVirtualArch::COMPUTE_30)
122 .Case("compute_32", CudaVirtualArch::COMPUTE_32)
123 .Case("compute_35", CudaVirtualArch::COMPUTE_35)
124 .Case("compute_37", CudaVirtualArch::COMPUTE_37)
125 .Case("compute_50", CudaVirtualArch::COMPUTE_50)
126 .Case("compute_52", CudaVirtualArch::COMPUTE_52)
127 .Case("compute_53", CudaVirtualArch::COMPUTE_53)
128 .Case("compute_60", CudaVirtualArch::COMPUTE_60)
129 .Case("compute_61", CudaVirtualArch::COMPUTE_61)
130 .Case("compute_62", CudaVirtualArch::COMPUTE_62)
Artem Belevich8af4e232017-09-07 18:14:32 +0000131 .Case("compute_70", CudaVirtualArch::COMPUTE_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +0000132 .Case("compute_72", CudaVirtualArch::COMPUTE_72)
Justin Lebar62907612016-07-06 21:21:39 +0000133 .Default(CudaVirtualArch::UNKNOWN);
134}
135
136CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
137 switch (A) {
Erich Keaned45879d2018-02-08 23:16:00 +0000138 case CudaArch::LAST:
139 break;
Justin Lebar62907612016-07-06 21:21:39 +0000140 case CudaArch::UNKNOWN:
141 return CudaVirtualArch::UNKNOWN;
142 case CudaArch::SM_20:
143 case CudaArch::SM_21:
144 return CudaVirtualArch::COMPUTE_20;
145 case CudaArch::SM_30:
146 return CudaVirtualArch::COMPUTE_30;
147 case CudaArch::SM_32:
148 return CudaVirtualArch::COMPUTE_32;
149 case CudaArch::SM_35:
150 return CudaVirtualArch::COMPUTE_35;
151 case CudaArch::SM_37:
152 return CudaVirtualArch::COMPUTE_37;
153 case CudaArch::SM_50:
154 return CudaVirtualArch::COMPUTE_50;
155 case CudaArch::SM_52:
156 return CudaVirtualArch::COMPUTE_52;
157 case CudaArch::SM_53:
158 return CudaVirtualArch::COMPUTE_53;
159 case CudaArch::SM_60:
160 return CudaVirtualArch::COMPUTE_60;
161 case CudaArch::SM_61:
162 return CudaVirtualArch::COMPUTE_61;
163 case CudaArch::SM_62:
164 return CudaVirtualArch::COMPUTE_62;
Artem Belevich8af4e232017-09-07 18:14:32 +0000165 case CudaArch::SM_70:
166 return CudaVirtualArch::COMPUTE_70;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000167 case CudaArch::SM_72:
168 return CudaVirtualArch::COMPUTE_72;
Justin Lebar62907612016-07-06 21:21:39 +0000169 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000170 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000171}
172
173CudaVersion MinVersionForCudaArch(CudaArch A) {
174 switch (A) {
Erich Keaned45879d2018-02-08 23:16:00 +0000175 case CudaArch::LAST:
176 break;
Justin Lebar62907612016-07-06 21:21:39 +0000177 case CudaArch::UNKNOWN:
178 return CudaVersion::UNKNOWN;
179 case CudaArch::SM_20:
180 case CudaArch::SM_21:
181 case CudaArch::SM_30:
182 case CudaArch::SM_32:
183 case CudaArch::SM_35:
184 case CudaArch::SM_37:
185 case CudaArch::SM_50:
186 case CudaArch::SM_52:
187 case CudaArch::SM_53:
188 return CudaVersion::CUDA_70;
189 case CudaArch::SM_60:
190 case CudaArch::SM_61:
191 case CudaArch::SM_62:
192 return CudaVersion::CUDA_80;
Artem Belevich8af4e232017-09-07 18:14:32 +0000193 case CudaArch::SM_70:
194 return CudaVersion::CUDA_90;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000195 case CudaArch::SM_72:
196 return CudaVersion::CUDA_91;
Justin Lebar62907612016-07-06 21:21:39 +0000197 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000198 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000199}
200
Justin Lebar066494d2017-10-25 21:32:06 +0000201CudaVersion MaxVersionForCudaArch(CudaArch A) {
202 switch (A) {
203 case CudaArch::UNKNOWN:
204 return CudaVersion::UNKNOWN;
205 case CudaArch::SM_20:
206 case CudaArch::SM_21:
207 return CudaVersion::CUDA_80;
208 default:
209 return CudaVersion::LATEST;
210 }
211}
212
Justin Lebar62907612016-07-06 21:21:39 +0000213} // namespace clang