xref: /aosp_15_r20/external/clang/lib/Basic/Cuda.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li #include "clang/Basic/Cuda.h"
2*67e74705SXin Li 
3*67e74705SXin Li #include "llvm/ADT/StringRef.h"
4*67e74705SXin Li #include "llvm/ADT/StringSwitch.h"
5*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
6*67e74705SXin Li 
7*67e74705SXin Li namespace clang {
8*67e74705SXin Li 
CudaVersionToString(CudaVersion V)9*67e74705SXin Li const char *CudaVersionToString(CudaVersion V) {
10*67e74705SXin Li   switch (V) {
11*67e74705SXin Li   case CudaVersion::UNKNOWN:
12*67e74705SXin Li     return "unknown";
13*67e74705SXin Li   case CudaVersion::CUDA_70:
14*67e74705SXin Li     return "7.0";
15*67e74705SXin Li   case CudaVersion::CUDA_75:
16*67e74705SXin Li     return "7.5";
17*67e74705SXin Li   case CudaVersion::CUDA_80:
18*67e74705SXin Li     return "8.0";
19*67e74705SXin Li   }
20*67e74705SXin Li   llvm_unreachable("invalid enum");
21*67e74705SXin Li }
22*67e74705SXin Li 
CudaArchToString(CudaArch A)23*67e74705SXin Li const char *CudaArchToString(CudaArch A) {
24*67e74705SXin Li   switch (A) {
25*67e74705SXin Li   case CudaArch::UNKNOWN:
26*67e74705SXin Li     return "unknown";
27*67e74705SXin Li   case CudaArch::SM_20:
28*67e74705SXin Li     return "sm_20";
29*67e74705SXin Li   case CudaArch::SM_21:
30*67e74705SXin Li     return "sm_21";
31*67e74705SXin Li   case CudaArch::SM_30:
32*67e74705SXin Li     return "sm_30";
33*67e74705SXin Li   case CudaArch::SM_32:
34*67e74705SXin Li     return "sm_32";
35*67e74705SXin Li   case CudaArch::SM_35:
36*67e74705SXin Li     return "sm_35";
37*67e74705SXin Li   case CudaArch::SM_37:
38*67e74705SXin Li     return "sm_37";
39*67e74705SXin Li   case CudaArch::SM_50:
40*67e74705SXin Li     return "sm_50";
41*67e74705SXin Li   case CudaArch::SM_52:
42*67e74705SXin Li     return "sm_52";
43*67e74705SXin Li   case CudaArch::SM_53:
44*67e74705SXin Li     return "sm_53";
45*67e74705SXin Li   case CudaArch::SM_60:
46*67e74705SXin Li     return "sm_60";
47*67e74705SXin Li   case CudaArch::SM_61:
48*67e74705SXin Li     return "sm_61";
49*67e74705SXin Li   case CudaArch::SM_62:
50*67e74705SXin Li     return "sm_62";
51*67e74705SXin Li   }
52*67e74705SXin Li   llvm_unreachable("invalid enum");
53*67e74705SXin Li }
54*67e74705SXin Li 
StringToCudaArch(llvm::StringRef S)55*67e74705SXin Li CudaArch StringToCudaArch(llvm::StringRef S) {
56*67e74705SXin Li   return llvm::StringSwitch<CudaArch>(S)
57*67e74705SXin Li       .Case("sm_20", CudaArch::SM_20)
58*67e74705SXin Li       .Case("sm_21", CudaArch::SM_21)
59*67e74705SXin Li       .Case("sm_30", CudaArch::SM_30)
60*67e74705SXin Li       .Case("sm_32", CudaArch::SM_32)
61*67e74705SXin Li       .Case("sm_35", CudaArch::SM_35)
62*67e74705SXin Li       .Case("sm_37", CudaArch::SM_37)
63*67e74705SXin Li       .Case("sm_50", CudaArch::SM_50)
64*67e74705SXin Li       .Case("sm_52", CudaArch::SM_52)
65*67e74705SXin Li       .Case("sm_53", CudaArch::SM_53)
66*67e74705SXin Li       .Case("sm_60", CudaArch::SM_60)
67*67e74705SXin Li       .Case("sm_61", CudaArch::SM_61)
68*67e74705SXin Li       .Case("sm_62", CudaArch::SM_62)
69*67e74705SXin Li       .Default(CudaArch::UNKNOWN);
70*67e74705SXin Li }
71*67e74705SXin Li 
CudaVirtualArchToString(CudaVirtualArch A)72*67e74705SXin Li const char *CudaVirtualArchToString(CudaVirtualArch A) {
73*67e74705SXin Li   switch (A) {
74*67e74705SXin Li   case CudaVirtualArch::UNKNOWN:
75*67e74705SXin Li     return "unknown";
76*67e74705SXin Li   case CudaVirtualArch::COMPUTE_20:
77*67e74705SXin Li     return "compute_20";
78*67e74705SXin Li   case CudaVirtualArch::COMPUTE_30:
79*67e74705SXin Li     return "compute_30";
80*67e74705SXin Li   case CudaVirtualArch::COMPUTE_32:
81*67e74705SXin Li     return "compute_32";
82*67e74705SXin Li   case CudaVirtualArch::COMPUTE_35:
83*67e74705SXin Li     return "compute_35";
84*67e74705SXin Li   case CudaVirtualArch::COMPUTE_37:
85*67e74705SXin Li     return "compute_37";
86*67e74705SXin Li   case CudaVirtualArch::COMPUTE_50:
87*67e74705SXin Li     return "compute_50";
88*67e74705SXin Li   case CudaVirtualArch::COMPUTE_52:
89*67e74705SXin Li     return "compute_52";
90*67e74705SXin Li   case CudaVirtualArch::COMPUTE_53:
91*67e74705SXin Li     return "compute_53";
92*67e74705SXin Li   case CudaVirtualArch::COMPUTE_60:
93*67e74705SXin Li     return "compute_60";
94*67e74705SXin Li   case CudaVirtualArch::COMPUTE_61:
95*67e74705SXin Li     return "compute_61";
96*67e74705SXin Li   case CudaVirtualArch::COMPUTE_62:
97*67e74705SXin Li     return "compute_62";
98*67e74705SXin Li   }
99*67e74705SXin Li   llvm_unreachable("invalid enum");
100*67e74705SXin Li }
101*67e74705SXin Li 
StringToCudaVirtualArch(llvm::StringRef S)102*67e74705SXin Li CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) {
103*67e74705SXin Li   return llvm::StringSwitch<CudaVirtualArch>(S)
104*67e74705SXin Li       .Case("compute_20", CudaVirtualArch::COMPUTE_20)
105*67e74705SXin Li       .Case("compute_30", CudaVirtualArch::COMPUTE_30)
106*67e74705SXin Li       .Case("compute_32", CudaVirtualArch::COMPUTE_32)
107*67e74705SXin Li       .Case("compute_35", CudaVirtualArch::COMPUTE_35)
108*67e74705SXin Li       .Case("compute_37", CudaVirtualArch::COMPUTE_37)
109*67e74705SXin Li       .Case("compute_50", CudaVirtualArch::COMPUTE_50)
110*67e74705SXin Li       .Case("compute_52", CudaVirtualArch::COMPUTE_52)
111*67e74705SXin Li       .Case("compute_53", CudaVirtualArch::COMPUTE_53)
112*67e74705SXin Li       .Case("compute_60", CudaVirtualArch::COMPUTE_60)
113*67e74705SXin Li       .Case("compute_61", CudaVirtualArch::COMPUTE_61)
114*67e74705SXin Li       .Case("compute_62", CudaVirtualArch::COMPUTE_62)
115*67e74705SXin Li       .Default(CudaVirtualArch::UNKNOWN);
116*67e74705SXin Li }
117*67e74705SXin Li 
VirtualArchForCudaArch(CudaArch A)118*67e74705SXin Li CudaVirtualArch VirtualArchForCudaArch(CudaArch A) {
119*67e74705SXin Li   switch (A) {
120*67e74705SXin Li   case CudaArch::UNKNOWN:
121*67e74705SXin Li     return CudaVirtualArch::UNKNOWN;
122*67e74705SXin Li   case CudaArch::SM_20:
123*67e74705SXin Li   case CudaArch::SM_21:
124*67e74705SXin Li     return CudaVirtualArch::COMPUTE_20;
125*67e74705SXin Li   case CudaArch::SM_30:
126*67e74705SXin Li     return CudaVirtualArch::COMPUTE_30;
127*67e74705SXin Li   case CudaArch::SM_32:
128*67e74705SXin Li     return CudaVirtualArch::COMPUTE_32;
129*67e74705SXin Li   case CudaArch::SM_35:
130*67e74705SXin Li     return CudaVirtualArch::COMPUTE_35;
131*67e74705SXin Li   case CudaArch::SM_37:
132*67e74705SXin Li     return CudaVirtualArch::COMPUTE_37;
133*67e74705SXin Li   case CudaArch::SM_50:
134*67e74705SXin Li     return CudaVirtualArch::COMPUTE_50;
135*67e74705SXin Li   case CudaArch::SM_52:
136*67e74705SXin Li     return CudaVirtualArch::COMPUTE_52;
137*67e74705SXin Li   case CudaArch::SM_53:
138*67e74705SXin Li     return CudaVirtualArch::COMPUTE_53;
139*67e74705SXin Li   case CudaArch::SM_60:
140*67e74705SXin Li     return CudaVirtualArch::COMPUTE_60;
141*67e74705SXin Li   case CudaArch::SM_61:
142*67e74705SXin Li     return CudaVirtualArch::COMPUTE_61;
143*67e74705SXin Li   case CudaArch::SM_62:
144*67e74705SXin Li     return CudaVirtualArch::COMPUTE_62;
145*67e74705SXin Li   }
146*67e74705SXin Li   llvm_unreachable("invalid enum");
147*67e74705SXin Li }
148*67e74705SXin Li 
MinVersionForCudaArch(CudaArch A)149*67e74705SXin Li CudaVersion MinVersionForCudaArch(CudaArch A) {
150*67e74705SXin Li   switch (A) {
151*67e74705SXin Li   case CudaArch::UNKNOWN:
152*67e74705SXin Li     return CudaVersion::UNKNOWN;
153*67e74705SXin Li   case CudaArch::SM_20:
154*67e74705SXin Li   case CudaArch::SM_21:
155*67e74705SXin Li   case CudaArch::SM_30:
156*67e74705SXin Li   case CudaArch::SM_32:
157*67e74705SXin Li   case CudaArch::SM_35:
158*67e74705SXin Li   case CudaArch::SM_37:
159*67e74705SXin Li   case CudaArch::SM_50:
160*67e74705SXin Li   case CudaArch::SM_52:
161*67e74705SXin Li   case CudaArch::SM_53:
162*67e74705SXin Li     return CudaVersion::CUDA_70;
163*67e74705SXin Li   case CudaArch::SM_60:
164*67e74705SXin Li   case CudaArch::SM_61:
165*67e74705SXin Li   case CudaArch::SM_62:
166*67e74705SXin Li     return CudaVersion::CUDA_80;
167*67e74705SXin Li   }
168*67e74705SXin Li   llvm_unreachable("invalid enum");
169*67e74705SXin Li }
170*67e74705SXin Li 
171*67e74705SXin Li } // namespace clang
172