169 lines · cpp
1#include "clang/Basic/Cuda.h"2 3#include "llvm/ADT/Twine.h"4#include "llvm/Support/ErrorHandling.h"5#include "llvm/Support/VersionTuple.h"6 7namespace clang {8 9struct CudaVersionMapEntry {10 const char *Name;11 CudaVersion Version;12 llvm::VersionTuple TVersion;13};14#define CUDA_ENTRY(major, minor) \15 { \16 #major "." #minor, CudaVersion::CUDA_##major##minor, \17 llvm::VersionTuple(major, minor) \18 }19 20static const CudaVersionMapEntry CudaNameVersionMap[] = {21 CUDA_ENTRY(7, 0),22 CUDA_ENTRY(7, 5),23 CUDA_ENTRY(8, 0),24 CUDA_ENTRY(9, 0),25 CUDA_ENTRY(9, 1),26 CUDA_ENTRY(9, 2),27 CUDA_ENTRY(10, 0),28 CUDA_ENTRY(10, 1),29 CUDA_ENTRY(10, 2),30 CUDA_ENTRY(11, 0),31 CUDA_ENTRY(11, 1),32 CUDA_ENTRY(11, 2),33 CUDA_ENTRY(11, 3),34 CUDA_ENTRY(11, 4),35 CUDA_ENTRY(11, 5),36 CUDA_ENTRY(11, 6),37 CUDA_ENTRY(11, 7),38 CUDA_ENTRY(11, 8),39 CUDA_ENTRY(12, 0),40 CUDA_ENTRY(12, 1),41 CUDA_ENTRY(12, 2),42 CUDA_ENTRY(12, 3),43 CUDA_ENTRY(12, 4),44 CUDA_ENTRY(12, 5),45 CUDA_ENTRY(12, 6),46 CUDA_ENTRY(12, 8),47 CUDA_ENTRY(12, 9),48 {"", CudaVersion::NEW, llvm::VersionTuple(std::numeric_limits<int>::max())},49 {"unknown", CudaVersion::UNKNOWN, {}} // End of list tombstone.50};51#undef CUDA_ENTRY52 53const char *CudaVersionToString(CudaVersion V) {54 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)55 if (I->Version == V)56 return I->Name;57 58 return CudaVersionToString(CudaVersion::UNKNOWN);59}60 61CudaVersion CudaStringToVersion(const llvm::Twine &S) {62 std::string VS = S.str();63 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)64 if (I->Name == VS)65 return I->Version;66 return CudaVersion::UNKNOWN;67}68 69CudaVersion ToCudaVersion(llvm::VersionTuple Version) {70 for (auto *I = CudaNameVersionMap; I->Version != CudaVersion::UNKNOWN; ++I)71 if (I->TVersion == Version)72 return I->Version;73 return CudaVersion::UNKNOWN;74}75 76CudaVersion MinVersionForOffloadArch(OffloadArch A) {77 if (A == OffloadArch::UNKNOWN)78 return CudaVersion::UNKNOWN;79 80 // AMD GPUs do not depend on CUDA versions.81 if (IsAMDOffloadArch(A))82 return CudaVersion::CUDA_70;83 84 switch (A) {85 case OffloadArch::SM_20:86 case OffloadArch::SM_21:87 case OffloadArch::SM_30:88 case OffloadArch::SM_32_:89 case OffloadArch::SM_35:90 case OffloadArch::SM_37:91 case OffloadArch::SM_50:92 case OffloadArch::SM_52:93 case OffloadArch::SM_53:94 return CudaVersion::CUDA_70;95 case OffloadArch::SM_60:96 case OffloadArch::SM_61:97 case OffloadArch::SM_62:98 return CudaVersion::CUDA_80;99 case OffloadArch::SM_70:100 return CudaVersion::CUDA_90;101 case OffloadArch::SM_72:102 return CudaVersion::CUDA_91;103 case OffloadArch::SM_75:104 return CudaVersion::CUDA_100;105 case OffloadArch::SM_80:106 return CudaVersion::CUDA_110;107 case OffloadArch::SM_86:108 return CudaVersion::CUDA_111;109 case OffloadArch::SM_87:110 return CudaVersion::CUDA_114;111 case OffloadArch::SM_89:112 case OffloadArch::SM_90:113 return CudaVersion::CUDA_118;114 case OffloadArch::SM_90a:115 return CudaVersion::CUDA_120;116 case OffloadArch::SM_100:117 case OffloadArch::SM_100a:118 case OffloadArch::SM_101:119 case OffloadArch::SM_101a:120 case OffloadArch::SM_120:121 case OffloadArch::SM_120a:122 return CudaVersion::CUDA_128;123 case OffloadArch::SM_103:124 case OffloadArch::SM_103a:125 case OffloadArch::SM_121:126 case OffloadArch::SM_121a:127 return CudaVersion::CUDA_129;128 default:129 llvm_unreachable("invalid enum");130 }131}132 133CudaVersion MaxVersionForOffloadArch(OffloadArch A) {134 // AMD GPUs do not depend on CUDA versions.135 if (IsAMDOffloadArch(A))136 return CudaVersion::NEW;137 138 switch (A) {139 case OffloadArch::UNKNOWN:140 return CudaVersion::UNKNOWN;141 case OffloadArch::SM_20:142 case OffloadArch::SM_21:143 return CudaVersion::CUDA_80;144 case OffloadArch::SM_30:145 case OffloadArch::SM_32_:146 return CudaVersion::CUDA_102;147 case OffloadArch::SM_35:148 case OffloadArch::SM_37:149 return CudaVersion::CUDA_118;150 default:151 return CudaVersion::NEW;152 }153}154 155bool CudaFeatureEnabled(llvm::VersionTuple Version, CudaFeature Feature) {156 return CudaFeatureEnabled(ToCudaVersion(Version), Feature);157}158 159bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) {160 switch (Feature) {161 case CudaFeature::CUDA_USES_NEW_LAUNCH:162 return Version >= CudaVersion::CUDA_92;163 case CudaFeature::CUDA_USES_FATBIN_REGISTER_END:164 return Version >= CudaVersion::CUDA_101;165 }166 llvm_unreachable("Unknown CUDA feature.");167}168} // namespace clang169