xref: /freebsd/contrib/llvm-project/clang/include/clang/Basic/OffloadArch.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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