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