137 lines · cpp
1#include "clang/Basic/OffloadArch.h"2 3#include "llvm/ADT/STLExtras.h"4#include "llvm/ADT/StringRef.h"5 6namespace clang {7 8namespace {9struct OffloadArchToStringMap {10 OffloadArch Arch;11 const char *ArchName;12 const char *VirtualArchName;13};14} // namespace15 16#define SM(sm) {OffloadArch::SM_##sm, "sm_" #sm, "compute_" #sm}17#define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"}18static const OffloadArchToStringMap ArchNames[] = {19 // clang-format off20 {OffloadArch::UNUSED, "", ""},21 SM(20), {OffloadArch::SM_21, "sm_21", "compute_20"}, // Fermi22 SM(30), {OffloadArch::SM_32_, "sm_32", "compute_32"}, SM(35), SM(37), // Kepler23 SM(50), SM(52), SM(53), // Maxwell24 SM(60), SM(61), SM(62), // Pascal25 SM(70), SM(72), // Volta26 SM(75), // Turing27 SM(80), SM(86), // Ampere28 SM(87), // Jetson/Drive AGX Orin29 SM(89), // Ada Lovelace30 SM(90), // Hopper31 SM(90a), // Hopper32 SM(100), // Blackwell33 SM(100a), // Blackwell34 SM(101), // Blackwell35 SM(101a), // Blackwell36 SM(103), // Blackwell37 SM(103a), // Blackwell38 SM(120), // Blackwell39 SM(120a), // Blackwell40 SM(121), // Blackwell41 SM(121a), // Blackwell42 GFX(600), // gfx60043 GFX(601), // gfx60144 GFX(602), // gfx60245 GFX(700), // gfx70046 GFX(701), // gfx70147 GFX(702), // gfx70248 GFX(703), // gfx70349 GFX(704), // gfx70450 GFX(705), // gfx70551 GFX(801), // gfx80152 GFX(802), // gfx80253 GFX(803), // gfx80354 GFX(805), // gfx80555 GFX(810), // gfx81056 {OffloadArch::GFX9_GENERIC, "gfx9-generic", "compute_amdgcn"},57 GFX(900), // gfx90058 GFX(902), // gfx90259 GFX(904), // gfx90360 GFX(906), // gfx90661 GFX(908), // gfx90862 GFX(909), // gfx90963 GFX(90a), // gfx90a64 GFX(90c), // gfx90c65 {OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"},66 GFX(942), // gfx94267 GFX(950), // gfx95068 {OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"},69 GFX(1010), // gfx101070 GFX(1011), // gfx101171 GFX(1012), // gfx101272 GFX(1013), // gfx101373 {OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "compute_amdgcn"},74 GFX(1030), // gfx103075 GFX(1031), // gfx103176 GFX(1032), // gfx103277 GFX(1033), // gfx103378 GFX(1034), // gfx103479 GFX(1035), // gfx103580 GFX(1036), // gfx103681 {OffloadArch::GFX11_GENERIC, "gfx11-generic", "compute_amdgcn"},82 GFX(1100), // gfx110083 GFX(1101), // gfx110184 GFX(1102), // gfx110285 GFX(1103), // gfx110386 GFX(1150), // gfx115087 GFX(1151), // gfx115188 GFX(1152), // gfx115289 GFX(1153), // gfx115390 {OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"},91 GFX(1200), // gfx120092 GFX(1201), // gfx120193 GFX(1250), // gfx125094 GFX(1251), // gfx125195 {OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},96 // Intel CPUs97 {OffloadArch::GRANITERAPIDS, "graniterapids", ""},98 // Intel GPUS99 {OffloadArch::BMG_G21, "bmg_g21", ""},100 {OffloadArch::Generic, "generic", ""},101 // clang-format on102};103#undef SM104#undef GFX105 106const char *OffloadArchToString(OffloadArch A) {107 auto Result =108 llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {109 return A == Map.Arch;110 });111 if (Result == std::end(ArchNames))112 return "unknown";113 return Result->ArchName;114}115 116const char *OffloadArchToVirtualArchString(OffloadArch A) {117 auto Result =118 llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {119 return A == Map.Arch;120 });121 if (Result == std::end(ArchNames))122 return "unknown";123 return Result->VirtualArchName;124}125 126OffloadArch StringToOffloadArch(llvm::StringRef S) {127 auto Result =128 llvm::find_if(ArchNames, [S](const OffloadArchToStringMap &Map) {129 return S == Map.ArchName;130 });131 if (Result == std::end(ArchNames))132 return OffloadArch::UNKNOWN;133 return Result->Arch;134}135 136} // namespace clang137