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::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";
55   case CudaArch::SM_70:
56     return "sm_70";
57   case CudaArch::SM_72:
58     return "sm_72";
59   }
60   llvm_unreachable("invalid enum");
61 }
62 
63 CudaArch 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)
77       .Case("sm_70", CudaArch::SM_70)
78       .Case("sm_72", CudaArch::SM_72)
79       .Default(CudaArch::UNKNOWN);
80 }
81 
82 const 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";
108   case CudaVirtualArch::COMPUTE_70:
109     return "compute_70";
110   case CudaVirtualArch::COMPUTE_72:
111     return "compute_72";
112   }
113   llvm_unreachable("invalid enum");
114 }
115 
116 CudaVirtualArch 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)
129       .Case("compute_70", CudaVirtualArch::COMPUTE_70)
130       .Case("compute_72", CudaVirtualArch::COMPUTE_72)
131       .Default(CudaVirtualArch::UNKNOWN);
132 }
133 
134 CudaVirtualArch 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;
161   case CudaArch::SM_70:
162     return CudaVirtualArch::COMPUTE_70;
163   case CudaArch::SM_72:
164     return CudaVirtualArch::COMPUTE_72;
165   }
166   llvm_unreachable("invalid enum");
167 }
168 
169 CudaVersion 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;
187   case CudaArch::SM_70:
188     return CudaVersion::CUDA_90;
189   case CudaArch::SM_72:
190     return CudaVersion::CUDA_91;
191   }
192   llvm_unreachable("invalid enum");
193 }
194 
195 CudaVersion 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 
207 } // namespace clang
208