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 } 98 llvm_unreachable("invalid enum"); 99 } 100 101 CudaArch StringToCudaArch(llvm::StringRef S) { 102 return llvm::StringSwitch<CudaArch>(S) 103 .Case("sm_20", CudaArch::SM_20) 104 .Case("sm_21", CudaArch::SM_21) 105 .Case("sm_30", CudaArch::SM_30) 106 .Case("sm_32", CudaArch::SM_32) 107 .Case("sm_35", CudaArch::SM_35) 108 .Case("sm_37", CudaArch::SM_37) 109 .Case("sm_50", CudaArch::SM_50) 110 .Case("sm_52", CudaArch::SM_52) 111 .Case("sm_53", CudaArch::SM_53) 112 .Case("sm_60", CudaArch::SM_60) 113 .Case("sm_61", CudaArch::SM_61) 114 .Case("sm_62", CudaArch::SM_62) 115 .Case("sm_70", CudaArch::SM_70) 116 .Case("sm_72", CudaArch::SM_72) 117 .Case("sm_75", CudaArch::SM_75) 118 .Case("gfx600", CudaArch::GFX600) 119 .Case("gfx601", CudaArch::GFX601) 120 .Case("gfx700", CudaArch::GFX700) 121 .Case("gfx701", CudaArch::GFX701) 122 .Case("gfx702", CudaArch::GFX702) 123 .Case("gfx703", CudaArch::GFX703) 124 .Case("gfx704", CudaArch::GFX704) 125 .Case("gfx801", CudaArch::GFX801) 126 .Case("gfx802", CudaArch::GFX802) 127 .Case("gfx803", CudaArch::GFX803) 128 .Case("gfx810", CudaArch::GFX810) 129 .Case("gfx900", CudaArch::GFX900) 130 .Case("gfx902", CudaArch::GFX902) 131 .Case("gfx904", CudaArch::GFX904) 132 .Case("gfx906", CudaArch::GFX906) 133 .Default(CudaArch::UNKNOWN); 134 } 135 136 const char *CudaVirtualArchToString(CudaVirtualArch A) { 137 switch (A) { 138 case CudaVirtualArch::UNKNOWN: 139 return "unknown"; 140 case CudaVirtualArch::COMPUTE_20: 141 return "compute_20"; 142 case CudaVirtualArch::COMPUTE_30: 143 return "compute_30"; 144 case CudaVirtualArch::COMPUTE_32: 145 return "compute_32"; 146 case CudaVirtualArch::COMPUTE_35: 147 return "compute_35"; 148 case CudaVirtualArch::COMPUTE_37: 149 return "compute_37"; 150 case CudaVirtualArch::COMPUTE_50: 151 return "compute_50"; 152 case CudaVirtualArch::COMPUTE_52: 153 return "compute_52"; 154 case CudaVirtualArch::COMPUTE_53: 155 return "compute_53"; 156 case CudaVirtualArch::COMPUTE_60: 157 return "compute_60"; 158 case CudaVirtualArch::COMPUTE_61: 159 return "compute_61"; 160 case CudaVirtualArch::COMPUTE_62: 161 return "compute_62"; 162 case CudaVirtualArch::COMPUTE_70: 163 return "compute_70"; 164 case CudaVirtualArch::COMPUTE_72: 165 return "compute_72"; 166 case CudaVirtualArch::COMPUTE_75: 167 return "compute_75"; 168 case CudaVirtualArch::COMPUTE_AMDGCN: 169 return "compute_amdgcn"; 170 } 171 llvm_unreachable("invalid enum"); 172 } 173 174 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S) { 175 return llvm::StringSwitch<CudaVirtualArch>(S) 176 .Case("compute_20", CudaVirtualArch::COMPUTE_20) 177 .Case("compute_30", CudaVirtualArch::COMPUTE_30) 178 .Case("compute_32", CudaVirtualArch::COMPUTE_32) 179 .Case("compute_35", CudaVirtualArch::COMPUTE_35) 180 .Case("compute_37", CudaVirtualArch::COMPUTE_37) 181 .Case("compute_50", CudaVirtualArch::COMPUTE_50) 182 .Case("compute_52", CudaVirtualArch::COMPUTE_52) 183 .Case("compute_53", CudaVirtualArch::COMPUTE_53) 184 .Case("compute_60", CudaVirtualArch::COMPUTE_60) 185 .Case("compute_61", CudaVirtualArch::COMPUTE_61) 186 .Case("compute_62", CudaVirtualArch::COMPUTE_62) 187 .Case("compute_70", CudaVirtualArch::COMPUTE_70) 188 .Case("compute_72", CudaVirtualArch::COMPUTE_72) 189 .Case("compute_75", CudaVirtualArch::COMPUTE_75) 190 .Case("compute_amdgcn", CudaVirtualArch::COMPUTE_AMDGCN) 191 .Default(CudaVirtualArch::UNKNOWN); 192 } 193 194 CudaVirtualArch VirtualArchForCudaArch(CudaArch A) { 195 switch (A) { 196 case CudaArch::LAST: 197 break; 198 case CudaArch::UNKNOWN: 199 return CudaVirtualArch::UNKNOWN; 200 case CudaArch::SM_20: 201 case CudaArch::SM_21: 202 return CudaVirtualArch::COMPUTE_20; 203 case CudaArch::SM_30: 204 return CudaVirtualArch::COMPUTE_30; 205 case CudaArch::SM_32: 206 return CudaVirtualArch::COMPUTE_32; 207 case CudaArch::SM_35: 208 return CudaVirtualArch::COMPUTE_35; 209 case CudaArch::SM_37: 210 return CudaVirtualArch::COMPUTE_37; 211 case CudaArch::SM_50: 212 return CudaVirtualArch::COMPUTE_50; 213 case CudaArch::SM_52: 214 return CudaVirtualArch::COMPUTE_52; 215 case CudaArch::SM_53: 216 return CudaVirtualArch::COMPUTE_53; 217 case CudaArch::SM_60: 218 return CudaVirtualArch::COMPUTE_60; 219 case CudaArch::SM_61: 220 return CudaVirtualArch::COMPUTE_61; 221 case CudaArch::SM_62: 222 return CudaVirtualArch::COMPUTE_62; 223 case CudaArch::SM_70: 224 return CudaVirtualArch::COMPUTE_70; 225 case CudaArch::SM_72: 226 return CudaVirtualArch::COMPUTE_72; 227 case CudaArch::SM_75: 228 return CudaVirtualArch::COMPUTE_75; 229 case CudaArch::GFX600: 230 case CudaArch::GFX601: 231 case CudaArch::GFX700: 232 case CudaArch::GFX701: 233 case CudaArch::GFX702: 234 case CudaArch::GFX703: 235 case CudaArch::GFX704: 236 case CudaArch::GFX801: 237 case CudaArch::GFX802: 238 case CudaArch::GFX803: 239 case CudaArch::GFX810: 240 case CudaArch::GFX900: 241 case CudaArch::GFX902: 242 case CudaArch::GFX904: 243 case CudaArch::GFX906: 244 return CudaVirtualArch::COMPUTE_AMDGCN; 245 } 246 llvm_unreachable("invalid enum"); 247 } 248 249 CudaVersion MinVersionForCudaArch(CudaArch A) { 250 switch (A) { 251 case CudaArch::LAST: 252 break; 253 case CudaArch::UNKNOWN: 254 return CudaVersion::UNKNOWN; 255 case CudaArch::SM_20: 256 case CudaArch::SM_21: 257 case CudaArch::SM_30: 258 case CudaArch::SM_32: 259 case CudaArch::SM_35: 260 case CudaArch::SM_37: 261 case CudaArch::SM_50: 262 case CudaArch::SM_52: 263 case CudaArch::SM_53: 264 return CudaVersion::CUDA_70; 265 case CudaArch::SM_60: 266 case CudaArch::SM_61: 267 case CudaArch::SM_62: 268 return CudaVersion::CUDA_80; 269 case CudaArch::SM_70: 270 return CudaVersion::CUDA_90; 271 case CudaArch::SM_72: 272 return CudaVersion::CUDA_91; 273 case CudaArch::SM_75: 274 return CudaVersion::CUDA_100; 275 case CudaArch::GFX600: 276 case CudaArch::GFX601: 277 case CudaArch::GFX700: 278 case CudaArch::GFX701: 279 case CudaArch::GFX702: 280 case CudaArch::GFX703: 281 case CudaArch::GFX704: 282 case CudaArch::GFX801: 283 case CudaArch::GFX802: 284 case CudaArch::GFX803: 285 case CudaArch::GFX810: 286 case CudaArch::GFX900: 287 case CudaArch::GFX902: 288 case CudaArch::GFX904: 289 case CudaArch::GFX906: 290 return CudaVersion::CUDA_70; 291 } 292 llvm_unreachable("invalid enum"); 293 } 294 295 CudaVersion MaxVersionForCudaArch(CudaArch A) { 296 switch (A) { 297 case CudaArch::UNKNOWN: 298 return CudaVersion::UNKNOWN; 299 case CudaArch::SM_20: 300 case CudaArch::SM_21: 301 case CudaArch::GFX600: 302 case CudaArch::GFX601: 303 case CudaArch::GFX700: 304 case CudaArch::GFX701: 305 case CudaArch::GFX702: 306 case CudaArch::GFX703: 307 case CudaArch::GFX704: 308 case CudaArch::GFX801: 309 case CudaArch::GFX802: 310 case CudaArch::GFX803: 311 case CudaArch::GFX810: 312 case CudaArch::GFX900: 313 case CudaArch::GFX902: 314 return CudaVersion::CUDA_80; 315 default: 316 return CudaVersion::LATEST; 317 } 318 } 319 320 } // namespace clang 321