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