blob: 4e61743ab0cadce5d094fe26698a01f31a77fe4b [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) {
29 case CudaArch::UNKNOWN:
30 return "unknown";
31 case CudaArch::SM_20:
32 return "sm_20";
33 case CudaArch::SM_21:
34 return "sm_21";
35 case CudaArch::SM_30:
36 return "sm_30";
37 case CudaArch::SM_32:
38 return "sm_32";
39 case CudaArch::SM_35:
40 return "sm_35";
41 case CudaArch::SM_37:
42 return "sm_37";
43 case CudaArch::SM_50:
44 return "sm_50";
45 case CudaArch::SM_52:
46 return "sm_52";
47 case CudaArch::SM_53:
48 return "sm_53";
49 case CudaArch::SM_60:
50 return "sm_60";
51 case CudaArch::SM_61:
52 return "sm_61";
53 case CudaArch::SM_62:
54 return "sm_62";
Artem Belevich8af4e232017-09-07 18:14:32 +000055 case CudaArch::SM_70:
56 return "sm_70";
Artem Belevichfbc56a92018-01-30 00:00:12 +000057 case CudaArch::SM_72:
58 return "sm_72";
Justin Lebar62907612016-07-06 21:21:39 +000059 }
Justin Lebard9bc4852016-07-07 01:06:59 +000060 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +000061}
62
63CudaArch StringToCudaArch(llvm::StringRef S) {
64 return llvm::StringSwitch<CudaArch>(S)
65 .Case("sm_20", CudaArch::SM_20)
66 .Case("sm_21", CudaArch::SM_21)
67 .Case("sm_30", CudaArch::SM_30)
68 .Case("sm_32", CudaArch::SM_32)
69 .Case("sm_35", CudaArch::SM_35)
70 .Case("sm_37", CudaArch::SM_37)
71 .Case("sm_50", CudaArch::SM_50)
72 .Case("sm_52", CudaArch::SM_52)
73 .Case("sm_53", CudaArch::SM_53)
74 .Case("sm_60", CudaArch::SM_60)
75 .Case("sm_61", CudaArch::SM_61)
76 .Case("sm_62", CudaArch::SM_62)
Artem Belevich8af4e232017-09-07 18:14:32 +000077 .Case("sm_70", CudaArch::SM_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +000078 .Case("sm_72", CudaArch::SM_72)
Justin Lebar62907612016-07-06 21:21:39 +000079 .Default(CudaArch::UNKNOWN);
80}
81
82const char *CudaVirtualArchToString(CudaVirtualArch A) {
83 switch (A) {
84 case CudaVirtualArch::UNKNOWN:
85 return "unknown";
86 case CudaVirtualArch::COMPUTE_20:
87 return "compute_20";
88 case CudaVirtualArch::COMPUTE_30:
89 return "compute_30";
90 case CudaVirtualArch::COMPUTE_32:
91 return "compute_32";
92 case CudaVirtualArch::COMPUTE_35:
93 return "compute_35";
94 case CudaVirtualArch::COMPUTE_37:
95 return "compute_37";
96 case CudaVirtualArch::COMPUTE_50:
97 return "compute_50";
98 case CudaVirtualArch::COMPUTE_52:
99 return "compute_52";
100 case CudaVirtualArch::COMPUTE_53:
101 return "compute_53";
102 case CudaVirtualArch::COMPUTE_60:
103 return "compute_60";
104 case CudaVirtualArch::COMPUTE_61:
105 return "compute_61";
106 case CudaVirtualArch::COMPUTE_62:
107 return "compute_62";
Artem Belevich8af4e232017-09-07 18:14:32 +0000108 case CudaVirtualArch::COMPUTE_70:
109 return "compute_70";
Artem Belevichfbc56a92018-01-30 00:00:12 +0000110 case CudaVirtualArch::COMPUTE_72:
111 return "compute_72";
Justin Lebar62907612016-07-06 21:21:39 +0000112 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000113 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000114}
115
116CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
117 return llvm::StringSwitch<CudaVirtualArch>(S)
118 .Case("compute_20", CudaVirtualArch::COMPUTE_20)
119 .Case("compute_30", CudaVirtualArch::COMPUTE_30)
120 .Case("compute_32", CudaVirtualArch::COMPUTE_32)
121 .Case("compute_35", CudaVirtualArch::COMPUTE_35)
122 .Case("compute_37", CudaVirtualArch::COMPUTE_37)
123 .Case("compute_50", CudaVirtualArch::COMPUTE_50)
124 .Case("compute_52", CudaVirtualArch::COMPUTE_52)
125 .Case("compute_53", CudaVirtualArch::COMPUTE_53)
126 .Case("compute_60", CudaVirtualArch::COMPUTE_60)
127 .Case("compute_61", CudaVirtualArch::COMPUTE_61)
128 .Case("compute_62", CudaVirtualArch::COMPUTE_62)
Artem Belevich8af4e232017-09-07 18:14:32 +0000129 .Case("compute_70", CudaVirtualArch::COMPUTE_70)
Artem Belevichfbc56a92018-01-30 00:00:12 +0000130 .Case("compute_72", CudaVirtualArch::COMPUTE_72)
Justin Lebar62907612016-07-06 21:21:39 +0000131 .Default(CudaVirtualArch::UNKNOWN);
132}
133
134CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
135 switch (A) {
136 case CudaArch::UNKNOWN:
137 return CudaVirtualArch::UNKNOWN;
138 case CudaArch::SM_20:
139 case CudaArch::SM_21:
140 return CudaVirtualArch::COMPUTE_20;
141 case CudaArch::SM_30:
142 return CudaVirtualArch::COMPUTE_30;
143 case CudaArch::SM_32:
144 return CudaVirtualArch::COMPUTE_32;
145 case CudaArch::SM_35:
146 return CudaVirtualArch::COMPUTE_35;
147 case CudaArch::SM_37:
148 return CudaVirtualArch::COMPUTE_37;
149 case CudaArch::SM_50:
150 return CudaVirtualArch::COMPUTE_50;
151 case CudaArch::SM_52:
152 return CudaVirtualArch::COMPUTE_52;
153 case CudaArch::SM_53:
154 return CudaVirtualArch::COMPUTE_53;
155 case CudaArch::SM_60:
156 return CudaVirtualArch::COMPUTE_60;
157 case CudaArch::SM_61:
158 return CudaVirtualArch::COMPUTE_61;
159 case CudaArch::SM_62:
160 return CudaVirtualArch::COMPUTE_62;
Artem Belevich8af4e232017-09-07 18:14:32 +0000161 case CudaArch::SM_70:
162 return CudaVirtualArch::COMPUTE_70;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000163 case CudaArch::SM_72:
164 return CudaVirtualArch::COMPUTE_72;
Justin Lebar62907612016-07-06 21:21:39 +0000165 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000166 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000167}
168
169CudaVersion MinVersionForCudaArch(CudaArch A) {
170 switch (A) {
171 case CudaArch::UNKNOWN:
172 return CudaVersion::UNKNOWN;
173 case CudaArch::SM_20:
174 case CudaArch::SM_21:
175 case CudaArch::SM_30:
176 case CudaArch::SM_32:
177 case CudaArch::SM_35:
178 case CudaArch::SM_37:
179 case CudaArch::SM_50:
180 case CudaArch::SM_52:
181 case CudaArch::SM_53:
182 return CudaVersion::CUDA_70;
183 case CudaArch::SM_60:
184 case CudaArch::SM_61:
185 case CudaArch::SM_62:
186 return CudaVersion::CUDA_80;
Artem Belevich8af4e232017-09-07 18:14:32 +0000187 case CudaArch::SM_70:
188 return CudaVersion::CUDA_90;
Artem Belevichfbc56a92018-01-30 00:00:12 +0000189 case CudaArch::SM_72:
190 return CudaVersion::CUDA_91;
Justin Lebar62907612016-07-06 21:21:39 +0000191 }
Justin Lebard9bc4852016-07-07 01:06:59 +0000192 llvm_unreachable("invalid enum");
Justin Lebar62907612016-07-06 21:21:39 +0000193}
194
Justin Lebar066494d2017-10-25 21:32:06 +0000195CudaVersion MaxVersionForCudaArch(CudaArch A) {
196 switch (A) {
197 case CudaArch::UNKNOWN:
198 return CudaVersion::UNKNOWN;
199 case CudaArch::SM_20:
200 case CudaArch::SM_21:
201 return CudaVersion::CUDA_80;
202 default:
203 return CudaVersion::LATEST;
204 }
205}
206
Justin Lebar62907612016-07-06 21:21:39 +0000207} // namespace clang