1 #include "clang/Basic/Cuda.h"
2 
3 #include "llvm/ADT/StringRef.h"
4 #include "llvm/ADT/StringSwitch.h"
5 #include "llvm/Support/ErrorHandling.h"
6 
7 namespace clang {
8 
9 const 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";
19   case CudaVersion::CUDA_90:
20     return "9.0";
21   case CudaVersion::CUDA_91:
22     return "9.1";
23   }
24   llvm_unreachable("invalid enum");
25 }
26 
27 const char *CudaArchToString(CudaArch A) {
28   switch (A) {
29   case CudaArch::LAST:
30     break;
31   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";
57   case CudaArch::SM_70:
58     return "sm_70";
59   case CudaArch::SM_72:
60     return "sm_72";
61   }
62   llvm_unreachable("invalid enum");
63 }
64 
65 CudaArch 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)
79       .Case("sm_70", CudaArch::SM_70)
80       .Case("sm_72", CudaArch::SM_72)
81       .Default(CudaArch::UNKNOWN);
82 }
83 
84 const 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";
110   case CudaVirtualArch::COMPUTE_70:
111     return "compute_70";
112   case CudaVirtualArch::COMPUTE_72:
113     return "compute_72";
114   }
115   llvm_unreachable("invalid enum");
116 }
117 
118 CudaVirtualArch 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)
131       .Case("compute_70", CudaVirtualArch::COMPUTE_70)
132       .Case("compute_72", CudaVirtualArch::COMPUTE_72)
133       .Default(CudaVirtualArch::UNKNOWN);
134 }
135 
136 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
137   switch (A) {
138   case CudaArch::LAST:
139     break;
140   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;
165   case CudaArch::SM_70:
166     return CudaVirtualArch::COMPUTE_70;
167   case CudaArch::SM_72:
168     return CudaVirtualArch::COMPUTE_72;
169   }
170   llvm_unreachable("invalid enum");
171 }
172 
173 CudaVersion MinVersionForCudaArch(CudaArch A) {
174   switch (A) {
175   case CudaArch::LAST:
176     break;
177   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;
193   case CudaArch::SM_70:
194     return CudaVersion::CUDA_90;
195   case CudaArch::SM_72:
196     return CudaVersion::CUDA_91;
197   }
198   llvm_unreachable("invalid enum");
199 }
200 
201 CudaVersion 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 
213 } // namespace clang
214