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
12namespace llvm {
13class StringRef;
14} // namespace llvm
15
16namespace clang {
17
18enum 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
114static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
115 return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
116}
117
118static inline bool IsAMDOffloadArch(OffloadArch A) {
119 // Generic processor model is for testing only.
120 return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
121}
122
123static inline bool IsIntelCPUOffloadArch(OffloadArch Arch) {
124 return Arch >= OffloadArch::GRANITERAPIDS && Arch < OffloadArch::BMG_G21;
125}
126
127static inline bool IsIntelGPUOffloadArch(OffloadArch Arch) {
128 return Arch >= OffloadArch::BMG_G21 && Arch < OffloadArch::LAST;
129}
130
131static inline bool IsIntelOffloadArch(OffloadArch Arch) {
132 return IsIntelCPUOffloadArch(Arch) || IsIntelGPUOffloadArch(Arch);
133}
134
135const char *OffloadArchToString(OffloadArch A);
136const char *OffloadArchToVirtualArchString(OffloadArch A);
137
138// Convert a string to an OffloadArch enum value. Returns
139// OffloadArch::UNKNOWN if the string is not recognized.
140OffloadArch StringToOffloadArch(llvm::StringRef S);
141
142} // namespace clang
143
144#endif // LLVM_CLANG_BASIC_OFFLOADARCH_H
145

source code of clang/include/clang/Basic/OffloadArch.h