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 GFX1250,
102 AMDGCNSPIRV,
103 Generic, // A processor model named 'generic' if the target backend defines a
104 // public one.
105 // Intel CPUs
106 GRANITERAPIDS,
107 // Intel GPUs
108 BMG_G21,
109 LAST,
110
111 CudaDefault = OffloadArch::SM_52,
112 HIPDefault = OffloadArch::GFX906,
113 };
114
IsNVIDIAOffloadArch(OffloadArch A)115 static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
116 return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
117 }
118
IsAMDOffloadArch(OffloadArch A)119 static inline bool IsAMDOffloadArch(OffloadArch A) {
120 // Generic processor model is for testing only.
121 return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
122 }
123
IsIntelCPUOffloadArch(OffloadArch Arch)124 static inline bool IsIntelCPUOffloadArch(OffloadArch Arch) {
125 return Arch >= OffloadArch::GRANITERAPIDS && Arch < OffloadArch::BMG_G21;
126 }
127
IsIntelGPUOffloadArch(OffloadArch Arch)128 static inline bool IsIntelGPUOffloadArch(OffloadArch Arch) {
129 return Arch >= OffloadArch::BMG_G21 && Arch < OffloadArch::LAST;
130 }
131
IsIntelOffloadArch(OffloadArch Arch)132 static inline bool IsIntelOffloadArch(OffloadArch Arch) {
133 return IsIntelCPUOffloadArch(Arch) || IsIntelGPUOffloadArch(Arch);
134 }
135
136 const char *OffloadArchToString(OffloadArch A);
137 const char *OffloadArchToVirtualArchString(OffloadArch A);
138
139 // Convert a string to an OffloadArch enum value. Returns
140 // OffloadArch::UNKNOWN if the string is not recognized.
141 OffloadArch StringToOffloadArch(llvm::StringRef S);
142
143 } // namespace clang
144
145 #endif // LLVM_CLANG_BASIC_OFFLOADARCH_H
146