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