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