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   LATEST = CUDA_101,
31 };
32 const char *CudaVersionToString(CudaVersion V);
33 // Input is "Major.Minor"
34 CudaVersion CudaStringToVersion(const llvm::Twine &S);
35 
36 enum class CudaArch {
37   UNKNOWN,
38   SM_20,
39   SM_21,
40   SM_30,
41   SM_32,
42   SM_35,
43   SM_37,
44   SM_50,
45   SM_52,
46   SM_53,
47   SM_60,
48   SM_61,
49   SM_62,
50   SM_70,
51   SM_72,
52   SM_75,
53   GFX600,
54   GFX601,
55   GFX700,
56   GFX701,
57   GFX702,
58   GFX703,
59   GFX704,
60   GFX801,
61   GFX802,
62   GFX803,
63   GFX810,
64   GFX900,
65   GFX902,
66   GFX904,
67   GFX906,
68   GFX908,
69   GFX909,
70   GFX1010,
71   GFX1011,
72   GFX1012,
73   LAST,
74 };
75 const char *CudaArchToString(CudaArch A);
76 
77 // The input should have the form "sm_20".
78 CudaArch StringToCudaArch(llvm::StringRef S);
79 
80 enum class CudaVirtualArch {
81   UNKNOWN,
82   COMPUTE_20,
83   COMPUTE_30,
84   COMPUTE_32,
85   COMPUTE_35,
86   COMPUTE_37,
87   COMPUTE_50,
88   COMPUTE_52,
89   COMPUTE_53,
90   COMPUTE_60,
91   COMPUTE_61,
92   COMPUTE_62,
93   COMPUTE_70,
94   COMPUTE_72,
95   COMPUTE_75,
96   COMPUTE_AMDGCN,
97 };
98 const char *CudaVirtualArchToString(CudaVirtualArch A);
99 
100 // The input should have the form "compute_20".
101 CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S);
102 
103 /// Get the compute_xx corresponding to an sm_yy.
104 CudaVirtualArch VirtualArchForCudaArch(CudaArch A);
105 
106 /// Get the earliest CudaVersion that supports the given CudaArch.
107 CudaVersion MinVersionForCudaArch(CudaArch A);
108 
109 /// Get the latest CudaVersion that supports the given CudaArch.
110 CudaVersion MaxVersionForCudaArch(CudaArch A);
111 
112 //  Various SDK-dependent features that affect CUDA compilation
113 enum class CudaFeature {
114   // CUDA-9.2+ uses a new API for launching kernels.
115   CUDA_USES_NEW_LAUNCH,
116   // CUDA-10.1+ needs explicit end of GPU binary registration.
117   CUDA_USES_FATBIN_REGISTER_END,
118 };
119 
120 bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
121 bool CudaFeatureEnabled(CudaVersion, CudaFeature);
122 
123 } // namespace clang
124 
125 #endif
126