1 #include "clang/Basic/OffloadArch.h" 2 3 #include "llvm/ADT/STLExtras.h" 4 #include "llvm/ADT/StringRef.h" 5 6 namespace clang { 7 8 namespace { 9 struct OffloadArchToStringMap { 10 OffloadArch Arch; 11 const char *ArchName; 12 const char *VirtualArchName; 13 }; 14 } // namespace 15 16 #define SM(sm) {OffloadArch::SM_##sm, "sm_" #sm, "compute_" #sm} 17 #define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"} 18 static const OffloadArchToStringMap ArchNames[] = { 19 // clang-format off 20 {OffloadArch::UNUSED, "", ""}, 21 SM(20), {OffloadArch::SM_21, "sm_21", "compute_20"}, // Fermi 22 SM(30), {OffloadArch::SM_32_, "sm_32", "compute_32"}, SM(35), SM(37), // Kepler 23 SM(50), SM(52), SM(53), // Maxwell 24 SM(60), SM(61), SM(62), // Pascal 25 SM(70), SM(72), // Volta 26 SM(75), // Turing 27 SM(80), SM(86), // Ampere 28 SM(87), // Jetson/Drive AGX Orin 29 SM(89), // Ada Lovelace 30 SM(90), // Hopper 31 SM(90a), // Hopper 32 SM(100), // Blackwell 33 SM(100a), // Blackwell 34 SM(101), // Blackwell 35 SM(101a), // Blackwell 36 SM(120), // Blackwell 37 SM(120a), // Blackwell 38 GFX(600), // gfx600 39 GFX(601), // gfx601 40 GFX(602), // gfx602 41 GFX(700), // gfx700 42 GFX(701), // gfx701 43 GFX(702), // gfx702 44 GFX(703), // gfx703 45 GFX(704), // gfx704 46 GFX(705), // gfx705 47 GFX(801), // gfx801 48 GFX(802), // gfx802 49 GFX(803), // gfx803 50 GFX(805), // gfx805 51 GFX(810), // gfx810 52 {OffloadArch::GFX9_GENERIC, "gfx9-generic", "compute_amdgcn"}, 53 GFX(900), // gfx900 54 GFX(902), // gfx902 55 GFX(904), // gfx903 56 GFX(906), // gfx906 57 GFX(908), // gfx908 58 GFX(909), // gfx909 59 GFX(90a), // gfx90a 60 GFX(90c), // gfx90c 61 {OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"}, 62 GFX(942), // gfx942 63 GFX(950), // gfx950 64 {OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"}, 65 GFX(1010), // gfx1010 66 GFX(1011), // gfx1011 67 GFX(1012), // gfx1012 68 GFX(1013), // gfx1013 69 {OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "compute_amdgcn"}, 70 GFX(1030), // gfx1030 71 GFX(1031), // gfx1031 72 GFX(1032), // gfx1032 73 GFX(1033), // gfx1033 74 GFX(1034), // gfx1034 75 GFX(1035), // gfx1035 76 GFX(1036), // gfx1036 77 {OffloadArch::GFX11_GENERIC, "gfx11-generic", "compute_amdgcn"}, 78 GFX(1100), // gfx1100 79 GFX(1101), // gfx1101 80 GFX(1102), // gfx1102 81 GFX(1103), // gfx1103 82 GFX(1150), // gfx1150 83 GFX(1151), // gfx1151 84 GFX(1152), // gfx1152 85 GFX(1153), // gfx1153 86 {OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"}, 87 GFX(1200), // gfx1200 88 GFX(1201), // gfx1201 89 GFX(1250), // gfx1250 90 {OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"}, 91 // Intel CPUs 92 {OffloadArch::GRANITERAPIDS, "graniterapids", ""}, 93 // Intel GPUS 94 {OffloadArch::BMG_G21, "bmg_g21", ""}, 95 {OffloadArch::Generic, "generic", ""}, 96 // clang-format on 97 }; 98 #undef SM 99 #undef GFX 100 101 const char *OffloadArchToString(OffloadArch A) { 102 auto Result = 103 llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) { 104 return A == Map.Arch; 105 }); 106 if (Result == std::end(ArchNames)) 107 return "unknown"; 108 return Result->ArchName; 109 } 110 111 const char *OffloadArchToVirtualArchString(OffloadArch A) { 112 auto Result = 113 llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) { 114 return A == Map.Arch; 115 }); 116 if (Result == std::end(ArchNames)) 117 return "unknown"; 118 return Result->VirtualArchName; 119 } 120 121 OffloadArch StringToOffloadArch(llvm::StringRef S) { 122 auto Result = 123 llvm::find_if(ArchNames, [S](const OffloadArchToStringMap &Map) { 124 return S == Map.ArchName; 125 }); 126 if (Result == std::end(ArchNames)) 127 return OffloadArch::UNKNOWN; 128 return Result->Arch; 129 } 130 131 } // namespace clang 132