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 case CudaVersion::CUDA_92: 24 return "9.2"; 25 case CudaVersion::CUDA_100: 26 return "10.0"; 27 } 28 llvm_unreachable("invalid enum"); 29 } 30 31 const char *CudaArchToString(CudaArch A) { 32 switch (A) { 33 case CudaArch::LAST: 34 break; 35 case CudaArch::UNKNOWN: 36 return "unknown"; 37 case CudaArch::SM_20: 38 return "sm_20"; 39 case CudaArch::SM_21: 40 return "sm_21"; 41 case CudaArch::SM_30: 42 return "sm_30"; 43 case CudaArch::SM_32: 44 return "sm_32"; 45 case CudaArch::SM_35: 46 return "sm_35"; 47 case CudaArch::SM_37: 48 return "sm_37"; 49 case CudaArch::SM_50: 50 return "sm_50"; 51 case CudaArch::SM_52: 52 return "sm_52"; 53 case CudaArch::SM_53: 54 return "sm_53"; 55 case CudaArch::SM_60: 56 return "sm_60"; 57 case CudaArch::SM_61: 58 return "sm_61"; 59 case CudaArch::SM_62: 60 return "sm_62"; 61 case CudaArch::SM_70: 62 return "sm_70"; 63 case CudaArch::SM_72: 64 return "sm_72"; 65 case CudaArch::SM_75: 66 return "sm_75"; 67 case CudaArch::GFX600: // tahiti 68 return "gfx600"; 69 case CudaArch::GFX601: // pitcairn, verde, oland,hainan 70 return "gfx601"; 71 case CudaArch::GFX700: // kaveri 72 return "gfx700"; 73 case CudaArch::GFX701: // hawaii 74 return "gfx701"; 75 case CudaArch::GFX702: // 290,290x,R390,R390x 76 return "gfx702"; 77 case CudaArch::GFX703: // kabini mullins 78 return "gfx703"; 79 case CudaArch::GFX704: // bonaire 80 return "gfx704"; 81 case CudaArch::GFX801: // carrizo 82 return "gfx801"; 83 case CudaArch::GFX802: // tonga,iceland 84 return "gfx802"; 85 case CudaArch::GFX803: // fiji,polaris10 86 return "gfx803"; 87 case CudaArch::GFX810: // stoney 88 return "gfx810"; 89 case CudaArch::GFX900: // vega, instinct 90 return "gfx900"; 91 case CudaArch::GFX902: // TBA 92 return "gfx902"; 93 case CudaArch::GFX904: // TBA 94 return "gfx904"; 95 case CudaArch::GFX906: // TBA 96 return "gfx906"; 97 case CudaArch::GFX909: // TBA 98 return "gfx909"; 99 } 100 llvm_unreachable("invalid enum"); 101 } 102 103 CudaArch StringToCudaArch(llvm::StringRef S) { 104 return llvm::StringSwitch<CudaArch>(S) 105 .Case("sm_20", CudaArch::SM_20) 106 .Case("sm_21", CudaArch::SM_21) 107 .Case("sm_30", CudaArch::SM_30) 108 .Case("sm_32", CudaArch::SM_32) 109 .Case("sm_35", CudaArch::SM_35) 110 .Case("sm_37", CudaArch::SM_37) 111 .Case("sm_50", CudaArch::SM_50) 112 .Case("sm_52", CudaArch::SM_52) 113 .Case("sm_53", CudaArch::SM_53) 114 .Case("sm_60", CudaArch::SM_60) 115 .Case("sm_61", CudaArch::SM_61) 116 .Case("sm_62", CudaArch::SM_62) 117 .Case("sm_70", CudaArch::SM_70) 118 .Case("sm_72", CudaArch::SM_72) 119 .Case("sm_75", CudaArch::SM_75) 120 .Case("gfx600", CudaArch::GFX600) 121 .Case("gfx601", CudaArch::GFX601) 122 .Case("gfx700", CudaArch::GFX700) 123 .Case("gfx701", CudaArch::GFX701) 124 .Case("gfx702", CudaArch::GFX702) 125 .Case("gfx703", CudaArch::GFX703) 126 .Case("gfx704", CudaArch::GFX704) 127 .Case("gfx801", CudaArch::GFX801) 128 .Case("gfx802", CudaArch::GFX802) 129 .Case("gfx803", CudaArch::GFX803) 130 .Case("gfx810", CudaArch::GFX810) 131 .Case("gfx900", CudaArch::GFX900) 132 .Case("gfx902", CudaArch::GFX902) 133 .Case("gfx904", CudaArch::GFX904) 134 .Case("gfx906", CudaArch::GFX906) 135 .Case("gfx909", CudaArch::GFX909) 136 .Default(CudaArch::UNKNOWN); 137 } 138 139 const char *CudaVirtualArchToString(CudaVirtualArch A) { 140 switch (A) { 141 case CudaVirtualArch::UNKNOWN: 142 return "unknown"; 143 case CudaVirtualArch::COMPUTE_20: 144 return "compute_20"; 145 case CudaVirtualArch::COMPUTE_30: 146 return "compute_30"; 147 case CudaVirtualArch::COMPUTE_32: 148 return "compute_32"; 149 case CudaVirtualArch::COMPUTE_35: 150 return "compute_35"; 151 case CudaVirtualArch::COMPUTE_37: 152 return "compute_37"; 153 case CudaVirtualArch::COMPUTE_50: 154 return "compute_50"; 155 case CudaVirtualArch::COMPUTE_52: 156 return "compute_52"; 157 case CudaVirtualArch::COMPUTE_53: 158 return "compute_53"; 159 case CudaVirtualArch::COMPUTE_60: 160 return "compute_60"; 161 case CudaVirtualArch::COMPUTE_61: 162 return "compute_61"; 163 case CudaVirtualArch::COMPUTE_62: 164 return "compute_62"; 165 case CudaVirtualArch::COMPUTE_70: 166 return "compute_70"; 167 case CudaVirtualArch::COMPUTE_72: 168 return "compute_72"; 169 case CudaVirtualArch::COMPUTE_75: 170 return "compute_75"; 171 case CudaVirtualArch::COMPUTE_AMDGCN: 172 return "compute_amdgcn"; 173 } 174 llvm_unreachable("invalid enum"); 175 } 176 177 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { 178 return llvm::StringSwitch<CudaVirtualArch>(S) 179 .Case("compute_20", CudaVirtualArch::COMPUTE_20) 180 .Case("compute_30", CudaVirtualArch::COMPUTE_30) 181 .Case("compute_32", CudaVirtualArch::COMPUTE_32) 182 .Case("compute_35", CudaVirtualArch::COMPUTE_35) 183 .Case("compute_37", CudaVirtualArch::COMPUTE_37) 184 .Case("compute_50", CudaVirtualArch::COMPUTE_50) 185 .Case("compute_52", CudaVirtualArch::COMPUTE_52) 186 .Case("compute_53", CudaVirtualArch::COMPUTE_53) 187 .Case("compute_60", CudaVirtualArch::COMPUTE_60) 188 .Case("compute_61", CudaVirtualArch::COMPUTE_61) 189 .Case("compute_62", CudaVirtualArch::COMPUTE_62) 190 .Case("compute_70", CudaVirtualArch::COMPUTE_70) 191 .Case("compute_72", CudaVirtualArch::COMPUTE_72) 192 .Case("compute_75", CudaVirtualArch::COMPUTE_75) 193 .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN) 194 .Default(CudaVirtualArch::UNKNOWN); 195 } 196 197 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { 198 switch (A) { 199 case CudaArch::LAST: 200 break; 201 case CudaArch::UNKNOWN: 202 return CudaVirtualArch::UNKNOWN; 203 case CudaArch::SM_20: 204 case CudaArch::SM_21: 205 return CudaVirtualArch::COMPUTE_20; 206 case CudaArch::SM_30: 207 return CudaVirtualArch::COMPUTE_30; 208 case CudaArch::SM_32: 209 return CudaVirtualArch::COMPUTE_32; 210 case CudaArch::SM_35: 211 return CudaVirtualArch::COMPUTE_35; 212 case CudaArch::SM_37: 213 return CudaVirtualArch::COMPUTE_37; 214 case CudaArch::SM_50: 215 return CudaVirtualArch::COMPUTE_50; 216 case CudaArch::SM_52: 217 return CudaVirtualArch::COMPUTE_52; 218 case CudaArch::SM_53: 219 return CudaVirtualArch::COMPUTE_53; 220 case CudaArch::SM_60: 221 return CudaVirtualArch::COMPUTE_60; 222 case CudaArch::SM_61: 223 return CudaVirtualArch::COMPUTE_61; 224 case CudaArch::SM_62: 225 return CudaVirtualArch::COMPUTE_62; 226 case CudaArch::SM_70: 227 return CudaVirtualArch::COMPUTE_70; 228 case CudaArch::SM_72: 229 return CudaVirtualArch::COMPUTE_72; 230 case CudaArch::SM_75: 231 return CudaVirtualArch::COMPUTE_75; 232 case CudaArch::GFX600: 233 case CudaArch::GFX601: 234 case CudaArch::GFX700: 235 case CudaArch::GFX701: 236 case CudaArch::GFX702: 237 case CudaArch::GFX703: 238 case CudaArch::GFX704: 239 case CudaArch::GFX801: 240 case CudaArch::GFX802: 241 case CudaArch::GFX803: 242 case CudaArch::GFX810: 243 case CudaArch::GFX900: 244 case CudaArch::GFX902: 245 case CudaArch::GFX904: 246 case CudaArch::GFX906: 247 case CudaArch::GFX909: 248 return CudaVirtualArch::COMPUTE_AMDGCN; 249 } 250 llvm_unreachable("invalid enum"); 251 } 252 253 CudaVersion MinVersionForCudaArch(CudaArch A) { 254 switch (A) { 255 case CudaArch::LAST: 256 break; 257 case CudaArch::UNKNOWN: 258 return CudaVersion::UNKNOWN; 259 case CudaArch::SM_20: 260 case CudaArch::SM_21: 261 case CudaArch::SM_30: 262 case CudaArch::SM_32: 263 case CudaArch::SM_35: 264 case CudaArch::SM_37: 265 case CudaArch::SM_50: 266 case CudaArch::SM_52: 267 case CudaArch::SM_53: 268 return CudaVersion::CUDA_70; 269 case CudaArch::SM_60: 270 case CudaArch::SM_61: 271 case CudaArch::SM_62: 272 return CudaVersion::CUDA_80; 273 case CudaArch::SM_70: 274 return CudaVersion::CUDA_90; 275 case CudaArch::SM_72: 276 return CudaVersion::CUDA_91; 277 case CudaArch::SM_75: 278 return CudaVersion::CUDA_100; 279 case CudaArch::GFX600: 280 case CudaArch::GFX601: 281 case CudaArch::GFX700: 282 case CudaArch::GFX701: 283 case CudaArch::GFX702: 284 case CudaArch::GFX703: 285 case CudaArch::GFX704: 286 case CudaArch::GFX801: 287 case CudaArch::GFX802: 288 case CudaArch::GFX803: 289 case CudaArch::GFX810: 290 case CudaArch::GFX900: 291 case CudaArch::GFX902: 292 case CudaArch::GFX904: 293 case CudaArch::GFX906: 294 case CudaArch::GFX909: 295 return CudaVersion::CUDA_70; 296 } 297 llvm_unreachable("invalid enum"); 298 } 299 300 CudaVersion MaxVersionForCudaArch(CudaArch A) { 301 switch (A) { 302 case CudaArch::UNKNOWN: 303 return CudaVersion::UNKNOWN; 304 case CudaArch::SM_20: 305 case CudaArch::SM_21: 306 case CudaArch::GFX600: 307 case CudaArch::GFX601: 308 case CudaArch::GFX700: 309 case CudaArch::GFX701: 310 case CudaArch::GFX702: 311 case CudaArch::GFX703: 312 case CudaArch::GFX704: 313 case CudaArch::GFX801: 314 case CudaArch::GFX802: 315 case CudaArch::GFX803: 316 case CudaArch::GFX810: 317 case CudaArch::GFX900: 318 case CudaArch::GFX902: 319 return CudaVersion::CUDA_80; 320 default: 321 return CudaVersion::LATEST; 322 } 323 } 324 325 } // namespace clang 326