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