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