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 FULLY_SUPPORTED = CUDA_123,
45 PARTIALLY_SUPPORTED =
46 CUDA_123, // Partially supported. Proceed with a warning.
47 NEW = 10000, // Too new. Issue a warning, but allow using it.
48 };
49 const char *CudaVersionToString(CudaVersion V);
50 // Input is "Major.Minor"
51 CudaVersion CudaStringToVersion(const llvm::Twine &S);
52
53 enum class CudaArch {
54 UNUSED,
55 UNKNOWN,
56 SM_20,
57 SM_21,
58 SM_30,
59 SM_32,
60 SM_35,
61 SM_37,
62 SM_50,
63 SM_52,
64 SM_53,
65 SM_60,
66 SM_61,
67 SM_62,
68 SM_70,
69 SM_72,
70 SM_75,
71 SM_80,
72 SM_86,
73 SM_87,
74 SM_89,
75 SM_90,
76 SM_90a,
77 GFX600,
78 GFX601,
79 GFX602,
80 GFX700,
81 GFX701,
82 GFX702,
83 GFX703,
84 GFX704,
85 GFX705,
86 GFX801,
87 GFX802,
88 GFX803,
89 GFX805,
90 GFX810,
91 GFX900,
92 GFX902,
93 GFX904,
94 GFX906,
95 GFX908,
96 GFX909,
97 GFX90a,
98 GFX90c,
99 GFX940,
100 GFX941,
101 GFX942,
102 GFX1010,
103 GFX1011,
104 GFX1012,
105 GFX1013,
106 GFX1030,
107 GFX1031,
108 GFX1032,
109 GFX1033,
110 GFX1034,
111 GFX1035,
112 GFX1036,
113 GFX1100,
114 GFX1101,
115 GFX1102,
116 GFX1103,
117 GFX1150,
118 GFX1151,
119 GFX1200,
120 GFX1201,
121 Generic, // A processor model named 'generic' if the target backend defines a
122 // public one.
123 LAST,
124
125 CudaDefault = CudaArch::SM_52,
126 HIPDefault = CudaArch::GFX803,
127 };
128
IsNVIDIAGpuArch(CudaArch A)129 static inline bool IsNVIDIAGpuArch(CudaArch A) {
130 return A >= CudaArch::SM_20 && A < CudaArch::GFX600;
131 }
132
IsAMDGpuArch(CudaArch A)133 static inline bool IsAMDGpuArch(CudaArch A) {
134 // Generic processor model is for testing only.
135 return A >= CudaArch::GFX600 && A < CudaArch::Generic;
136 }
137
138 const char *CudaArchToString(CudaArch A);
139 const char *CudaArchToVirtualArchString(CudaArch A);
140
141 // The input should have the form "sm_20".
142 CudaArch StringToCudaArch(llvm::StringRef S);
143
144 /// Get the earliest CudaVersion that supports the given CudaArch.
145 CudaVersion MinVersionForCudaArch(CudaArch A);
146
147 /// Get the latest CudaVersion that supports the given CudaArch.
148 CudaVersion MaxVersionForCudaArch(CudaArch A);
149
150 // Various SDK-dependent features that affect CUDA compilation
151 enum class CudaFeature {
152 // CUDA-9.2+ uses a new API for launching kernels.
153 CUDA_USES_NEW_LAUNCH,
154 // CUDA-10.1+ needs explicit end of GPU binary registration.
155 CUDA_USES_FATBIN_REGISTER_END,
156 };
157
158 CudaVersion ToCudaVersion(llvm::VersionTuple);
159 bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
160 bool CudaFeatureEnabled(CudaVersion, CudaFeature);
161
162 } // namespace clang
163
164 #endif
165