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 LATEST = CUDA_112, 35 LATEST_SUPPORTED = CUDA_101, 36 }; 37 const char *CudaVersionToString(CudaVersion V); 38 // Input is "Major.Minor" 39 CudaVersion CudaStringToVersion(const llvm::Twine &S); 40 41 enum class CudaArch { 42 UNUSED, 43 UNKNOWN, 44 SM_20, 45 SM_21, 46 SM_30, 47 SM_32, 48 SM_35, 49 SM_37, 50 SM_50, 51 SM_52, 52 SM_53, 53 SM_60, 54 SM_61, 55 SM_62, 56 SM_70, 57 SM_72, 58 SM_75, 59 SM_80, 60 SM_86, 61 GFX600, 62 GFX601, 63 GFX602, 64 GFX700, 65 GFX701, 66 GFX702, 67 GFX703, 68 GFX704, 69 GFX705, 70 GFX801, 71 GFX802, 72 GFX803, 73 GFX805, 74 GFX810, 75 GFX900, 76 GFX902, 77 GFX904, 78 GFX906, 79 GFX908, 80 GFX909, 81 GFX90a, 82 GFX90c, 83 GFX1010, 84 GFX1011, 85 GFX1012, 86 GFX1013, 87 GFX1030, 88 GFX1031, 89 GFX1032, 90 GFX1033, 91 GFX1034, 92 GFX1035, 93 LAST, 94 }; 95 96 static inline bool IsNVIDIAGpuArch(CudaArch A) { 97 return A >= CudaArch::SM_20 && A < CudaArch::GFX600; 98 } 99 100 static inline bool IsAMDGpuArch(CudaArch A) { 101 return A >= CudaArch::GFX600 && A < CudaArch::LAST; 102 } 103 104 const char *CudaArchToString(CudaArch A); 105 const char *CudaArchToVirtualArchString(CudaArch A); 106 107 // The input should have the form "sm_20". 108 CudaArch StringToCudaArch(llvm::StringRef S); 109 110 /// Get the earliest CudaVersion that supports the given CudaArch. 111 CudaVersion MinVersionForCudaArch(CudaArch A); 112 113 /// Get the latest CudaVersion that supports the given CudaArch. 114 CudaVersion MaxVersionForCudaArch(CudaArch A); 115 116 // Various SDK-dependent features that affect CUDA compilation 117 enum class CudaFeature { 118 // CUDA-9.2+ uses a new API for launching kernels. 119 CUDA_USES_NEW_LAUNCH, 120 // CUDA-10.1+ needs explicit end of GPU binary registration. 121 CUDA_USES_FATBIN_REGISTER_END, 122 }; 123 124 CudaVersion ToCudaVersion(llvm::VersionTuple); 125 bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature); 126 bool CudaFeatureEnabled(CudaVersion, CudaFeature); 127 128 } // namespace clang 129 130 #endif 131