xref: /llvm-project/clang/include/clang/Basic/Cuda.h (revision 97c3a990f05606cb807faf53bc41302fb62c7980)
1 //===--- Cuda.h - Utilities for compiling CUDA code  ------------*- 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_CUDA_H
10 #define LLVM_CLANG_BASIC_CUDA_H
11 
12 namespace llvm {
13 class StringRef;
14 class Twine;
15 class VersionTuple;
16 } // namespace llvm
17 
18 namespace clang {
19 
20 enum class CudaVersion {
21   UNKNOWN,
22   CUDA_70,
23   CUDA_75,
24   CUDA_80,
25   CUDA_90,
26   CUDA_91,
27   CUDA_92,
28   CUDA_100,
29   CUDA_101,
30   CUDA_102,
31   CUDA_110,
32   CUDA_111,
33   CUDA_112,
34   CUDA_113,
35   CUDA_114,
36   CUDA_115,
37   CUDA_116,
38   CUDA_117,
39   CUDA_118,
40   CUDA_120,
41   CUDA_121,
42   CUDA_122,
43   CUDA_123,
44   CUDA_124,
45   CUDA_125,
46   CUDA_126,
47   CUDA_128,
48   FULLY_SUPPORTED = CUDA_123,
49   PARTIALLY_SUPPORTED =
50       CUDA_128, // Partially supported. Proceed with a warning.
51   NEW = 10000,  // Too new. Issue a warning, but allow using it.
52 };
53 const char *CudaVersionToString(CudaVersion V);
54 // Input is "Major.Minor"
55 CudaVersion CudaStringToVersion(const llvm::Twine &S);
56 
57 enum class OffloadArch {
58   UNUSED,
59   UNKNOWN,
60   // TODO: Deprecate and remove GPU architectures older than sm_52.
61   SM_20,
62   SM_21,
63   SM_30,
64   // This has a name conflict with sys/mac.h on AIX, rename it as a workaround.
65   SM_32_,
66   SM_35,
67   SM_37,
68   SM_50,
69   SM_52,
70   SM_53,
71   SM_60,
72   SM_61,
73   SM_62,
74   SM_70,
75   SM_72,
76   SM_75,
77   SM_80,
78   SM_86,
79   SM_87,
80   SM_89,
81   SM_90,
82   SM_90a,
83   SM_100,
84   SM_100a,
85   GFX600,
86   GFX601,
87   GFX602,
88   GFX700,
89   GFX701,
90   GFX702,
91   GFX703,
92   GFX704,
93   GFX705,
94   GFX801,
95   GFX802,
96   GFX803,
97   GFX805,
98   GFX810,
99   GFX9_GENERIC,
100   GFX900,
101   GFX902,
102   GFX904,
103   GFX906,
104   GFX908,
105   GFX909,
106   GFX90a,
107   GFX90c,
108   GFX9_4_GENERIC,
109   GFX940,
110   GFX941,
111   GFX942,
112   GFX950,
113   GFX10_1_GENERIC,
114   GFX1010,
115   GFX1011,
116   GFX1012,
117   GFX1013,
118   GFX10_3_GENERIC,
119   GFX1030,
120   GFX1031,
121   GFX1032,
122   GFX1033,
123   GFX1034,
124   GFX1035,
125   GFX1036,
126   GFX11_GENERIC,
127   GFX1100,
128   GFX1101,
129   GFX1102,
130   GFX1103,
131   GFX1150,
132   GFX1151,
133   GFX1152,
134   GFX1153,
135   GFX12_GENERIC,
136   GFX1200,
137   GFX1201,
138   AMDGCNSPIRV,
139   Generic, // A processor model named 'generic' if the target backend defines a
140            // public one.
141   LAST,
142 
143   CudaDefault = OffloadArch::SM_52,
144   HIPDefault = OffloadArch::GFX906,
145 };
146 
147 enum class CUDAFunctionTarget {
148   Device,
149   Global,
150   Host,
151   HostDevice,
152   InvalidTarget
153 };
154 
155 static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
156   return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
157 }
158 
159 static inline bool IsAMDOffloadArch(OffloadArch A) {
160   // Generic processor model is for testing only.
161   return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
162 }
163 
164 const char *OffloadArchToString(OffloadArch A);
165 const char *OffloadArchToVirtualArchString(OffloadArch A);
166 
167 // The input should have the form "sm_20".
168 OffloadArch StringToOffloadArch(llvm::StringRef S);
169 
170 /// Get the earliest CudaVersion that supports the given OffloadArch.
171 CudaVersion MinVersionForOffloadArch(OffloadArch A);
172 
173 /// Get the latest CudaVersion that supports the given OffloadArch.
174 CudaVersion MaxVersionForOffloadArch(OffloadArch A);
175 
176 //  Various SDK-dependent features that affect CUDA compilation
177 enum class CudaFeature {
178   // CUDA-9.2+ uses a new API for launching kernels.
179   CUDA_USES_NEW_LAUNCH,
180   // CUDA-10.1+ needs explicit end of GPU binary registration.
181   CUDA_USES_FATBIN_REGISTER_END,
182 };
183 
184 CudaVersion ToCudaVersion(llvm::VersionTuple);
185 bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
186 bool CudaFeatureEnabled(CudaVersion, CudaFeature);
187 
188 } // namespace clang
189 
190 #endif
191