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