Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:48

0001 //===--- Cuda.h - Utilities for compiling CUDA code  ------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef LLVM_CLANG_BASIC_CUDA_H
0010 #define LLVM_CLANG_BASIC_CUDA_H
0011 
0012 namespace llvm {
0013 class StringRef;
0014 class Twine;
0015 class VersionTuple;
0016 } // namespace llvm
0017 
0018 namespace clang {
0019 
0020 enum class CudaVersion {
0021   UNKNOWN,
0022   CUDA_70,
0023   CUDA_75,
0024   CUDA_80,
0025   CUDA_90,
0026   CUDA_91,
0027   CUDA_92,
0028   CUDA_100,
0029   CUDA_101,
0030   CUDA_102,
0031   CUDA_110,
0032   CUDA_111,
0033   CUDA_112,
0034   CUDA_113,
0035   CUDA_114,
0036   CUDA_115,
0037   CUDA_116,
0038   CUDA_117,
0039   CUDA_118,
0040   CUDA_120,
0041   CUDA_121,
0042   CUDA_122,
0043   CUDA_123,
0044   CUDA_124,
0045   CUDA_125,
0046   CUDA_126,
0047   CUDA_128,
0048   FULLY_SUPPORTED = CUDA_123,
0049   PARTIALLY_SUPPORTED =
0050       CUDA_128, // Partially supported. Proceed with a warning.
0051   NEW = 10000,  // Too new. Issue a warning, but allow using it.
0052 };
0053 const char *CudaVersionToString(CudaVersion V);
0054 // Input is "Major.Minor"
0055 CudaVersion CudaStringToVersion(const llvm::Twine &S);
0056 
0057 enum class OffloadArch {
0058   UNUSED,
0059   UNKNOWN,
0060   // TODO: Deprecate and remove GPU architectures older than sm_52.
0061   SM_20,
0062   SM_21,
0063   SM_30,
0064   // This has a name conflict with sys/mac.h on AIX, rename it as a workaround.
0065   SM_32_,
0066   SM_35,
0067   SM_37,
0068   SM_50,
0069   SM_52,
0070   SM_53,
0071   SM_60,
0072   SM_61,
0073   SM_62,
0074   SM_70,
0075   SM_72,
0076   SM_75,
0077   SM_80,
0078   SM_86,
0079   SM_87,
0080   SM_89,
0081   SM_90,
0082   SM_90a,
0083   SM_100,
0084   SM_100a,
0085   SM_101,
0086   SM_101a,
0087   SM_120,
0088   SM_120a,
0089   GFX600,
0090   GFX601,
0091   GFX602,
0092   GFX700,
0093   GFX701,
0094   GFX702,
0095   GFX703,
0096   GFX704,
0097   GFX705,
0098   GFX801,
0099   GFX802,
0100   GFX803,
0101   GFX805,
0102   GFX810,
0103   GFX9_GENERIC,
0104   GFX900,
0105   GFX902,
0106   GFX904,
0107   GFX906,
0108   GFX908,
0109   GFX909,
0110   GFX90a,
0111   GFX90c,
0112   GFX9_4_GENERIC,
0113   GFX940,
0114   GFX941,
0115   GFX942,
0116   GFX950,
0117   GFX10_1_GENERIC,
0118   GFX1010,
0119   GFX1011,
0120   GFX1012,
0121   GFX1013,
0122   GFX10_3_GENERIC,
0123   GFX1030,
0124   GFX1031,
0125   GFX1032,
0126   GFX1033,
0127   GFX1034,
0128   GFX1035,
0129   GFX1036,
0130   GFX11_GENERIC,
0131   GFX1100,
0132   GFX1101,
0133   GFX1102,
0134   GFX1103,
0135   GFX1150,
0136   GFX1151,
0137   GFX1152,
0138   GFX1153,
0139   GFX12_GENERIC,
0140   GFX1200,
0141   GFX1201,
0142   AMDGCNSPIRV,
0143   Generic, // A processor model named 'generic' if the target backend defines a
0144            // public one.
0145   LAST,
0146 
0147   CudaDefault = OffloadArch::SM_52,
0148   HIPDefault = OffloadArch::GFX906,
0149 };
0150 
0151 enum class CUDAFunctionTarget {
0152   Device,
0153   Global,
0154   Host,
0155   HostDevice,
0156   InvalidTarget
0157 };
0158 
0159 static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
0160   return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
0161 }
0162 
0163 static inline bool IsAMDOffloadArch(OffloadArch A) {
0164   // Generic processor model is for testing only.
0165   return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
0166 }
0167 
0168 const char *OffloadArchToString(OffloadArch A);
0169 const char *OffloadArchToVirtualArchString(OffloadArch A);
0170 
0171 // The input should have the form "sm_20".
0172 OffloadArch StringToOffloadArch(llvm::StringRef S);
0173 
0174 /// Get the earliest CudaVersion that supports the given OffloadArch.
0175 CudaVersion MinVersionForOffloadArch(OffloadArch A);
0176 
0177 /// Get the latest CudaVersion that supports the given OffloadArch.
0178 CudaVersion MaxVersionForOffloadArch(OffloadArch A);
0179 
0180 //  Various SDK-dependent features that affect CUDA compilation
0181 enum class CudaFeature {
0182   // CUDA-9.2+ uses a new API for launching kernels.
0183   CUDA_USES_NEW_LAUNCH,
0184   // CUDA-10.1+ needs explicit end of GPU binary registration.
0185   CUDA_USES_FATBIN_REGISTER_END,
0186 };
0187 
0188 CudaVersion ToCudaVersion(llvm::VersionTuple);
0189 bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
0190 bool CudaFeatureEnabled(CudaVersion, CudaFeature);
0191 
0192 } // namespace clang
0193 
0194 #endif