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