| 1 | //===--- OffloadArch.h - Definition of offloading architectures --- C++ -*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #ifndef LLVM_CLANG_BASIC_OFFLOADARCH_H |
| 10 | #define LLVM_CLANG_BASIC_OFFLOADARCH_H |
| 11 | |
| 12 | namespace llvm { |
| 13 | class StringRef; |
| 14 | } // namespace llvm |
| 15 | |
| 16 | namespace clang { |
| 17 | |
| 18 | enum class OffloadArch { |
| 19 | UNUSED, |
| 20 | UNKNOWN, |
| 21 | // TODO: Deprecate and remove GPU architectures older than sm_52. |
| 22 | SM_20, |
| 23 | SM_21, |
| 24 | SM_30, |
| 25 | // This has a name conflict with sys/mac.h on AIX, rename it as a workaround. |
| 26 | SM_32_, |
| 27 | SM_35, |
| 28 | SM_37, |
| 29 | SM_50, |
| 30 | SM_52, |
| 31 | SM_53, |
| 32 | SM_60, |
| 33 | SM_61, |
| 34 | SM_62, |
| 35 | SM_70, |
| 36 | SM_72, |
| 37 | SM_75, |
| 38 | SM_80, |
| 39 | SM_86, |
| 40 | SM_87, |
| 41 | SM_89, |
| 42 | SM_90, |
| 43 | SM_90a, |
| 44 | SM_100, |
| 45 | SM_100a, |
| 46 | SM_101, |
| 47 | SM_101a, |
| 48 | SM_120, |
| 49 | SM_120a, |
| 50 | GFX600, |
| 51 | GFX601, |
| 52 | GFX602, |
| 53 | GFX700, |
| 54 | GFX701, |
| 55 | GFX702, |
| 56 | GFX703, |
| 57 | GFX704, |
| 58 | GFX705, |
| 59 | GFX801, |
| 60 | GFX802, |
| 61 | GFX803, |
| 62 | GFX805, |
| 63 | GFX810, |
| 64 | GFX9_GENERIC, |
| 65 | GFX900, |
| 66 | GFX902, |
| 67 | GFX904, |
| 68 | GFX906, |
| 69 | GFX908, |
| 70 | GFX909, |
| 71 | GFX90a, |
| 72 | GFX90c, |
| 73 | GFX9_4_GENERIC, |
| 74 | GFX942, |
| 75 | GFX950, |
| 76 | GFX10_1_GENERIC, |
| 77 | GFX1010, |
| 78 | GFX1011, |
| 79 | GFX1012, |
| 80 | GFX1013, |
| 81 | GFX10_3_GENERIC, |
| 82 | GFX1030, |
| 83 | GFX1031, |
| 84 | GFX1032, |
| 85 | GFX1033, |
| 86 | GFX1034, |
| 87 | GFX1035, |
| 88 | GFX1036, |
| 89 | GFX11_GENERIC, |
| 90 | GFX1100, |
| 91 | GFX1101, |
| 92 | GFX1102, |
| 93 | GFX1103, |
| 94 | GFX1150, |
| 95 | GFX1151, |
| 96 | GFX1152, |
| 97 | GFX1153, |
| 98 | GFX12_GENERIC, |
| 99 | GFX1200, |
| 100 | GFX1201, |
| 101 | AMDGCNSPIRV, |
| 102 | Generic, // A processor model named 'generic' if the target backend defines a |
| 103 | // public one. |
| 104 | // Intel CPUs |
| 105 | GRANITERAPIDS, |
| 106 | // Intel GPUs |
| 107 | BMG_G21, |
| 108 | LAST, |
| 109 | |
| 110 | CudaDefault = OffloadArch::SM_52, |
| 111 | HIPDefault = OffloadArch::GFX906, |
| 112 | }; |
| 113 | |
| 114 | static inline bool IsNVIDIAOffloadArch(OffloadArch A) { |
| 115 | return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600; |
| 116 | } |
| 117 | |
| 118 | static inline bool IsAMDOffloadArch(OffloadArch A) { |
| 119 | // Generic processor model is for testing only. |
| 120 | return A >= OffloadArch::GFX600 && A < OffloadArch::Generic; |
| 121 | } |
| 122 | |
| 123 | static inline bool IsIntelCPUOffloadArch(OffloadArch Arch) { |
| 124 | return Arch >= OffloadArch::GRANITERAPIDS && Arch < OffloadArch::BMG_G21; |
| 125 | } |
| 126 | |
| 127 | static inline bool IsIntelGPUOffloadArch(OffloadArch Arch) { |
| 128 | return Arch >= OffloadArch::BMG_G21 && Arch < OffloadArch::LAST; |
| 129 | } |
| 130 | |
| 131 | static inline bool IsIntelOffloadArch(OffloadArch Arch) { |
| 132 | return IsIntelCPUOffloadArch(Arch) || IsIntelGPUOffloadArch(Arch); |
| 133 | } |
| 134 | |
| 135 | const char *OffloadArchToString(OffloadArch A); |
| 136 | const char *OffloadArchToVirtualArchString(OffloadArch A); |
| 137 | |
| 138 | // Convert a string to an OffloadArch enum value. Returns |
| 139 | // OffloadArch::UNKNOWN if the string is not recognized. |
| 140 | OffloadArch StringToOffloadArch(llvm::StringRef S); |
| 141 | |
| 142 | } // namespace clang |
| 143 | |
| 144 | #endif // LLVM_CLANG_BASIC_OFFLOADARCH_H |
| 145 | |